从 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 窗口无响应的主要内容,如果未能解决你的问题,请参考以下文章
如何从包含android中API响应的缓存中获取改造缓存数据
Flutter - 无法将所有 json 数据从 api 响应保存到 Iterable List 编辑:(无法从可迭代列表中获取数据)