Kein Image im Objekt

Fragen zu Tkinter.
Antworten
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Hallo,
ich quäle mich mal wieder mit einem Problem. In folgendem Beispiel werden einfach keine Images angezeigt.

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

b_pic =	b'''R0lGODlhEAAQANUiANYMDLUWFsESEtGnp+jT0+YHB8KJibt9fZs/P/cCAqtd
			XcmYmP0BAeDExMwPD94KCvIEBNq4uLJsbNKpqenV1ZQxMcuamvnz89m1tffw
			8Lp6eqNOTpseHu0GBvoBAf4AAIwiIv8AAP///wAAAAAAAAAAAAAAAAAAAAAA
			AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
			AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACIALAAAAAAQABAAAAZz
			QJFwqAGBDsNkUtMJhQTKKOfjhEiiSUCo+eFghRvPMxF6fEWB0Kei9WywzFBB
			NH1i6wGRBLLVRNsbBiICal5JYSEeBYtNIQBKaU6SaolvQnEJRpqReUJ1UIdi
			HX4iWgwIUQ6FIgpkZlEIDCEOQgpHXwi3QQA7'''


class App(object):
	def __init__(self):
		self.setup_widgets()
		
	def write_something(self):
		print("I pressed the button.")
				
	def setup_widgets(self):
		mainFrm = ttk.Frame()
		mainFrm.pack(fill='both', expand=True)
		
		img = tk.PhotoImage(data=b_pic) 
		infoBtn = ttk.Button(mainFrm, text="Info", command=self.write_something)
		infoBtn.grid(row=0, column=0)
		infoBtn['image'] = img
		infoBtn['compound'] = 'left'
		

def main():
	root = tk.Tk()
	root.title("Application")
	app = App()
	root.mainloop()


if __name__ == "__main__":
	main()
Warum das so ist, ist mir nicht ganz klar. Das folgende Beispiel klappt dagegen problemlos. Es muss also was damit zu tun haben, dass ich alles in ein Objekt gesteckt habe. Wo liegt der Fehler?

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk 

b_pic =	b'''R0lGODlhEAAQANUiANYMDLUWFsESEtGnp+jT0+YHB8KJibt9fZs/P/cCAqtd
			XcmYmP0BAeDExMwPD94KCvIEBNq4uLJsbNKpqenV1ZQxMcuamvnz89m1tffw
			8Lp6eqNOTpseHu0GBvoBAf4AAIwiIv8AAP///wAAAAAAAAAAAAAAAAAAAAAA
			AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
			AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACIALAAAAAAQABAAAAZz
			QJFwqAGBDsNkUtMJhQTKKOfjhEiiSUCo+eFghRvPMxF6fEWB0Kei9WywzFBB
			NH1i6wGRBLLVRNsbBiICal5JYSEeBYtNIQBKaU6SaolvQnEJRpqReUJ1UIdi
			HX4iWgwIUQ6FIgpkZlEIDCEOQgpHXwi3QQA7'''


def write_something():
	print("I pressed the button.")


root = tk.Tk()
root.title("Application")

mainFrm = ttk.Frame()
mainFrm.pack(fill='both', expand=True)
		
img = tk.PhotoImage(data=b_pic) 
infoBtn = ttk.Button(mainFrm, text="Info", command=write_something)
infoBtn.grid(row=0, column=0)
infoBtn['image'] = img
infoBtn['compound'] = 'left'

root.mainloop()
BlackJack

@RedSharky: Du musst eine Referenz auf das Bild behalten, sonst gibt Python den Speicher für das Objekt wieder frei und Tk kann nicht mehr darauf zugreifen.
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Es klappt. Danke für Deine kompetente und schnelle Hilfe!

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

b_pic =	b'''R0lGODlhEAAQANUiANYMDLUWFsESEtGnp+jT0+YHB8KJibt9fZs/P/cCAqtd
			XcmYmP0BAeDExMwPD94KCvIEBNq4uLJsbNKpqenV1ZQxMcuamvnz89m1tffw
			8Lp6eqNOTpseHu0GBvoBAf4AAIwiIv8AAP///wAAAAAAAAAAAAAAAAAAAAAA
			AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
			AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACIALAAAAAAQABAAAAZz
			QJFwqAGBDsNkUtMJhQTKKOfjhEiiSUCo+eFghRvPMxF6fEWB0Kei9WywzFBB
			NH1i6wGRBLLVRNsbBiICal5JYSEeBYtNIQBKaU6SaolvQnEJRpqReUJ1UIdi
			HX4iWgwIUQ6FIgpkZlEIDCEOQgpHXwi3QQA7'''


class App(object):
	def __init__(self):
		self.img = tk.PhotoImage(data=b_pic) # This makes the difference!!!
		
		self.setup_widgets() 
		 
		
	def write_something(self):
		print("I pressed the button.")
				
	def setup_widgets(self):
		mainFrm = ttk.Frame()
		mainFrm.pack(fill='both', expand=True)
		
		infoBtn = ttk.Button(mainFrm, text="Info", command=self.write_something)
		infoBtn.grid(row=0, column=0)
		infoBtn['image'] = self.img
		infoBtn['compound'] = 'left'
		

def main():
	root = tk.Tk()
	root.title("Application")
	app = App()
	root.mainloop()


if __name__ == "__main__":
	main()

Antworten