除非从循环外部调用,否则不会显示mainloop内部的Python Tkinter变量

问题描述

第一次尝试tkinter。下面的代码有4个print#语句。这里有两个问题-

1)-执行时,我期望代码流与print#语句相同,但似乎流不同。我先看到print2,3,然后再看到print1。为什么会这样?

2)-仅print1和4具有变量u_input的值(或e1.get)。为什么print2,3没有显示相同的值? ..可能与代码流相同。

from tkinter  import *

w = Tk()
w.title(" Main Window")
w.geometry('800x800')      

def test ():
    ux = u_input.get()
    print("print1 : ",ux )

u_input = StringVar()

e1 = Entry(w,textvariable = u_input )
e1.grid(row=0,column=1,padx = 300,pady= 20 )
b1 = Button(w,text ="button1",width = 12,justify = "center",command = test )
b1.grid(row=10,padx= 300,pady= 40)


print("print 2 : ",str(u_input.get()))
print("print 3 : ",str(e1.get()))

w.mainloop()

User_Entry = str(u_input.get())
print("print 4 ",User_Entry)

==============================

将上面的代码与下面的代码进行比较-该代码调用函数的顺序打印。

a= 1
b= 2
def func2 ():
    a=100
    b=200
    print("print3 :",a+b)
def func1 ():
    a=10
    b=20
    print("print1 :",a+b)

func1()
print("print2 :",a+b)
func2()

解决方法

所有GUI的工作方式与命令input()不同。

Button()不会等待您的单击-它仅为mainloop()创建信息,它必须在窗口中显示什么窗口小部件-稍后mainloop()启动程序并显示窗口和所有此窗口中的小部件。并且它运行循环,该循环从系统获取键盘/鼠标事件,将其发送到小部件,单击某些按钮时运行功能,(重新)绘制小部件等。

因此,"print 2""print 3"mainloop()显示窗口之前-并且您可以单击使用"print 1"运行代码的按钮之前执行。

第二个问题也是如此。在"print 2"中,"print 3"mainloop()显示窗口之前以及您可以在Entry中放置任何文本之前打印值。


就像我说的一样,其他GUI不仅可以使用tkinter,而且可以使用PyQtPyGTK等其他GUI,而且不仅可以使用Python,而且可以使用其他语言{ {1}},CC++

同样的方法也可能适用于游戏-它们也可能具有一些Java。在event loop中,您甚至必须自己编写此循环。