Python 中的循环标签更新

Cyclic label update in Python

我正在尝试从 Python 中的 Web 服务获取动态循环(每半秒)标签更新,在其中我将 JSON 字符串和 return 其内容解析为GUI(使用 Glade 3.8.1 制作)。

我从一个基本示例开始,到目前为止我编写的代码如下所示:

import sys
import json
import urllib2
import time

try:
    import pygtk
    pygtk.require("2.0")
except:
    pass
try:
    import gtk.glade
    import gtk
except:
    sys.exit(1)

class cRioHMI():

    def on_MainWindow_destroy(self, data = None):
        print "quit with cancel"
        gtk.main_quit()

    def on_gtk_quit_activate(self, data = None):
        print "quit from menu"
        gtk.main_quit()

    def on_btnTest_clicked(self, widget):
        print "Button Pressed"

    def on_gtk_about_activate(self, data = None):
        print "About Page Accessed"
        self.response = self.about.run()
        self.about.hide()

    def __init__(self):

        self.gladefile = "Assets/HMI.glade"
        self.builder = gtk.Builder()
        self.builder.add_from_file(self.gladefile)
        self.builder.connect_signals(self)
        self.window = self.builder.get_object("MainWindow")
        self.about = self.builder.get_object("AboutDialogue")
        self.templable = self.builder.get_object("lbl_Temperature")
        self.window.show()

    def update_Values(self, data = None):
        response = urllib2.urlopen('http://10.10.10.11:8001/WebUI/Temperatures/GetTemperatures')
        data = json.load(response)
        temperature = data['Temperature2'][1]
        self.templable.set_text(str(temperature))
        time.sleep(.5)




if __name__ == "__main__":
    HMI = cRioHMI()
    gtk.main()

当我在单击事件上使用 update_Values 方法中的代码时,代码按预期执行

    def on_btnTest_clicked(self, widget):
    response = urllib2.urlopen('http://10.10.10.11:8001/WebUI/Temperatures/GetTemperatures')
    data = json.load(response)
    temperature = data['Temperature2'][1]
    self.templable.set_text(str(temperature))
    time.sleep(.5)
    print "Button Pressed"

最好的方法是什么?请注意,我是 python.

的新手

您可以使用 gobject.timeout_add(参见文档 here)。

所以在你的 __init__ 中你会得到类似 gobject.timeout_add(1000, self.updateValues) 的东西。如果你 return False 超时将不会被再次调用。

您也不应该使用 time.sleep。这是一个阻塞调用。这意味着您的 GUI 将冻结,因为它无法处理传入的事件。如果花费太多时间,urllib2.urlopen 调用也会发生同样的事情。为防止这种情况,您可以 运行 在单独的线程中更新值。然后你将不得不使用 gobject.idle_add 来设置标签的文本(参见 documentation)。

这是一个小例子。它只是一个计数器(并且不需要线程)但我标记了你的 urllib2.urlopen 会去的地方并附上评论:

#!/usr/bin/env python2

from threading import Thread
from pygtk import gtk, gobject

class Window(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.connect('delete-event', gtk.main_quit)
        self.label = gtk.Label('1')
        self.add(self.label)
        gobject.timeout_add_seconds(1, self.threaded)

    def threaded(self):
        thread = Thread(target=self.updateValues)
        thread.start()
        return True

    def updateValues(self):
        # urllib.urlopen calls
        n = int(self.label.get_text())
        gobject.idle_add(self.label.set_text, str(n + 1))

win = Window()
win.show_all()
gobject.threads_init()
gtk.main()