Fenster leeren Tkinter

Fragen zu Tkinter.
Antworten
Scamander_1920
User
Beiträge: 31
Registriert: Sonntag 26. November 2017, 11:57

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.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Code_Bender
User
Beiträge: 21
Registriert: Sonntag 6. Januar 2019, 12:32

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Code_Bender: Err, nein – einfach nur nein.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Code_Bender
User
Beiträge: 21
Registriert: Sonntag 6. Januar 2019, 12:32

Was ist denn?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten