TkInter 脚本与 class - Canvas 行为
TkInter script vs class - Canvas behaviour
我正在使用 TkInter
编写一个 GUI,它将包含一个图像和图像旁边面板中的几个按钮。
我首先编写了一个可以让我可视化图像的脚本,它工作得很好:
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
import Tkinter
from PIL import Image, ImageTk
window = Tkinter.Tk()
window.title("Test GUI")
window.geometry("640x478")
window.configure(background='grey')
window.grid()
img = ImageTk.PhotoImage(Image.open('./test.jpg'))
canvas = Tkinter.Canvas(window, width=640, height=478, bg='white')
canvas.create_image(0,0,anchor='nw',image=img)
canvas.grid(column=0,row=0)
window.mainloop()
然后我尝试将上面的代码重写为class,以实现一些事件处理功能。但是,在class初始化函数中编写的完全相同的代码将不会显示图像。
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
import Tkinter
from PIL import Image, ImageTk
class showImageGUI(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
# the grid layout manager is a simple grid
# where you put your widgets
self.grid()
img = ImageTk.PhotoImage(Image.open('./test.jpg'))
canvas = Tkinter.Canvas(self, width=640, height=478, bg='white')
canvas.create_image(0,0,anchor='nw',image=img)
canvas.grid(column=0,row=0)
if __name__ == "__main__":
app = showImageGUI(None)
app.title('Test GUI')
# event-driven programming: the program will
# loop forever doing nothing but wait for events
# and only react when it receives an event
app.mainloop()
两者唯一的区别是:
- 在脚本实现中,我将
canvas
小部件的父级指定为整个 window
。
- 在 class 实现中,我将
canvas
小部件的父级指定为整个应用程序的 self
变量。
Can someone please explain me why is this breaking the code / how to solve it?
Tkinter 中存在一个错误,即使没有外部引用它们也会导致图像消失,即使它们应该以某种方式绑定到 Canvas 小部件中。我可能没有很好地解释这一点,因为我从来没有费心去真正研究正在发生的事情。我相信它在 effbot.org.
的某处有解释
无论如何,换行
img = ImageTk.PhotoImage(Image.open('./test.jpg'))
到
img = self.img = ImageTk.PhotoImage(Image.open('./test.jpg'))
而且我认为它对您有用。它对我有用。
我正在使用 TkInter
编写一个 GUI,它将包含一个图像和图像旁边面板中的几个按钮。
我首先编写了一个可以让我可视化图像的脚本,它工作得很好:
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
import Tkinter
from PIL import Image, ImageTk
window = Tkinter.Tk()
window.title("Test GUI")
window.geometry("640x478")
window.configure(background='grey')
window.grid()
img = ImageTk.PhotoImage(Image.open('./test.jpg'))
canvas = Tkinter.Canvas(window, width=640, height=478, bg='white')
canvas.create_image(0,0,anchor='nw',image=img)
canvas.grid(column=0,row=0)
window.mainloop()
然后我尝试将上面的代码重写为class,以实现一些事件处理功能。但是,在class初始化函数中编写的完全相同的代码将不会显示图像。
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
import Tkinter
from PIL import Image, ImageTk
class showImageGUI(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
# the grid layout manager is a simple grid
# where you put your widgets
self.grid()
img = ImageTk.PhotoImage(Image.open('./test.jpg'))
canvas = Tkinter.Canvas(self, width=640, height=478, bg='white')
canvas.create_image(0,0,anchor='nw',image=img)
canvas.grid(column=0,row=0)
if __name__ == "__main__":
app = showImageGUI(None)
app.title('Test GUI')
# event-driven programming: the program will
# loop forever doing nothing but wait for events
# and only react when it receives an event
app.mainloop()
两者唯一的区别是:
- 在脚本实现中,我将
canvas
小部件的父级指定为整个window
。 - 在 class 实现中,我将
canvas
小部件的父级指定为整个应用程序的self
变量。
Can someone please explain me why is this breaking the code / how to solve it?
Tkinter 中存在一个错误,即使没有外部引用它们也会导致图像消失,即使它们应该以某种方式绑定到 Canvas 小部件中。我可能没有很好地解释这一点,因为我从来没有费心去真正研究正在发生的事情。我相信它在 effbot.org.
的某处有解释无论如何,换行
img = ImageTk.PhotoImage(Image.open('./test.jpg'))
到
img = self.img = ImageTk.PhotoImage(Image.open('./test.jpg'))
而且我认为它对您有用。它对我有用。