Seite 1 von 1

Unterfenster erzeugen

Verfasst: Montag 12. September 2016, 12:27
von arti73
Moin,

ich bin totaler Frischling :) früher mal programmiert, aber ist lange her. Ich mag mir ein Set von kleinen Tools für die Arbeit programmieren. Das ganze in eine GUI packen. Ich bekommen mit dem folgenden Code zwar ein Unterfenster geöffnet. Es hakt aber beim Unterfenster dabei, den Button 'quit' zu erzeugen. Fehlermeldung: 'name 'top' is not defined.

Aber wo zum Pfirsich hakt es? Ich erzeuge doch top in Zeile 53 und übergebe es bei der Instanziierung von 'unterfenster'?

Wenn mir einer helfen könnte, wäre ich dankbar. Hier ist der Code:

Code: Alles auswählen

import tkinter as tk



class Unterfenster(tk.Frame):
	def __init__(self,master=None):
		super().__init__(master)
		self.pack()
		self.create_widgets()

	def create_widgets(self):
		self.hi_there = tk.Button(self)
		self.hi_there["text"] = "Hello World\n(click me)"
		self.hi_there["command"] = self.say_hi
		self.hi_there.pack(side="top")
		self.quit = tk.Button(self, text="QUIT", fg="red", command=top.destroy)
		self.quit.pack(side="bottom")

	def say_hi(self):
		print("hi there, everyone!")



class Application(tk.Frame):

	def __init__(self, master=None):
		super().__init__(master)
		self.pack()
		self.create_widgets()

	def meldung():
		print("Hello!")

	def create_widgets(self):

		menubar = tk.Menu(root)
		filemenu = tk.Menu(menubar, tearoff=0)
		filemenu.add_command(label="Öffnen", command=Application.meldung)
		filemenu.add_command(label="Beenden", command=root.destroy)
		menubar.add_cascade(label="Datei", menu=filemenu)
		root.config(menu=menubar)

		self.hi_there = tk.Button(self)
		self.hi_there["text"] = "Hello World\n(click me)"
		self.hi_there["command"] = self.say_hi
		self.hi_there.pack(side="top")

		self.quit = tk.Button(self, text="QUIT", fg="red", command=root.destroy)
		self.quit.pack(side="bottom")

	def say_hi(self):
		print("hi there, everyone!")
		top = tk.Toplevel()
		unterfenster = Unterfenster(master=top)



root = tk.Tk()
app = Application(master=root)
app.mainloop()

Re: Unterfenster erzeugen

Verfasst: Montag 12. September 2016, 12:31
von Sirius3
@arti73: Du übergibst top unter dem Namen master an Unterfenster.__init__ und von dort weiter an tk.Frame.__init__. In Unterfenster.create_widgets stände es also unter dem Namen self.master zur Verfügung.

Zum Code: Unterfenster ist ein seltsamer Name für einen Frame. Widgets platzieren sich normalerweise nicht selbst. Das self.pack sollte also zum Erzeuger von Unterfenster verschoben werden.
hi_there und quit werden nicht weiter verwendet, müssen also kein Attribut von Unterfenster sein. Warum setzt Du die Parameter von hi_there auf eine andere Art und Weise als bei quit?

Re: Unterfenster erzeugen

Verfasst: Montag 12. September 2016, 12:38
von BlackJack
Statt `top.destroy()` würde ich auch eher `self.quit()` aufrufen, dann braucht man an der Stelle keine Referenz auf ein anderes Widget auf oberster Ebene. Dann darf man aber auf keinen Fall die Schaltfläche an das `quit`-Attribut binden, weil das die Methode verdecken würde.

Re: Unterfenster erzeugen

Verfasst: Montag 12. September 2016, 12:42
von arti73
Teil 1 funktioniert. Danke soweit :)

Den Rest schau ich mir an, wie gesagt, total neu und hab früher noch nicht objektorientiert gearbeitet. Tu ich mich noch etwas schwer mit.

Re: Unterfenster erzeugen

Verfasst: Montag 12. September 2016, 12:57
von arti73
So, habe mir den Rest auch angeschaut.

Das war ein Codeschnipsel von ZedCode. Ja, macht keinen Sinn, die Attribute anders zu setzen. Ich nehme an, die wollten unterschiedliche Möglichkeiten demonstrieren.

Danke nochmal!

Re: Unterfenster erzeugen

Verfasst: Montag 12. September 2016, 13:31
von arti73
Vielleicht eins noch:

Warum wird Frame für die Klasse gewählt und nicht Tk oder Toplevel?

Danke
arti73

Re: Unterfenster erzeugen

Verfasst: Montag 12. September 2016, 13:45
von Sirius3
@arti73: dass man von Frame erbt, hat den Vorteil, dass man den Frame in Toplevel, oder Tk oder irgendeinen anderen Frame einbinden kann.

Re: Unterfenster erzeugen

Verfasst: Montag 12. September 2016, 13:48
von arti73
Jo, verständlich. Danke :)
Jetzt bastel ich erstmal weiter. Bis zu nächsten Frage :P