每分钟刷新PyGTK窗口?

时间:2014-06-24 18:57:23

标签: multithreading python-2.7 gtk pygtk

我有一个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语句时,看起来它只是在窗口移动时执行脚本。

任何人都知道如何修复它?


附加信息:我意识到它只在有信号时处理刷新。

3 个答案:

答案 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即可停止。