创建在 gtk 中自动更新的小部件,同时仍然能够控制其他小部件

2023-12-30

好吧,在我学习更多 Python 的过程中的一个副项目中,我一直在尝试构建一个 gtk 应用程序来监控水温并以 10 秒的间隔更新 gtk 应用程序中的文本框。我还希望能够有一个倒计时器,可以在 gtk 中显示,同时每秒刷新一次。我有一个使用 Glade 和 gtk 构建的 GUI,但遇到了应用程序锁定并变得无响应的问题。经过一番阅读后,我发现我必须使用线程。我不知道我在做什么,当涉及到线程时,我想也许这里有人可以帮助我。我真的很想看看在使用 gtk 和 Glade 作为 GUI 构建器时如何使用线程。我发现这段代码使用 gtk 但我仍然遇到问题。我可以寻求帮助吗?

import sys
import time
import gtk

from threading import Thread

threadcount=0

class Test (Thread):
    def __init__ (self,button, count=0):
        Thread.__init__(self)
        self.count = count
        self.button=button

    def run (self):
        for i in range(0,10):
            time.sleep(1)
            # Acquire and release the lock each time.
            gtk.threads_enter()
            self.button.set_label("Thread %002d - %d" % (self.count,i))
            gtk.threads_leave()
        gtk.threads_enter()
        self.button.set_label("  Start Thread  ")
        gtk.threads_leave()

def start_new_thread (button, data=None):
    global threadcount
    threadcount += 1
    a = Test(button,threadcount)
    a.start()


def hello(*args):
    """ Callback function that is attached to the button """
    print "Hello World"
    window.destroy()

def destroy(*args):
    """ Callback function that is activated when the program is destoyed
"""
    window.hide()
    gtk.main_quit()

# Initialize threads
gtk.threads_init()

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("destroy", destroy)
window.set_border_width(10)

button = gtk.Button("  Start Thread  ")
button.connect("clicked", start_new_thread,button)
window.add(button)
button.show()

window.show_all()
gtk.threads_enter()
gtk.main()
gtk.threads_leave()

这是我尝试使用的代码,该代码被精简为仅计时器函数。我不知道如何让一切正常运转。我读过一些关于 gobjects 的内容,但我对此知之甚少。

import gtk
import time
import sys
import os
import threading

TIME = 0
LOCK = threading.Lock()

class Timer(threading.Thread):
    def __init__(self, nMinutes):
        threading.Thread.__init__(self)
        self.nMin = nMin
    def run(self):
        global TIME
        nSeconds = self.nMinutes*60
        TIME = nSeconds
        startTime = time.time()
        while TIME != 0:
            ElapTime = time.time() - startTime
            LOCK.acquire()
            TIME = nSeconds - ElapTime
            LOCK.release()

class GUI_Timer_Update(threading.Thread):
    def __init__(self, TIME):
        threading.Thread.__init__(self)
        self.TIME = TIME
    def run(self):
        while TIME != 0:
            timeFormatted = self.format_time(TIME)
            LOCK.acquire()
            # Code that updates the GUI after formatting it
            LOCK.release()


    def format_time(self, x):
        minutes, seconds_rem = divmod(x, 60)
        if minutes >= 60:
            hours, minutes_rem = divmod(minutes, 60)
            return "%02d:%02d:%02d" % (hours, minutes_rem, seconds_rem)
        else:
            minutes, seconds_rem = divmod(x, 60)
            return "00:%02d:%02d" % (minutes, seconds_rem)

class GUI(object):
    def __init__(self):
        self.builder = gtk.Builder()
        self.builder.add_from_file("Timer.glade")
        self.window1 = self.builder.get_object("window1")
        self.window1.show()
        self.builder.connect_signals(self)

    def on_window1_destroy(self, object, data=None):
        print "quit on destroy"
        gtk.main_quit()

    def on_startTimer_clicked(self, widget):
        self.timer = self.builder.get_object("timer").get_text() # get time in minutes from timer text box 
        self.timer = int(self.timer) # convert the text to an int

    def on_timerReset_clicked(self, widget):
        self.builder.get_object("timer").set_text('')
        self.builder.get_object("TIME").set_text('')

    def main(self):
        gtk.main()  


if __name__ == "__main__":
    gui = GUI()
    gui.main()

