我使用TkInter
来编写一个图形用户界面,其中包含图像和图像旁边的一些按钮。TkInter脚本vs类 - 画布行为
我开始写剧本,让我来可视化图像,它工作得很好:
#!/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()
我又试图改写上面的代码为一类,以实现一些事件处理功能。然而,在类初始化函数中编写的完全相同的代码不会将图像可视化。
#!/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
。 - 在课程实施中,我将
canvas
小部件的父级指定为整个应用程序的self
变量。
有人可以请解释我为什么这打破代码/如何解决它?
正如我经常说的,即使很多人不同意我的观点,我绝不会建议任何人使用TKInter来设计GUI。对设计戒律非常陌生。没有直觉。比_that_有更好的GUI框架。 –
@ J.C.Rocamonde - 感谢您的评论。有没有任何建议你[这些](https://wiki.python.org/moin/GuiProgramming)? – Matteo
我只尝试过很少,因为我通常不会使用代码的前端部分。然而,从我尝试过的所有方面来看,Kivy框架是一个非常漂亮,更新,看起来很好的跨平台框架,它甚至有自己的CSS语言,您可以将其添加到单独的文件或Python文件中本身,这构成了设计。 –