Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 小部件如何在Tkinter中更新?_Python_User Interface_Tkinter_Widget - Fatal编程技术网

Python 小部件如何在Tkinter中更新?

Python 小部件如何在Tkinter中更新?,python,user-interface,tkinter,widget,Python,User Interface,Tkinter,Widget,好吧,我只是想澄清一下为什么我的代码不能像我想象的那样工作 我正在构建一个GUI,我想用一个文本变量在标签上显示文本。我已经做了一个函数,在调用该函数时更新标签,但这当然不是我的问题 我的问题源于我试图实现“一次打印一个字母”类型的标签。虽然它以我希望的方式打印到终端,但标签小部件仅在整个功能完成后更新(视觉上与只打印整个字符串相同,而不是一次打印一个字母) 那么我错过了什么,我不明白什么?你们能帮帮我吗?让我发布一些代码,这样你们可以看到我的错误在哪里 我独立地尝试了这两种方法,结果都是一样的

好吧,我只是想澄清一下为什么我的代码不能像我想象的那样工作

我正在构建一个GUI,我想用一个文本变量在
标签上显示文本。我已经做了一个函数,在调用该函数时更新标签,但这当然不是我的问题

我的问题源于我试图实现“一次打印一个字母”类型的标签。虽然它以我希望的方式打印到终端,但标签小部件仅在整个功能完成后更新(视觉上与只打印整个字符串相同,而不是一次打印一个字母)

那么我错过了什么,我不明白什么?你们能帮帮我吗?让我发布一些代码,这样你们可以看到我的错误在哪里

我独立地尝试了这两种方法,结果都是一样的,这不是我想要的

def进料器(短语):
“”“获取字符串并显示类似于视频游戏对话框的内容。”“”
message=“”
对于短语中的字母:
时间。睡眠(.15)
信息+=信件
信息集(消息)
#打印消息
def馈线2(短语):
“”“与feeder相同,但正在尝试递归”“”
当前索引+=1

如果current.index则每次进入事件循环时,UI都会更新。这是因为绘制是通过事件完成的(也称为“空闲任务”,因为它们是在UI空闲时完成的)

您的问题是:当您编写循环并执行
time.sleep
时,在该循环运行时不会进入事件循环,因此不会发生重绘

你至少可以用几种不同的方法来解决你的问题。首先,您可以调用
update\u idletasks
,这将刷新屏幕。这将解决重新绘制问题,但由于您正在睡眠,UI在循环期间将无响应(因为按钮和按键不是“空闲任务”)

另一个解决方案是编写一个函数,该函数接受一个字符串,从字符串中提取一个字符并将其添加到小部件中。然后它安排自己通过事件循环再次被调用。例如:

将Tkinter作为tk导入
类应用程序(tk.tk):
定义初始化(self,*args,**kwargs):
tk.tk.\uuuuu初始化(self,*args,**kwargs)
self.label=tk.label(self,text=”“,width=20,anchor=“w”)
self.label.pack(side=“top”,fill=“both”,expand=True)
self.慢慢打印标签(“你好,世界!”)
def缓慢打印标签(自我,信息):
''使用事件循环每次打印一个字符的标签''
t=self.label.cget(“文本”)
t+=消息[0]
self.label.config(text=t)
如果len(消息)>1:
self.after(500,self.print_label_缓慢,消息[1:])
app=app()
app.mainloop()
这种类型的解决方案保证UI在循环中运行代码的同时保持响应性。只是,不要使用显式循环,而是将工作添加到已经运行的事件循环中