作为一点背景,我从另一个开发人员那里拿了一个项目,他把整个项目写成一个从上到下运行的大文件。
管理员希望在脚本执行过程中的某些点在屏幕上显示图像/视频,而在其他执行点消失。
我已经广泛地使用Tk,但我仍然受到缺乏线程安全性及其阻塞mainloop()
函数的限制。
是否有一种方法在python显示图像/视频异步/以非阻塞的方式,而主线程仍然执行?在这个项目的上下文中,API必须类似于下面的内容。
if __name__ == "__main__":
gui = load_gui()
gui.display_image("doing_math.png") #doesn't block
for i in range(0, 500):
print(str(i))
gui.display_image("math_complete.mp4")#doesn't block
sleep(2)
gui.clear_display()
目前我正在使用尝试使用Tk如下所示。但是它受到mainloop()阻塞其余脚本执行的限制。
class MediaGui(tk.Tk):
def __init__(self):
self.mainloop()
...
gui = MediaGui() #this line blocks because of mainloop
gui.load_image("image.png")
试试这个:
from concurrent.futures import ThreadPoolExecutor
gui = load_gui()
def run_io_tasks_in_parallel(tasks):
with ThreadPoolExecutor() as executor:
running_tasks = [executor.submit(task) for task in tasks]
for running_task in running_tasks:
running_task.result()
run_io_tasks_in_parallel([
lambda: gui.display_image("doing_math.png"),
lambda: gui.display_image("math_complete.mp4"),
])