在获得 Return 值并再次 Return 之后使用 Tkinter

Use Tkinter After To Get Return Value And Return It Again

在调用函数并获取其 return 值之前,我需要延迟。但是 time.sleep 冻结了 tkinter GUI,所以我使用了 tkinter.aftertkinter.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.