Fenster öffnen und schliessen - Anfängerproblem

Fragen zu Tkinter.
Antworten
samaha73
User
Beiträge: 8
Registriert: Freitag 13. Dezember 2019, 12:09

Hallo alle zusammen,

ich bin blutiger Anfänger in Sachen programmieren, und versuche eine Lösung für folgendes Problem zu finden. Wenn möglich ohne Klassen.. Leider hat meine echt lange Internetrecherche nichts ergeben.
Daher versuche ich es mal auf diesem Wege. Kann mir jemand sagen warum folgender Code nicht funktioniert? Geht sowas ohne Klassen gar nicht?

ich möchte einfach ein Widget per button auf und wieder zu machen. Klang zunächst einfach .. :)

Wäre echt riesig wenn mir jemand helfen kann, oder erklären warum das so nicht geht..


############################
#!/usr/bin/python
# -*- coding: utf-8 -*-

import Tkinter as tk

###########################
def close_root():
root.destroy()
def close_w():
w.destroy()
def open_w():
w = tk.Toplevel(root)
l1 = tk.Label(w, text="--> w <--").pack()
def open_root():
root = tk.Tk()
root.title('root Fenster')
l1 = tk.Label(root, text="--> root <--").pack()
b1 = tk.Button(root,text='Beenden', command = close_root)
b1.pack()
b2 = tk.Button(root,text='w öffnen', command = open_w)
b2.pack()
b3 = tk.Button(root,text='w beenden', command = close_w)
b3.pack()
root.mainloop()


###########################
if __name__ == '__main__':
open_root()
Sirius3
User
Beiträge: 18221
Registriert: Sonntag 21. Oktober 2012, 17:20

Python2 sollte man nicht mehr einsetzen. Nimm Python3. Diese lustingen Gartenzäune strören das Lesen und sollten gelöscht werden. Wenn eine Funktion nur aus einem anderen Funktionsaufruf besteht, kann man das auch gleich an der Stelle, wo die andere Funktion steht hinschreiben, wie bei close_root und close_w. `root` und `w` sind eh nicht definiert. ` w` ist übrigens ein schlechter Name.
Man muß nicht alles an Variablennamen binden, vor allem nicht, wenn es so schlechte Namen sind wie b1,b2,b3. An ` l1` wird nur None gebunden. In ` open_w` mußt Du noch root übergeben und irgendwie `w` zurückgeben, was aber nicht geht. Ergo, Du brauchst eine Klasse:

Code: Alles auswählen

#!/usr/bin/python3
import tkinter as tk

class Mainwindow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('root Fenster')
        self.window = None
        tk.Label(self, text="--> root <--").pack()
        tk.Button(self, text='Beenden', command=self.destroy).pack()
        tk.Button(self, text='w öffnen', command=self.open_window).pack()
        tk.Button(self, text='w beenden', command=self.close_window).pack()

    def close_window(self):
        self.window.destroy()

    def open_window(self):
        self.window = tk.Toplevel(self)
        tk.Label(self.window, text="--> w <--").pack()
        

def open_root():
    root = Mainwindow()
    root.mainloop()
    
if __name__ == '__main__': 
    open_root()
Jetzt gibt es noch das Problem, dass man den w-öffnen-Knopf mehrfach drücken kann und der w-beenden-Knopf auch gedrückt werden kann, wenn es noch gar kein Fenster gibt.
samaha73
User
Beiträge: 8
Registriert: Freitag 13. Dezember 2019, 12:09

hmm erstmal Vielen Dank für die schnelle Antwort.

Da ich im Internet und hier im Forum nicht fündig geworden bin, habe ich mir sowas leider schon gedacht.
Dann muss ich mich doch mit den Klassen auseinander setzen. Einen Extradank für die Umsetzung mit einer Klasse :)

Die Möglichkeit den Knopf mehrfach zu drücken ist natürlich auch ungünstig..



Dann bin ich erstmal wieder am Anfang ... :)))
Antworten