Python 主循环内的 Tkinter 变量不显示,除非从循环外调用

Python Tkinter variable inside mainloop doesnt display unless called from outside of loop

第一次尝试 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,column=1 , 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() 创建它必须在 window 中显示的小部件的信息 - 然后 mainloop() 启动程序并显示 window 和此 window 中的所有小部件。它运行循环,从系统获取 keyboard/mouse 事件,将它们发送到小部件,当您单击某个按钮时运行函数,(重新)绘制小部件等

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

第二个问题也是如此。在 "print 2""print 3" 中,它会在 mainloop() 显示 window 之前以及您可以在 Entry.

中放置任何文本之前打印值

正如我所说,同样的方式适用于其他 GUI - 不仅是 tkinter,还有 PyQtPyGTK 等。而且不仅在 Python 中,而且在其他 GUI 中也是如此语言 CC++Java

同样的方法也适用于游戏 - 他们也可能有一些 event loop。在 PyGame 你甚至必须自己编写这个循环。