从 API 获取数据时 tkinter 窗口无响应

Posted

技术标签:

【中文标题】从 API 获取数据时 tkinter 窗口无响应【英文标题】:tkinter Window unresposive while getting data from API 【发布时间】:2021-05-01 14:55:31 【问题描述】:

我有一个 tkinter 程序,它从 API 获取一些数据。当互联网连接速度很慢时,可能需要很长时间。 tkinter 窗口变得无响应。要阻止它,我必须强制关闭程序。我该如何避免这种情况?

我有一个从 API 检索数据的函数。我希望能够在保持程序和 tkinter 窗口运行的同时停止该功能。

上传图片后,我将其上传到 API(这显然需要一些时间),在得到响应后,将检索到的相关信息粘贴到 txt 文件中并打开。

【问题讨论】:

我会使用线程。您能否提供一些有关如何阅读 API 的代码。所以我们可以给出一些建议来在你的代码中解决它? 【参考方案1】:

使用线程进行调用和递归事件检查,直到调用完成。

from threading import Thread
from time import sleep
import tkinter as tk

class App(tk.Tk):

    def api_call(self, time):
        sleep(time)
        print('API call done')
        self.api_result = 10

    def on_button_click(self):
        self.button.config(state=tk.DISABLED)
        self.api_thread = Thread(target=self.api_call, args=(3,))
        self.api_thread.start()
        self.button_update()

    def __init__(self):
        tk.Tk.__init__(self)

        self.api_thread = None
        self.api_result = None

        self.button = tk.Button(self, text='Send', command=self.on_button_click)
        self.button.place(relx=0.5, rely=0.5, anchor=tk.CENTER)

    def button_update(self):
        if self.api_result is not None:
            if self.api_thread.is_alive():
                self.api_thread.join(timeout=2)
            self.button.config(state=tk.NORMAL)
            self.api_thread = None
            self.api_result = None
        else:
            self.button.after(500, self.button_update)


if __name__ == '__main__':
    aplication = App()
    aplication.mainloop()

【讨论】:

以上是关于从 API 获取数据时 tkinter 窗口无响应的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 tkinter 窗口的屏幕截图

Tkinter GUI 未显示,但功能收到响应

如何从包含android中API响应的缓存中获取改造缓存数据

Fetch Api:无法从本地主机获取数据

Flutter - 无法将所有 json 数据从 api 响应保存到 Iterable List 编辑:(无法从可迭代列表中获取数据)

从 API Node JS 获取不正确的数据