Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Tkinter窗口在运行时未正确更新_Python 3.x_Tkinter - Fatal编程技术网

Python 3.x Tkinter窗口在运行时未正确更新

Python 3.x Tkinter窗口在运行时未正确更新,python-3.x,tkinter,Python 3.x,Tkinter,我试图让Tkinter窗口显示更新的数据,但它只在13秒后弹出,只有最后一个值。我希望它弹出并更改屏幕上的值。请注意,这段代码的主要目标是从数据库中获取数据(每3秒更新一次)并在屏幕上显示数据,同时连续运行,因此如果答案可以包括“之后”或“更新”函数上的一些指针,我们将不胜感激 这是我到目前为止所拥有的 from tkinter import * import time class GUI(Tk): def __init__(self, *args, **kwargs):

我试图让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()

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

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

同时使用pack和grid可能会导致问题

我以前没有在类中使用过
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()
从tkinter导入*
导入时间
类GUI(Tk):
定义初始化(self,*args,**kwargs):
Tk.\uuuuu初始值(self,*args,**kwargs)
Tk.wm_标题(自,“主窗口”)
self.container=Frame(self)
self.container.pack(side=TOP,fill=BOTH,expand=TRUE)
self.frames={}
self.frame=起始页(self.container,self)
self.frames[起始页]=self.frames
self.frame.pack(side=TOP,fill=BOTH,expand=TRUE)
自显示帧(起始页)
def显示画面(自身、控制器):
帧=自身帧[控制器]
frame.tkraise()
frame.update_data()
打印(‘完成’)
类起始页(帧):
定义初始化(自、父、控制器):
帧。\uuuu初始化(自,父)
self.parent=parent
self.label=标签(self,text=“当前ID:\n”)
self.label.pack(padx=10,pady=10)
self.var1=StringVar()
self.data\u label=label(self,textvariable=self.var1)
self.data_label.pack()
self.update_idletasks()#调用所有挂起的空闲任务
def更新_数据(自身):
如果不是self.var1.get():self.var1.set('0')
迭代=int(self.var1.get())
打印('迭代',迭代)
如果迭代<3:
迭代=迭代+1
self.var1.set(str(迭代))
self.update_idletasks()#调用所有挂起的空闲任务
时间。睡眠(1)
self.update_data()
main=GUI()
main.mainloop()

你必须自己研究
after()
,因为我帮不了你

因此,如果答案可以包括一些关于“after”或“update”函数的指针,那将是非常感谢的——您似乎完全知道您需要什么。你试过使用这些功能吗?是的,我试过,但没有成功。你让它睡觉,所以它就是这么做的。在这个网站上,有很多很多关于tkinter使用
sleep
的问题。我告诉它sleep的原因是为了在tkinter窗口中看到值的变化谢谢!它会在屏幕上显示值,并按其应该的方式进行更改!我正试图做同样的事情,但是我想在GUI中显示的数据使用元组发送到update_data方法。我怎样才能让它一个接一个地显示元组中的元素呢?元组使用索引,就像列表一样。索引从0开始。因此,为了获得元组中的第二个值
t=(1,2,3,4)
,您可以将其写成
t[1]
。在原始代码中使用
pack
grid
非常好,因为这两个值用于具有不同父级的小部件。