我还想添加一个停止/暂停按钮。任何帮助,将不胜感激。谢谢


好的,我已将代码编辑为以下内容:

import gtk, time, sys, os, gobject

COUNTER = 0
COUNTER2 = 0

class GUI(object):
    def __init__(self):
        self.builder = gtk.Builder()
        self.builder.add_from_file("Timer.glade")
        self.window1 = self.builder.get_object("window1")
        self.window1.show()
        self.builder.connect_signals(self)
        self.g = 0

    def on_window1_destroy(self, object, data=None):
        print "quit on destroy"
        gtk.main_quit()

    def on_startTimer_clicked(self, widget):
        global COUNTER
        self.time = self.builder.get_object("time").get_text()
        COUNTER = int(self.time)
        self.g = gobject.timeout_add(1000, self.timer)


    def on_startTimer2_clicked(self, widget):
        global COUNTER2
        self.time2 = self.builder.get_object("time2").get_text()
        COUNTER2 = int(self.time2)
        self.g2 = gobject.timeout_add(1000, self.timer2)

    def timer2(self):
        global COUNTER2
        while COUNTER2 >= 0:
            if COUNTER2 != 0:
                self.builder.get_object("time2").set_text(str(self.format_time(COUNTER2)))
                COUNTER2 -=1
                return True
            else:
                self.builder.get_object("time2").set_text("Finished")
                return False

    def timer(self):
        global COUNTER
        while COUNTER >= 0:
            if COUNTER != 0:
                self.builder.get_object("time").set_text(str(self.format_time(COUNTER)))
                COUNTER -=1
                return True
            else:
                self.builder.get_object("time").set_text("Finished")
                return False


    def format_time(self, x):
        minutes, seconds_rem = divmod(x, 60)
        if minutes >= 60:
            hours, minutes_rem = divmod(minutes, 60)
            return "%02d:%02d:%02d" % (hours, minutes_rem, seconds_rem)
        else:
            minutes, seconds_rem = divmod(x, 60)
            return "00:%02d:%02d" % (minutes, seconds_rem)



    def main(self):
        gtk.main()  


if __name__ == "__main__":
    gui = GUI()
    gui.main()

这个视频系列 http://www.youtube.com/watch?v=rYsTrTWF438让我了解如何使用 gobject.timeout_add()。感谢用户4815162342的建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建在 gtk 中自动更新的小部件,同时仍然能够控制其他小部件 的相关文章

