image in GUI

Fragen zu Tkinter.
Antworten
Haphie
User
Beiträge: 5
Registriert: Montag 25. August 2014, 13:07

Hallo zusammen,
ich versuche seit einiger Zeit ein Bild in ein GUI-Fenster einzufügen, habe allerdings noch nicht allzu viel Erfahrung mit Tkinter. Der folgende Code funktioniert wunderbar und das ganze sieht auch so aus, wie ich mir das vorgestellt hab.

Code: Alles auswählen

from Tkinter import *
from PIL import ImageTk, Image

root = Tk()
root.geometry("600x300")
img = ImageTk.PhotoImage(Image.open("wald.jpg"))
panel = Label(root, image = img)
panel.pack(side = "bottom", fill = "both", expand = "yes")

labelFrame = LabelFrame(panel,text = "Wählen Sie")
labelFrame.pack(expand ="yes")

chosen = IntVar()		
Radiobutton(labelFrame, text = "Option 1", variable = chosen, value = 1).pack(padx=50, pady=10)
Radiobutton(labelFrame, text = "Option 2", variable = chosen, value = 2).pack(padx=50, pady=10)
Button(labelFrame, text = "OK", width = "10").pack(padx=20, pady=10)

root.mainloop()
Mein bisheriger Code ist allerdings als Klasse mit mehreren Methoden aufgebaut und ich bekomme es einfach nicht hin, das Bild dort einzufügen. Nach meinem Verständnis sollte der Code unten eigentlich das gleiche Fenster erzeugen, wie der Code oben:

Code: Alles auswählen

from Tkinter import *
from PIL import ImageTk, Image

class GUI(Frame):
	def __init__ (self, master):
		Frame.__init__(self, master)
		self.pack(fill = "both", expand = "yes")
		self.create_widgets()
			
	def create_widgets(self):
		img = ImageTk.PhotoImage(Image.open("wald.jpg"))
		panel = Label(self, image = img)
		panel.pack(side = "bottom", fill = "both", expand = "yes")

		labelFrame = LabelFrame(panel,text = "Wählen Sie")
		labelFrame.pack(expand ="yes")

		chosen = IntVar()		
		Radiobutton(labelFrame, text = "Option 1", variable = chosen, value = 1).pack(padx=50, pady=10)
		Radiobutton(labelFrame, text = "Option 1", variable = chosen, value = 2).pack(padx=50, pady=10)
		Button(labelFrame, text = "OK", width = "10").pack(padx=20, pady=10)

root = Tk()
root.geometry("600x300")
app = GUI(root)
root.mainloop()
Bestimmt übersehe ich eine Kleinigkeit, oder habe was falsch verstanden. Wäre super, wenn sich das mal jemand angucken könnte und mir einen Tipp gibt.
Vielen Dank schon mal :)
Sirius3
User
Beiträge: 18328
Registriert: Sonntag 21. Oktober 2012, 17:20

@Haphie: wenn Du nach "image" und "TK" hier im Forum suchst, wirst Du duzende Beiträge mit dem selben Problem finden: "img" ist eine lokale Variable, wird also nach beenden von "create_widgets" abgeräumt, und das Bild im Label gleich mit. Du mußt eine Referenz auf "img" irgendwo speichern, so dass es nicht verloren geht.
Haphie
User
Beiträge: 5
Registriert: Montag 25. August 2014, 13:07

Sirius3 hat geschrieben:@Haphie: wenn Du nach "image" und "TK" hier im Forum suchst, wirst Du duzende Beiträge mit dem selben Problem finden: "img" ist eine lokale Variable, wird also nach beenden von "create_widgets" abgeräumt, und das Bild im Label gleich mit. Du mußt eine Referenz auf "img" irgendwo speichern, so dass es nicht verloren geht.
Super, danke! :) Der Hinweis hat mir schon sehr geholfen. Ich habe die Variable jetzt einfach global angelegt und damit klappt es.
BlackJack

@Haphie: Das mag funktionieren ist aber keine Lösung. Dann kannst Du Dir die Klasse auch gleich wieder sparen wenn Du dafür eine globale Variable verwendest.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

am einfachsten ist es, statt "img = " in deiner Klasse einfach "self.img = " zu machen.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten