Seite 1 von 1

Fenster leeren Tkinter

Verfasst: Samstag 20. April 2019, 12:25
von Scamander_1920
Dieses Programm funktioniert logischerweise nicht, weil B1.place_forget() nicht auf die lokale Variable von Button() zugreifen kann.

Code: Alles auswählen

from tkinter import*
tk = Tk()

def Button ():
    B1 = Button(tk, text="hi")
    B1.place(x=50, y= 50)
Button()
B1.place_forget()
Bisher habe ich das Problem so gelöst:

Code: Alles auswählen

from tkinter import*
tk = Tk()
B1 = Button()

def Button ():
    global B1
    B1 = Button(tk, text="hi")
    B1.place(x=50, y= 50)
Button()
B1.place_forget()
Das wird aber bei größeren Programmen sehr unübersichtlich, daher meine Frage:
Gibt es einen Befehl, der ausnahmslos alles aus einem Fenster löscht? So ungefähr tk.clear().
Vielen Dank schonmal im Vorhinein.

Re: Fenster leeren Tkinter

Verfasst: Samstag 20. April 2019, 12:44
von Sirius3
das ganze funktioniert gar nicht, weil Du die tk-Button-Klasse durch Deine Funktion überdeckst. Daher verwende keine *-Importe, halte Dich an die Namenskonvention, dass Variablen, Funktionen klein_mit_unterstrich geschrieben werden und nur Klassen mit großem Anfangsbuchstaben.
Vergiß, dass es ›global‹ gibt, sondern benutze eigene Klassendefinitionen, wie man sie bei jeder etwas komplexeren GUI braucht, um den Überblick zu behalten.

Re: Fenster leeren Tkinter

Verfasst: Samstag 20. April 2019, 12:56
von __blackjack__
@Scamander_1920: `place()` sollte man auch nicht verwenden und die Anforderung alles in einem Fenster zu löschen ist relativ ungewöhnlich. *Wenn* ich so etwas machen wollen würde, würde ich alles was zusammen entfernt werden soll in einen `Frame` stecken, und denn dann mit der entsprechenden Methode ”vergessen”.

Aber welches Problem willst Du denn *eigentlich* lösen?

Re: Fenster leeren Tkinter

Verfasst: Samstag 20. April 2019, 21:40
von Code_Bender
Ich würde es so machen:
Mit Destroy()

Code: Alles auswählen

import tkinter as tk
from functools import partial

class OOP():
    def __init__(self):
        self.Window = tk.Tk()
        self.create_widgets()
    def create_widgets(self):
        def Delete(self):
            self.Button_1.destroy()
        self.Button_1 = tk.Button(self.Window, text="hi", command = partial(Delete, self))
        self.Button_1.pack()
		
oop = OOP()
oop.Window.mainloop()
Ich hoffe das du das meinst.

Re: Fenster leeren Tkinter

Verfasst: Samstag 20. April 2019, 22:50
von __blackjack__
@Code_Bender: Err, nein – einfach nur nein.

Re: Fenster leeren Tkinter

Verfasst: Sonntag 21. April 2019, 21:58
von Code_Bender
Was ist denn?

Re: Fenster leeren Tkinter

Verfasst: Sonntag 21. April 2019, 22:29
von __blackjack__
@Code_Bender: Der Klassenname ist Unsinn, die Schreibweisen entsprechen nicht den Python-Namenskonventionen, das Erzeugen der Widgets in eine eigene Methode auszulagern ist überflüssig, die lokale Funktion sollte eine Methode sein, `self` dort zu übergeben ist aber so total überflüssig, dementsprechend ist das `functools.partial()` sinnfrei, letztlich sind sowohl Funktion als auch Methode dafür überflüssig, denn da wird ja nur die `destroy()`-Methode vom `Button`-Objekt aufgerufen – die hätte man auch direkt als `command` angeben können, Namen nummerieren ist ein „code smell“ und hier einfach nur unsinnig, und auf Modulebene sollte man keine Variablen definieren.

Effektiv bleibt das hier übrig:

Code: Alles auswählen

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


def main():
    window = tk.Tk()
    button = tk.Button(window, text='hi')
    button.pack()
    button['command'] = button.destroy
    window.mainloop()


if __name__ == '__main__':
    main()