随机推荐

  • 在 MinGW 上的 GDB 中,如何让 Ctrl-C 停止程序?

    I m on Windows running GDB on an executable built under MinGW The program has an infinite loop I want to find it by hitt
  • Git origin/HEAD 参考仍然过时,导致 git fetch 来回跳动

    我在我的 Git 存储库之一中发现了奇怪的行为 克隆后不久 我看到了这种情况 git show ref 06e26a871527e0a5dfaffa3d01887448939fb621 refs heads master 06e26a871
  • 将索引选定的 numpy 数组添加到另一个具有重叠索引的 numpy 数组

    我有两个 numpy 数组image and warped image和索引数组ix iy 我需要添加image to warped image这样image i j 被添加到warped image iy i j ix i j 如果成对
  • 队列 上的原子操作?

    我应该在 Visual C 中实现一个带有队列的类 在这个队列中我必须执行原子操作 在网上搜索 我找到了 std atomic 类 但我保留了一些问题 第一个是 它们之间有什么区别 A atomic
  • 进度搜索栏通知未显示在 DownloadManager android 中

    我正在从 webview 下载文件 但它没有显示类似于以下内容的正在进行的下载通知this https i stack imgur com RW8v6 jpg使用下载管理器时 它只是在后台运行 如何在下载过程中显示状态栏通知 我可以获取下载
  • 使用 JNI 将字符串数组从 java 传递到 C

    我有一个像这样的字符串数组 myname yourname hisname 我正在尝试将此数组发送到C与使用JNI 我找不到任何明确的解决方案 我试图把这个字符串作为chararray但没有成功 有没有办法做到这一点 您可以编写一个简单的函
  • 用Delphi查找系统字体

    查找用户可用的所有系统字体以便将它们显示在下拉选择框中的最佳方法是什么 我还想区分 Unicode 和非 Unicode 字体 我正在使用完全支持 Unicode 的 Delphi 2009 并且想要一个 Delphi 解决方案 The S
  • res.redirect() 在 Node.js 中对我不起作用

    我正在尝试发布 draft 请求并创建一个新的 草稿 更新我的数据库中的现有草稿 之后我想立即重定向到 draft id RELEVANT ID HERE 页面 这是我当前的 POST 请求功能 app post draft functio
  • COLOR_ATTACHMENT's - 如何将多个纹理渲染为帧缓冲区对象内的颜色附件?

    我正在尝试渲染多个纹理COLOR ATTACHMENT没有成功 我从显示它们中得到的只是黑屏 带有红色透明填充 这意味着我的纹理已读取但为 空 我的伪代码是 将 3 个纹理附加到 FBO 纹理索引分别为 1 2 和 3 颜色附件分别为 0
  • 更改 Magento 中结账按钮的显示顺序

    我需要按顺序在购物车页面中放置结账按钮 1 Proceed to checkout 2 Google checkout 3 Paypal Express 结帐 xml 里面
  • PHP - 编辑 zip 存档中的文件并在关闭前另存为另一个存档名称

    我有一个 Microsoft Word 文件 用作模板 testingsample docx 该计划是使用表单输入值来创建租赁协议 我在下面找到的代码非常适合打开 docx 文件并查找和替换所需的字符串 问题是它只能工作一次 第一次运行时
  • Safari 中的 EventTarget 接口

    我开始延长EventTarget界面中添加一些有用的prototypes但后来我在 Safari 8 上测试了它并得到 Error ReferenceError Can t find variable EventTarget 我发现MDN
  • 谷歌日历 API 与 PHP

    我需要集成谷歌日历 API 以在我的 php 网站中显示登录用户谷歌日历 其功能与谷歌日历中的所有功能相同 有什么可能的方法来做到这一点 目前正在处理这个https developers google com google apps cal
  • 多线程GUI编程需求说明

    我正在寻找关于在图形应用程序中使用多线程的必要性的良好解释 在下面的示例中使用了Python 但问题不是Python特定的 它可能适用于任何语言的图形编程的一般设计 让我们举一个简单的例子 假设有一个应用程序对一组文件执行某种耗时的操作 并
  • 如何强制 Visual Studio 使用 x64 DNX SDK 架构

    我使用的是 1 0 0 beta7 x64 但视觉工作室坚持我使用的是 x86 当我删除除目标运行时之外的所有运行时时 我得到以下信息 我在项目中的任何地方都找不到 x86 的引用 当我将鼠标悬停在此处的解决方案 DNX SDK 版本上时
  • 使用 cron 作业删除日志文件

    你好 我想从文件夹中删除过去 7 天的所有日志文件 但保留所有其他文件 我可以使用下面的命令吗 如何指定它只删除扩展名为 log 的文件 find path to file mtime 7 exec rm f 我是否需要将此命令写入某个文件
  • 防止 pytest 中长字符串被截断

    我使用 pytest 编写了一个测试工具 用于对我们的代码进行系统测试 这些测试在我们的持续集成系统中使用 因此我使用 junit xml 输出选项 pytest 截断长字符串给我带来了问题 我知道我可以使用 vv 选项来阻止它 但是这会为
  • 实体框架 5 为表指定多个标识列。每个表只允许有一个标识列

    我正在创建此模型作为我的代码优先实体框架的一部分 public class NewUserRegistration Key public int NewUserRegistrationId get set 使用Update Database
  • 半透明/透明状态栏+CoordinatorLayout+工具栏+Fragment

    我有以下设置 我正在使用 AppCompat MainActivity 包含一个片段并有一个工具栏 向下滚动时会隐藏 Fragment with RecyclerView 所有适合屏幕的视图都有相应的android fitsSystemWi
  • 创建在 gtk 中自动更新的小部件,同时仍然能够控制其他小部件

    好吧 在我学习更多 Python 的过程中的一个副项目中 我一直在尝试构建一个 gtk 应用程序来监控水温并以 10 秒的间隔更新 gtk 应用程序中的文本框 我还希望能够有一个倒计时器 可以在 gtk 中显示 同时每秒刷新一次 我有一个使