2017-01-25 11 views
0

Я использую ttk/tkinter в Python (3.5), и у меня возникают проблемы с кнопками (в частности, ttk.Button).Проблема с изображениями кнопок в ttk/Python

Независимо от того, что я пытаюсь, я не могу на всю жизнь получить изображение, которое появляется на кнопке.

У меня есть следующий код:

from tkinter import * 
from tkinter import ttk 
from PIL import Image, ImageTk 

class Example(ttk.Frame): 
    def __init__(self, master): 
     ttk.Frame.__init__(self, master) 
     master.title('Button Test') 

     self.configure(padding='10 10 10 10') 
     self.grid(column=0, row=0, sticky=(N, E, W, S)) 

     buttonImage = Image.open('play.png') 
     buttonPhoto = ImageTk.PhotoImage(buttonImage) 

     myButton = ttk.Button(self, image=buttonPhoto, padding='10 10 10 10') 
     myButton.grid(column=1, row=1, sticky=(E, W)) 

if __name__ == "__main__": 
    root = Tk() 
    example = Example(root) 
    root.mainloop() 

Это объединение примеров я нашел here, here, и от пользователей здесь, на StackOverflow.

Заранее благодарим за идеи и идеи.

-Sean

+0

'PhotoImage' имеет проблемы с' мусора collector' который удаляет изображение, если оно присваивается локальной переменной , Присвоить изображение переменной класса 'self.buttonPhoto' – furas

ответ

2

PhotoImage имеет проблемы с garbage collector, который удаляет изображение, если оно присваивается локальной переменной.

Присвоить изображение класса переменной self.buttonPhoto

self.buttonPhoto = ImageTk.PhotoImage(buttonImage) 

Full:

from tkinter import * 
from tkinter import ttk 
from PIL import Image, ImageTk 

class Example(ttk.Frame): 
    def __init__(self, master): 
     ttk.Frame.__init__(self, master) 
     master.title('Button Test') 

     self.configure(padding='10 10 10 10') 
     self.grid(column=0, row=0, sticky=(N, E, W, S)) 

     buttonImage = Image.open('play.png') 

     # use self.buttonPhoto 
     self.buttonPhoto = ImageTk.PhotoImage(buttonImage) 

     # use self.buttonPhoto 
     myButton = ttk.Button(self, image=self.buttonPhoto, padding='10 10 10 10') 
     myButton.grid(column=1, row=1, sticky=(E, W)) 

if __name__ == "__main__": 
    root = Tk() 
    example = Example(root) 
    root.mainloop() 

Или назначить изображение другому объекту - он должен прекратить garbage collector тоже.

ie.

myButton.image = buttonPhoto 

Full:

from tkinter import * 
from tkinter import ttk 
from PIL import Image, ImageTk 

class Example(ttk.Frame): 
    def __init__(self, master): 
     ttk.Frame.__init__(self, master) 
     master.title('Button Test') 

     self.configure(padding='10 10 10 10') 
     self.grid(column=0, row=0, sticky=(N, E, W, S)) 

     buttonImage = Image.open('tplay.png') 
     buttonPhoto = ImageTk.PhotoImage(buttonImage) 

     myButton = ttk.Button(self, image=buttonPhoto, padding='10 10 10 10') 
     myButton.grid(column=1, row=1, sticky=(E, W)) 
     # assign image to other object 
     myButton.image = buttonPhoto 

if __name__ == "__main__": 
    root = Tk() 
    example = Example(root) 
    root.mainloop() 

См Note в конце страницы The Tkinter PhotoImage Class

+0

Это сделало это. Очень хорошая информация, а также объясняет часть одного из примеров, которые я привел. Спасибо, фурас. – detroitwilly

+0

Это работает, но у меня есть вопрос. Я просмотрел много ссылок, но не нашел дополнения для ttk.Button. Почему это работает здесь? Не могли бы вы объяснить немного больше? Благодарю. –