我编写了一个可以传递图像的简短模块,只需创建一个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()
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,除非我从我的测试程序中调用它,如下所示,它似乎不允许我的测试程序继续,即使在另一个线程中启动.
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..."
Run Code Online (Sandbox Code Playgroud)
我想也许我的问题是我应该在模块本身内创建一个新线程,但我只想尝试保持简单,因为我是Python的新手.
无论如何,提前感谢任何帮助.
编辑:为了清楚起见,我只是想制作一个在Tkinter窗口中显示图像的模块,以便我可以在任何时候想要显示图像时使用该模块.我遇到的问题是,只要程序使用此模块,它就无法恢复,直到Tkinter窗口关闭.
我想__getattr__
在类的实例化过程中进行更改。例如:
class AttrTest(object):
def __init__(self):
self.__getattr__ = self._getattr
def _getattr(self, attr):
print("Getting {}".format(attr))
Run Code Online (Sandbox Code Playgroud)
我本以为这会表现得像:
class AttrTest(object):
def __getattr__(self, attr):
print("Getting {}".format(attr))
Run Code Online (Sandbox Code Playgroud)
但事实并非如此。
例如,当我运行时:
>>> at = AttrTest()
>>> at.test
Run Code Online (Sandbox Code Playgroud)
我希望两个类都能打印Getting test
,但顶级类会抛出一个AttributeError
.
就不能__getattr__
这样改吗?