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()
我正在尝试从 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()