1.问题提出
在做图形化编程时经常遇到界面刷新函数,如python tkinter中的mainloop,java线程new和remove并用等等。但是想要使用图形化界面的数据(输入的文本数据或其他)时却出现了无法将其读出/使用的问题。
2.问题解决
以python tkinter包中的mainloop图形界面刷新函数为例,如果我们将使用图形界面数据的操作放在刷新函数之前,那么只能得到原数据,不会得到图形界面的任何输入数据。
eg:
str=""
win=tk.Tk()
tk.Button(.....).place(..)
entry=tk.Entry(.....).place(..)
str=entry.get()
win.mainloop()
最后str得到结果仍然是“”,因为图形界面是在使用mainloop时才出现的,也就是前面的操作执行结束之后才会出现图形界面供我们进行操作,所以str读取到的只能是未出现图形界面时的文本输入框的初始数据-空值。
想要使用图形化界面的数据1.直接在对应的事件处理函数中使用(该函数是在图形界面之后,通过我们点击或按键触发,所以从逻辑和实际执行上都是可行的)。
eg:
str=""
win=tk.Tk()
entry=tk.Entry(.....).place(..)
def solve():
str=entry.get()
print(str)
....#对str的操作
tk.Button(....,command=solve).place(..)
win.mainloop()
2.通过全局变量将数据传出,注意全局变量是在所有函数之外的变量。
易错:
def start():
str=""
win=tk.Tk()
entry=tk.Entry(.....).place(..)
def solve():
str=entry.get()
tk.Button(....,command=solve).place(..)
win.mainloop()
print(str)
上述情况中的str并非全局变量,这样是不能将数据传出的,所以最后str的输出仍然为“”
正确使用:
str=“”#注意位置
def start():
win=tk.Tk()
entry=tk.Entry(.....).place(..)
def solve():
global str
str=entry.get()
tk.Button(....,command=solve).place(..)
win.mainloop()
print(str)
此时得到的str将是最后一次点击Button触发函数时Entry输入框的值
补充说明mainloop:
mainloop是图形界面的刷新操作,直到我们将界面删除,它才会结束。所以也只有我们X掉界面才能进行下一步操作