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
,还有 PyQt
、PyGTK
等。而且不仅在 Python
中,而且在其他 GUI 中也是如此语言 C
、C++
、Java
等
同样的方法也适用于游戏 - 他们也可能有一些 event loop
。在 PyGame
你甚至必须自己编写这个循环。
第一次尝试 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
,还有 PyQt
、PyGTK
等。而且不仅在 Python
中,而且在其他 GUI 中也是如此语言 C
、C++
、Java
等
同样的方法也适用于游戏 - 他们也可能有一些 event loop
。在 PyGame
你甚至必须自己编写这个循环。