2015-09-19 37 views
0

我使用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() 

enter image description here

我又试图改写上面的代码为一类,以实现一些事件处理功能。然而,在类初始化函数中编写的完全相同的代码不会将图像可视化。

#!/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() 

enter image description here

两者之间的唯一区别是:

  • 在脚本执行我分配canvas小部件的父是整个window
  • 在课程实施中,我将canvas小部件的父级指定为整个应用程序的self变量。

有人可以请解释我为什么这打破代码/如何解决它?

+0

正如我经常说的,即使很多人不同意我的观点,我绝不会建议任何人使用TKInter来设计GUI。对设计戒律非常陌生。没有直觉。比_that_有更好的GUI框架。 –

+0

@ J.C.Rocamonde - 感谢您的评论。有没有任何建议你[这些](https://wiki.python.org/moin/GuiProgramming)? – Matteo

+0

我只尝试过很少,因为我通常不会使用代码的前端部分。然而,从我尝试过的所有方面来看,Kivy框架是一个非常漂亮,更新,看起来很好的跨平台框架,它甚至有自己的CSS语言,您可以将其添加到单独的文件或Python文件中本身,这构成了设计。 –

回答

1

在Tkinter中存在一个错误,即使它们没有外部引用,也会导致图像消失,尽管它们应该以某种方式绑定到Canvas小部件中。我可能没有解释得那么好,因为我从来没有煞费苦心去真正研究发生了什么。我相信它在effbot.org上有解释。

在任何情况下,该行

img = ImageTk.PhotoImage(Image.open('./test.jpg')) 

改变

img = self.img = ImageTk.PhotoImage(Image.open('./test.jpg')) 

,我认为它会为你工作。这个对我有用。

+0

完美工作。谢谢@saul! – Matteo