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


问题内容

我写了一个简短的模块,可以传递图像,并简单地创建一个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窗口,否则它无法恢复。


问题答案:

从您的评论看来,您根本不需要GUI。只需将映像写入磁盘并调用外部查看器即可。

在大多数系统上,应该可以使用以下方式启动默认查看器:

import subprocess

subprocess.Popen("yourimage.png")