猿问

如何避免 tkinter GUI 冻结?

import tkinter as tk

from tkinter import filedialog

from PIL import ImageTk, Image

import os

import argparse

import numpy as np


db_path = "/fulldatabase/"

output = None

output_path = None



def test():

    root = tk.Tk()

    root.withdraw()

    dirname = tk.filedialog.askdirectory(parent=root, initialdir="./", title='select input query folder')

    root.destroy()

    return (dirname)



if __name__ == "__main__":

    in_dir = test()

    path = os.listdir(in_dir)

    parser = argparse.ArgumentParser()

    parser.add_argument('--output', '-o')

    args = parser.parse_args()

    output_path = args.output

    window = tk.Tk()

    window.title("My App")

    window.geometry("1024x800")

    app = Application(window, in_dir, path)

    window.mainloop()

    output.close()

我有一个输入查询文件夹,其中包含一组不同的花卉图像,例如 rose_3、lily_5 和 jasmine_2,其中下划线后的数字表示其实例编号。


我想从输入文件夹中选择一个图像并将其显示在 tkinter 窗口上。


我还想在同一个 tkinter 窗口上显示玫瑰的所有其他图像(从完整数据库,即另一个文件夹中读取)说 rose_1、rose_2、rose_4 和 rose_5(如果我在数据库中有 5 个玫瑰图像)它的右侧同时低于另一个。


所有这一切都与此代码完美配合,但 GUI 经常冻结。有人可以帮我吗?


隔江千里
浏览 85回答 2
2回答

catspeake

也许你应该用线程来做。创建一个线程来加载您的图像并检查图像是否已完成加载。并返回一个值是否完成。

慕田峪4524236

您应该在单独的线程中加载(以及可能的进一步处理)图像。创建一个线程来加载您的图像,一旦我完成了该任务,您就可以将图像发送到 GUI 进行渲染。大多数甚至不是所有的 GUI 框架都使用一个主线程(其中不断运行一个循环)来专门处理与 GUI 相关的任务,例如处理用户输入(鼠标、键盘等)、渲染等。一旦您在该线程中引入不同的负载(例如加载图像),该线程就不再能够仅专注于特定于 GUI 的任务。这会导致您的 GUI 冻结。
随时随地看视频慕课网APP

相关分类

Python
我要回答