Python 在顶级窗口中调用函数后,如何获取要更新的标签?
我试图在python中构建一个顶级窗口,其中有一个名为“text”的标签。它的文本变量称为“v”。如您所见,dialogueBox()中有3个函数调用。我想让程序做的是让标签“text”显示短语“Event one”,等待一秒钟,显示短语“Event two”,等待一秒钟,然后显示短语“Event three”。没有这样做,而是打开顶层窗口,仅显示“事件三” 我怀疑这是一个lambda问题,但我仍然不知道如何在Tkinter中使用它Python 在顶级窗口中调用函数后,如何获取要更新的标签?,python,tkinter,lambda,Python,Tkinter,Lambda,我试图在python中构建一个顶级窗口,其中有一个名为“text”的标签。它的文本变量称为“v”。如您所见,dialogueBox()中有3个函数调用。我想让程序做的是让标签“text”显示短语“Event one”,等待一秒钟,显示短语“Event two”,等待一秒钟,然后显示短语“Event three”。没有这样做,而是打开顶层窗口,仅显示“事件三” 我怀疑这是一个lambda问题,但我仍然不知道如何在Tkinter中使用它 from tkinter import* import tim
from tkinter import*
import time
def event1():
v.set("Event one")
def event2():
v.set("Event two")
def event3():
v.set("Event three")
def dialogueBox():
top = Toplevel()
global v
top.minsize(400,0)
top.maxsize(700,300)
top.title("Toplevel test")
v = StringVar()
text = Label(top,textvariable = v)
text.pack()
event1()
time.sleep(1)
event2()
time.sleep(1)
event3()
root = Tk()
email = StringVar()
password = StringVar()
title = Label(root,text="Root window",font = 11)
title.pack()
label1 = Label(root,text = "Username")
label1.pack()
field1 = Entry(root,textvariable = email)
field1.pack()
label2 = Label(root,text = "Password")
label2.pack()
field2 = Entry(root,show = "*",textvariable = password)
field2.pack()
button = Button(root,text = "Get data",command = dialogueBox)
button.pack()
root.mainloop()
您非常接近,但最好的选择是使用
after()
方法
这是您修改的代码,添加了注释:
from tkinter import*
import time
def event1():
v.set("Event one")
root.after(1000, event2) # NEW
def event2():
v.set("Event two")
root.after(1000, event3) # NEW
def event3():
v.set("Event three")
def dialogueBox():
top = Toplevel()
global v
top.minsize(400,0)
top.maxsize(700,300)
top.title("Toplevel test")
v = StringVar()
text = Label(top,textvariable = v)
text.pack()
event1()
#time.sleep(1)
#event2()
#time.sleep(1)
#event3()
root = Tk()
email = StringVar()
password = StringVar()
title = Label(root,text="Root window",font = 11)
title.pack()
label1 = Label(root,text = "Username")
label1.pack()
field1 = Entry(root,textvariable = email)
field1.pack()
label2 = Label(root,text = "Password")
label2.pack()
field2 = Entry(root,show = "*",textvariable = password)
field2.pack()
button = Button(root,text = "Get data",command = dialogueBox)
button.pack()
root.mainloop()
唯一真正的变化是使用after
方法从event1()
调用event2()
,从event2()
调用event3()
。通过这些after()
调用,您的对话框()中的最后4行将消失
发生了什么事?Tkinter是一个GUI、事件驱动系统。它不喜欢坐在那里等待任何事情。睡觉时,资源被浪费,GUI无法刷新和更新自身。通过使用after()
方法,GUI可以继续做它最擅长的事情:等待事件和输入。after()
方法将事件安排在以后发生。当该时间到来时,事件将得到处理。after()
的第一个参数是以毫秒为单位的时间延迟。第二个参数是函数名,在指定的时间延迟后调用
现在,我说after()
是最好的选择,但是还有另一种方法可以做到这一点,尽管不那么“礼貌”。您可以将.update()
方法调用添加到对话框()
,如下所示:
def dialogueBox():
top = Toplevel()
global v
top.minsize(400,0)
top.maxsize(700,300)
top.title("Toplevel test")
v = StringVar()
text = Label(top,textvariable = v)
text.pack()
event1()
text.update() # NEW -- RUDE!
time.sleep(1)
event2()
text.update() # NEW -- RUDE!
time.sleep(1)
event3()
.update()
调用粗暴地告诉GUI,“停止您正在做的一切,立即为我执行此操作!”这还将允许您查看事件1、事件2、事件3消息。但是after()
确实是更好、正确的方法。您非常接近,但您最好的选择是使用after()
方法
这是您修改的代码,添加了注释:
from tkinter import*
import time
def event1():
v.set("Event one")
root.after(1000, event2) # NEW
def event2():
v.set("Event two")
root.after(1000, event3) # NEW
def event3():
v.set("Event three")
def dialogueBox():
top = Toplevel()
global v
top.minsize(400,0)
top.maxsize(700,300)
top.title("Toplevel test")
v = StringVar()
text = Label(top,textvariable = v)
text.pack()
event1()
#time.sleep(1)
#event2()
#time.sleep(1)
#event3()
root = Tk()
email = StringVar()
password = StringVar()
title = Label(root,text="Root window",font = 11)
title.pack()
label1 = Label(root,text = "Username")
label1.pack()
field1 = Entry(root,textvariable = email)
field1.pack()
label2 = Label(root,text = "Password")
label2.pack()
field2 = Entry(root,show = "*",textvariable = password)
field2.pack()
button = Button(root,text = "Get data",command = dialogueBox)
button.pack()
root.mainloop()
唯一真正的变化是使用after
方法从event1()
调用event2()
,从event2()
调用event3()
。通过这些after()
调用,您的对话框()中的最后4行将消失
发生了什么事?Tkinter是一个GUI、事件驱动系统。它不喜欢坐在那里等待任何事情。睡觉时,资源被浪费,GUI无法刷新和更新自身。通过使用after()
方法,GUI可以继续做它最擅长的事情:等待事件和输入。after()
方法将事件安排在以后发生。当该时间到来时,事件将得到处理。after()
的第一个参数是以毫秒为单位的时间延迟。第二个参数是函数名,在指定的时间延迟后调用
现在,我说after()
是最好的选择,但是还有另一种方法可以做到这一点,尽管不那么“礼貌”。您可以将.update()
方法调用添加到对话框()
,如下所示:
def dialogueBox():
top = Toplevel()
global v
top.minsize(400,0)
top.maxsize(700,300)
top.title("Toplevel test")
v = StringVar()
text = Label(top,textvariable = v)
text.pack()
event1()
text.update() # NEW -- RUDE!
time.sleep(1)
event2()
text.update() # NEW -- RUDE!
time.sleep(1)
event3()
.update()
调用粗暴地告诉GUI,“停止您正在做的一切,立即为我执行此操作!”这还将允许您查看事件1、事件2、事件3消息。但是after()
确实是更好、正确的方法。在event1()
中使用root.after(1000,event2)
并且它将在event1
一秒钟后运行event2
您必须从对话框()中删除sleep()
和函数event2()
event3()
在event1()
您必须从对话框()中删除sleep()
和函数event2()
event3()
请参见此处之后的演示,以及itertools的“炫耀”
请参见此处之后的演示,以及itertools的“炫耀”
问题是要睡觉。当GUI休眠时,它无法更新。对tkinter方法after
进行一些研究。对,与此问题中的问题相同,请参见after
示例。我尝试使用after方法,但它似乎给了我相同的问题。inevent1()
useroot.after(1000,event2)
它将在event1
一秒钟后运行event2
——您必须在sleep
之后删除sleep
和函数event2()
/event3()
问题是调用sleep。当GUI休眠时,它无法更新。对tkinter方法after
进行一些研究。对,与此问题中的问题相同,请参见after
示例。我尝试使用after方法,但它似乎给了我相同的问题。inevent1()
useroot.after(1000,event2)
并且它将在event1
一秒钟后运行event2
——您必须在睡眠
之后删除睡眠
和函数event2()
/event3()
。虽然这个程序生成我想要的结果,但它不调用3个单独的函数,而是通过字符串序列进行迭代。谢谢你的回复,不客气。但我不是在为你们制作节目,我只是为你们演示一两个概念。虽然这个程序生成我想要的结果,但它不调用3个单独的函数,而是通过字符串序列进行迭代。不过谢谢你的回复,你是