Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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 在顶级窗口中调用函数后,如何获取要更新的标签?_Python_Tkinter_Lambda - Fatal编程技术网

Python 在顶级窗口中调用函数后,如何获取要更新的标签?

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

我试图在python中构建一个顶级窗口,其中有一个名为“text”的标签。它的文本变量称为“v”。如您所见,dialogueBox()中有3个函数调用。我想让程序做的是让标签“text”显示短语“Event one”,等待一秒钟,显示短语“Event two”,等待一秒钟,然后显示短语“Event three”。没有这样做,而是打开顶层窗口,仅显示“事件三”

我怀疑这是一个lambda问题,但我仍然不知道如何在Tkinter中使用它

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方法,但它似乎给了我相同的问题。in
event1()
use
root.after(1000,event2)
它将在
event1
一秒钟后运行
event2
——您必须在
sleep
之后删除
sleep
和函数
event2()
/
event3()
问题是调用sleep。当GUI休眠时,它无法更新。对tkinter方法
after
进行一些研究。对,与此问题中的问题相同,请参见
after
示例。我尝试使用after方法,但它似乎给了我相同的问题。in
event1()
use
root.after(1000,event2)
并且它将在
event1
一秒钟后运行
event2
——您必须在
睡眠
之后删除
睡眠
和函数
event2()
/
event3()
。虽然这个程序生成我想要的结果,但它不调用3个单独的函数,而是通过字符串序列进行迭代。谢谢你的回复,不客气。但我不是在为你们制作节目,我只是为你们演示一两个概念。虽然这个程序生成我想要的结果,但它不调用3个单独的函数,而是通过字符串序列进行迭代。不过谢谢你的回复,你是