gpt4 book ai didi

python - 在单独的线程中运行 Tkinter 表单

转载 作者:太空狗 更新时间:2023-10-30 00:20:56 26 4
gpt4 key购买 nike

我写了一个简短的模块,它可以传递一个图像并简单地创建一个 Tkinter 窗口并显示它。我遇到的问题是,即使我在单独的线程中实例化和调用显示图像的方法,主程序也不会继续,直到 Tkinter 窗口关闭。

这是我的模块:

import Image, ImageTk
import Tkinter


class Viewer(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()

def initialize(self):
self.grid()

def show(self,img):
self.to_display = ImageTk.PhotoImage(img)
self.label_image = Tkinter.Label(self,image=self.to_display)
self.label_image.grid(column = 0, row = 0, sticky = "NSEW")
self.mainloop()

它似乎工作正常,除了当我像下面这样从我的测试程序中调用它时,它似乎不允许我的测试程序继续,即使在不同的线程中启动也是如此。

import Image
from viewer import Viewer
import threading

def showimage(im):
view = Viewer(None)
view.show(im)

if __name__ == "__main__":
im = Image.open("gaben.jpg")
t = threading.Thread(showimage(im))
t.start()
print "Program keeps going..."

我想也许我的问题是我应该在模块本身内创建一个新线程,但我只是想尝试保持简单,因为我是 Python 的新手。

无论如何,提前感谢您的帮助。

编辑:为了清楚起见,我只是想制作一个将在 Tkinter 窗口中显示图像的模块,这样我就可以在任何想显示图像的时候使用这个模块。我遇到的问题是,任何时候程序使用此模块时,它都无法恢复,直到关闭 Tkinter 窗口。

最佳答案

Tkinter 不是线程安全的,普遍的共识是 Tkinter 不能在非主线程中工作。如果您重写代码以便 Tkinter 在主线程中运行,您可以让您的工作人员在其他线程中运行。

主要警告是工作人员无法与 Tkinter 小部件交互。他们必须将数据写入队列,而您的主 GUI 线程必须轮询该队列。

如果您所做的只是显示图像,您可能根本不需要线程。只有当您有一个长时间运行的进程否则会阻塞 GUI 时,线程才有用。 Tkinter 可以毫不费力地轻松处理数百个图像和窗口。

关于python - 在单独的线程中运行 Tkinter 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10556479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com