我有一个PyGTK
应用,应该是某些数据源的桌面显示器。我几乎完成了,但只有这一个自动刷新的问题。
在我的程序中,我希望它从数据库中获取数据并每分钟刷新一次窗口。这是我对刷新功能的看法(现在每秒刷新一次以进行测试):
def refresh(self):
cnxn = pyodbc.connect(r'Driver={SQL Server};Server=IL1WP0550DB;Database=Customer_Analytics;Trusted_Connection=yes;')
cursor = cnxn.cursor()
cursor.execute("SELECT * FROM TestGroup_test_group_result")
data = []
while 1:
row = cursor.fetchone()
if not row:
break
#data.append([row.TestGroupName, row.PWF, row.Expires, row.TestGroupID])
data.append([str(datetime.now()), row.PWF, row.Expires, row.TestGroupID])
cnxn.close()
self.fill_text(data)
threading.Timer(1, self.refresh).start()
使用此功能我可以更新我的窗口,但它只在我拖动窗口时才有效。当我放置一系列print
语句时,看起来它只是在窗口移动时执行脚本。
任何人都知道如何修复它?
附加信息:我意识到它只在有信号时处理刷新。
答案 0 :(得分:2)
使用GTK,您需要确保您的小部件仅从主线程更新。您可以使用gtk.timeout_add()
或gtk.timeout_add_seconds()
的超时功能来执行此操作。如果使用python的线程函数,则不会从主线程更新窗口小部件,因此它不起作用。对于超过一秒的超时,您应该使用gtk.timeout_add_seconds()
,因为它可以避免不必要的唤醒,其中时间不是那么重要。
答案 1 :(得分:0)
使用gtk.timeout_add(1000, self.refresh)
代替threading.Timer(1, self.refresh).start()
做了诀窍:)
虽然不知道为什么
答案 2 :(得分:0)
python3:
from gi.repository import GObject
def refresh_data(self):
[do stuff here]
if self.running:
GObject.timeout_add(1000, self.refresh_data)
将self.running设置为False即可停止。