在获得 Return 值并再次 Return 之后使用 Tkinter
Use Tkinter After To Get Return Value And Return It Again
在调用函数并获取其 return 值之前,我需要延迟。但是 time.sleep
冻结了 tkinter GUI,所以我使用了 tkinter.after
。 tkinter.after
正在工作,不会冻结 window,但我无法获得我调用的函数的 return 值。因为在我延迟并获得 returned 值之后,我必须再次 return 它到调用此函数的另一个函数。
我一直在为这个问题苦苦挣扎,如果你们知道任何解决方案,请帮助我
这是发生了什么的基本示例
import tkinter as tk
from time import sleep
def getvalue():
value = "haha"
sleep(3)
return value
def printvalue():
value = getvalue()
print(value)
app = tk.Tk()
app.geometry("500x300")
button = tk.Button(app, text="print value", command=printvalue)
button.pack()
app.mainloop()
对于这个简单的例子,我会使用 tkinter.after()
到 运行 函数延迟。所有代码都在获取数据后移至由 tkinter.after()
执行的第二个函数。
但您的实际代码可能更复杂,而且很难拆分。
import tkinter as tk
def getvalue():
return "haha"
def second_part(other):
print('after delay')
value = getvalue()
# code moved from first part
print('value:', value)
print('other:', other)
button['text'] = value
def print_value():
# first part makes some calculation
other_variable = 'some value'
print('before delay')
# run function with delay and send all data from first part
app.after(3000, second_part, other_variable)
# rest of code moved to second_part
app = tk.Tk()
button = tk.Button(app, text="print value", command=print_value)
button.pack()
app.mainloop()
编辑: 如果您在使用 tkinter.after()
时遇到问题,那么您可以尝试使用 Thread
到 运行 print_value
这将不得不等待 getvalue()
.
但是 Thread
有时在主线程中访问 GUI 小部件时可能会出现问题。
import tkinter as tk
from time import sleep
import threading
def getvalue():
sleep(3)
return "haha"
def print_value():
# first part makes some calculation
other_variable = 'some value'
print('before delay')
value = getvalue()
print('after delay')
print('value:', value)
print('other:', other_variable)
button['text'] = value
def start_thread():
t = threading.Thread(target=print_value)
t.start()
app = tk.Tk()
button = tk.Button(app, text="print value", command=start_thread)
button.pack()
app.mainloop()
我正在考虑 asyncio
具有非阻塞 asyncio.sleep()
但 asyncio
需要 运行 自己的循环会阻塞 mainloop()
所以它会必须 运行 在 Thread
.
在调用函数并获取其 return 值之前,我需要延迟。但是 time.sleep
冻结了 tkinter GUI,所以我使用了 tkinter.after
。 tkinter.after
正在工作,不会冻结 window,但我无法获得我调用的函数的 return 值。因为在我延迟并获得 returned 值之后,我必须再次 return 它到调用此函数的另一个函数。
我一直在为这个问题苦苦挣扎,如果你们知道任何解决方案,请帮助我
这是发生了什么的基本示例
import tkinter as tk
from time import sleep
def getvalue():
value = "haha"
sleep(3)
return value
def printvalue():
value = getvalue()
print(value)
app = tk.Tk()
app.geometry("500x300")
button = tk.Button(app, text="print value", command=printvalue)
button.pack()
app.mainloop()
对于这个简单的例子,我会使用 tkinter.after()
到 运行 函数延迟。所有代码都在获取数据后移至由 tkinter.after()
执行的第二个函数。
但您的实际代码可能更复杂,而且很难拆分。
import tkinter as tk
def getvalue():
return "haha"
def second_part(other):
print('after delay')
value = getvalue()
# code moved from first part
print('value:', value)
print('other:', other)
button['text'] = value
def print_value():
# first part makes some calculation
other_variable = 'some value'
print('before delay')
# run function with delay and send all data from first part
app.after(3000, second_part, other_variable)
# rest of code moved to second_part
app = tk.Tk()
button = tk.Button(app, text="print value", command=print_value)
button.pack()
app.mainloop()
编辑: 如果您在使用 tkinter.after()
时遇到问题,那么您可以尝试使用 Thread
到 运行 print_value
这将不得不等待 getvalue()
.
但是 Thread
有时在主线程中访问 GUI 小部件时可能会出现问题。
import tkinter as tk
from time import sleep
import threading
def getvalue():
sleep(3)
return "haha"
def print_value():
# first part makes some calculation
other_variable = 'some value'
print('before delay')
value = getvalue()
print('after delay')
print('value:', value)
print('other:', other_variable)
button['text'] = value
def start_thread():
t = threading.Thread(target=print_value)
t.start()
app = tk.Tk()
button = tk.Button(app, text="print value", command=start_thread)
button.pack()
app.mainloop()
我正在考虑 asyncio
具有非阻塞 asyncio.sleep()
但 asyncio
需要 运行 自己的循环会阻塞 mainloop()
所以它会必须 运行 在 Thread
.