2013-07-20 2 views
4

Это формат код я в настоящее время:Python Tkinter PhotoImage

import Tkinter as tk 

class mycustomwidow: 
    def __init__(self,parent,......) 
     ...... 
     ...... 
     tk.Label(parent,image=Myimage) 
     tk.pack(side='top') 

def main(): 
    root=tk.Tk() 
    mycustomwindow(root) 
    root.mainlopp() 

if __name__ == '__main__': 
    main() 

Моей проблема: Где я должен объявить фотографию Myimage, что я использовал в моем классе mycustomwindow?

Если я положил Myimage=tk.PhotoImage(data='....') перед root=tk.Tk(), как показано ниже, это даст мне ошибку too early to create image, поскольку мы не можем создать изображение перед корневым окном.

import Tkinter as tk 
Myimage=tk.PhotoImage(data='....') 
class mycustomwidow: 
    def __init__(self,parent,......) 
     ...... 
     ...... 
     tk.Label(parent,image=Myimage) 
     tk.pack(side='top') 

def main(): 
    root=tk.Tk() 
    mycustomwindow(root) 
    root.mainlopp() 

if __name__ == '__main__': 
    main() 

Если я ставлю Myimage=tk.PhotoImage(data='....') в функции main(), как это, он говорит, что не может найти изображение Myimage в class mycustomwindow.

import Tkinter as tk 

class mycustomwidow: 
    def __init__(self,parent,......) 
     ...... 
     ...... 
     tk.Label(parent,image=Myimage) 
     tk.pack(side='top') 

def main(): 
    root=tk.Tk() 
    Myimage=tk.PhotoImage(data='....') 
    mycustomwindow(root) 
    root.mainlopp() 

if __name__ == '__main__': 
    main() 

Есть что-то плохое в моей структуре кода? Где я должен объявить Myimage, чтобы его можно было использовать в class mycustomwindow?

ответ

7

Это не имеет большого значения, где вы объявляете изображение, до тех пор, как

  1. вы создаете его после инициализации Tk() (проблема в первом подходе)
  2. изображение в переменной scope, когда вы используете его (проблема в вашем втором подходе)
  3. объект изображения не собирать мусор (еще commonpitfall)

Если определить образ в вашем методе main(), то вам придется сделать это global

class MyCustomWindow(Tkinter.Frame): 
    def __init__(self, parent): 
     Tkinter.Frame.__init__(self, parent) 
     Tkinter.Label(self, image=image).pack() 
     self.pack(side='top') 

def main(): 
    root = Tkinter.Tk() 
    global image # make image known in global scope 
    image = Tkinter.PhotoImage(file='image.gif') 
    MyCustomWindow(root) 
    root.mainloop() 

if __name__ == "__main__": 
    main() 

В качестве альтернативы, вы можете бросить свой метод main() полностью, что делает его глобальным автоматически:

class MyCustomWindow(Tkinter.Frame): 
    # same as above 

root = Tkinter.Tk() 
image = Tkinter.PhotoImage(file='image.gif') 
MyCustomWindow(root) 
root.mainloop() 

Или объявьте изображение в своем __init__ методе, но не забудьте использовать ключевое слово self. привяжите его к вашему объекту Frame, чтобы он не вывозили мусор, когда __init__ заканчивается:

class MyCustomWindow(Tkinter.Frame): 
    def __init__(self, parent): 
     Tkinter.Frame.__init__(self, parent) 
     self.image = Tkinter.PhotoImage(file='image.gif') 
     Tkinter.Label(self, image=self.image).pack() 
     self.pack(side='top') 

def main(): 
    # same as above, but without creating the image 
Смежные вопросы