运行时,Tkinter窗口无法正确更新

时间:2018-06-14 07:21:22

标签: python-3.x tkinter

我试图让Tkinter窗口显示更新的数据,但它只在13秒后弹出,只有最后一个值。我希望它弹出并更改屏幕上的值。请注意,此代码的主要目标是从数据库中获取数据(每3秒更新一次)并在屏幕上显示数据,同时连续运行,因此如果答案可能包含一些关于""" ;或者"更新"功能,将不胜感激!

这是我到目前为止所拥有的。

from tkinter import *
import time


class GUI(Tk):

    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        Tk.wm_title(self, "Main Window")
        self.container = Frame(self)
        self.container.pack(side=TOP, fill=BOTH, expand=TRUE)

        self.container.grid_rowconfigure(0, weight=1)
        self.container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        self.frame = StartPage(self.container, self)
        self.frames[StartPage] = self.frame
        self.frame.grid(row=0, column=0, sticky=NSEW)
        self.show_frame(StartPage)

    def show_frame(self, controller):
        frame = self.frames[controller]
        frame.tkraise()


class StartPage(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.label = Label(self, text="Current ID:\n")
        self.label.pack(padx=10, pady=10)
        self.data_label = Label(self)
        self.data_label.pack()
        self.update_data()

    def update_data(self):
        var1 = StringVar()
        for i in range(10):
            var1.set(str(i))
            self.data_label.config(text=str(i))
            time.sleep(1)


main = GUI()
main.mainloop()

1 个答案:

答案 0 :(得分:0)

我可以给你一个部分答案。您没有看到任何更新的原因是time.sleep()暂停了该过程,并且不允许tkinter重新绘制窗口。

您没有正确使用标签textvariable。在标签中指定它,标签将在您更改textvariable时更改。

您同时使用包和网格可能会导致问题。

之前我没有在课堂上使用after()所以我不知道如何使用它,但这个例子应该给你一些指示。我在代码中保留了控制台打印输出,以便我可以看到它的作用。

from tkinter import *
import time


class GUI(Tk):

    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        Tk.wm_title(self, "Main Window")
        self.container = Frame(self)
        self.container.pack(side=TOP, fill=BOTH, expand=TRUE)

        self.frames = {}
        self.frame = StartPage(self.container, self)
        self.frames[StartPage] = self.frame
        self.frame.pack(side=TOP, fill=BOTH, expand=TRUE)
        self.show_frame(StartPage)

    def show_frame(self, controller):
        frame = self.frames[controller]
        frame.tkraise()
        frame.update_data()
        print('Done')


class StartPage(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.parent = parent
        self.label = Label(self, text="Current ID:\n")
        self.label.pack(padx=10, pady=10)
        self.var1 = StringVar()
        self.data_label = Label(self, textvariable=self.var1)
        self.data_label.pack()
        self.update_idletasks() # Calls all pending idle tasks

    def update_data(self):
        if not self.var1.get(): self.var1.set('0')

        iteration = int(self.var1.get())
        print('iteration', iteration)

        if iteration < 3:
            iteration = iteration + 1
            self.var1.set(str(iteration))
            self.update_idletasks() # Calls all pending idle tasks
            time.sleep(1)
            self.update_data()


main = GUI()
main.mainloop()

您必须自己研究after(),因为我无法为您提供帮助。