如何在py-gtk窗口中显示连续数据?

时间:2012-08-05 20:47:02

标签: python time pygtk

我正在尝试使用py-gtk构建一个简单的秒表应用程序。这是我的秒表窗口中切换按钮的回调函数。

def start(self,widget):
    if widget.get_active():         
        widget.set_label('Stop')
    else: 
        self.entry.set_text(str(time.time() - s))   
        widget.set_label('Start')

除了时间不会持续显示在条目小部件中之外,它的效果非常好。如果我在'If'条件中添加无限while循环,例如

while 1:
    self.entry.set_text(str(time.time() - s))

窗口变得反应​​迟钝。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

使用gobject.timeout_add

gobject.timeout_add(500, self.update)

每500毫秒有一次gtk调用self.update()

update方法中检查秒表是否处于活动状态并调用

self.entry.set_text(str(time.time() - s))   

必要时。


以下是使用gobject.timeout_add绘制进度条的相当简短的示例:

import pygtk
pygtk.require('2.0')
import gtk
import gobject
import time

class ProgressBar(object):
    def __init__(self):
        self.val = 0
        self.scale = gtk.HScale()
        self.scale.set_range(0, 100)
        self.scale.set_update_policy(gtk.UPDATE_CONTINUOUS)
        self.scale.set_value(self.val)
        gobject.timeout_add(100, self.timeout)
    def timeout(self):
        self.val += 1
        # time.sleep(1)
        self.scale.set_value(self.val)
        return True

def demo_timeout_add():
    # http://faq.pygtk.org/index.py?req=show&file=faq23.020.htp
    # http://stackoverflow.com/a/497313/190597
    win = gtk.Window()
    win.set_default_size(300, 50)
    win.connect("destroy", gtk.main_quit)
    bar = ProgressBar()
    win.add(bar.scale)
    win.show_all()
    gtk.main()

demo_timeout_add()