从数据库中动态检索到tkinter gui

时间:2015-08-30 13:00:36

标签: python tkinter

我是python tkinter中gui开发的新手。我想要做的只是听数据库表,当有插入时我只想在gui中显示它。目前我有以下代码不起作用:

from Tkinter import *;
from db.Database import Database
import time

root = Tk();

topFrame = Frame(root)
topFrame.pack()
bottomFrame = Frame(root)
bottomFrame.pack(side=BOTTOM)
logLabel = Label(topFrame, text="Log")
logField = Text(topFrame,bd=5)
logLabel.pack(side=LEFT)
logField.pack(side=LEFT)

d = Database(user='test',password='test',db='test')
prev = d.getLastLog()
logField.insert('1.0',str(prev)+'.\n')

root.mainloop()


while True:
    log = d.getLastLog()
    if (log[0] != prev[0]):
        logField.config(state=NORMAL)
        logField.insert('1.0',str(log)+'.\n')
        logField.config(state=DISABLED)
        prev = log
    time.sleep(1)

2 个答案:

答案 0 :(得分:3)

tkinter法术while True: ... time.sleep(n)的方式为def callback(): ... root.after(n*1000, callback) + def之后的额外跟注。在你的情况下:

interval = 1000 # 1 second
def update():
    log = d.getLastLog()
    if (log[0] != prev[0]):
        logField.config(state=NORMAL)
        logField.insert('1.0',str(log)+'.\n')
        logField.config(state=DISABLED)
        prev = log
    root.after(interval, update)
root.after(interval, update)

在root.mainloop调用之前放置它。对于另一个(测试的)示例,请参阅我今天早些时候发布的similar answer

答案 1 :(得分:1)

潜在的问题是

root.mainloop()
在根窗口关闭或销毁之前,

不会返回。因此,您必须将轮询间隔转换为mainloop可以像处理任何其他UI事件一样处理的重复事件。在这种情况下,@ TerryJanReedy写了一个很好的答案,解释了如何但不是原因。太重新回顾其他答案的核心:

def update():
    # read database and update tkinter widgets
    # then reset the timer callback 
    root.after(interval, update)

root.after(interval, update) # kickstart the update loop
root.mainloop()