кнопка python не работает при добавлении изображения

Когда я пытаюсь добавить изображение к кнопке, программа запустится, но кнопка будет пустой, и вы не сможете ее щелкнуть. Если я изменю image=Tkinter.PhotoImage(file="C:/TeDOC/OpenFolder.gif") на text='Open Directory, он будет работать нормально, и вы сможете нажать кнопку. Понятия не имею, почему, когда я меняю его на img, он не работает. Любая помощь будет оценена по достоинству.

Вот мой код:

import Tkinter, Tkconstants, tkFileDialog

class TkFileDialogExample(Tkinter.Frame):

def __init__(self, root):

Tkinter.Frame.__init__(self, root)

# options for buttons
button_opt = {'fill': Tkconstants.BOTH, 'padx': 5, 'pady': 5}

# define buttons
Tkinter.Button(self, image=Tkinter.PhotoImage(file="C:/TeDOC/OpenFolder.gif"), command=self.askdirectory).pack(**button_opt)

# defining options for opening a directory
self.dir_opt = options = {}
options['initialdir'] = 'C:\\'
options['mustexist'] = False
options['parent'] = root
options['title'] = 'This is a title'


def askdirectory(self):
#Returns a selected directoryname.
return tkFileDialog.askdirectory(**self.dir_opt)

if __name__=='__main__':
  root = Tkinter.Tk()
  TkFileDialogExample(root).pack()
  root.mainloop()

person user3697475    schedule 01.06.2014    source источник


Ответы (2)


Сначала вы должны определить свое изображение, используя self.image. Так что постарайтесь:

self.image = Tkinter.PhotoImage(file="C:/TeDOC/OpenFolder.gif")

Затем под вашей кнопкой поместите:

Tkinter.Button(self, image=self.image, command=self.askdirectory).pack(**button_opt)
person user3692825    schedule 01.06.2014
comment
Это правильное решение, но в нем стоит упомянуть причину, по которой необходимо зарегистрировать image как атрибут класса (т. Е. Потому, что в противном случае он будет собирать мусор). - person ebarr; 02.06.2014

Вы должны сохранить изображение в себе.

self.image = Tkinter.PhotoImage(file="C:/TeDOC/OpenFolder.gif")
Tkinter.Button(..., image=Tkinter.PhotoImage(file="C:/TeDOC/OpenFolder.gif"), ...

Если он будет удален, он не будет отображаться.

person User    schedule 01.06.2014