Wie lösche ich ein bestimmtes Label von einen PanedWindow

Fragen zu Tkinter.
Antworten
PotterParsel
User
Beiträge: 20
Registriert: Montag 5. September 2022, 08:58

Hallo zusammen,

was muss ich in meine die Methode deleteLetter reinschreiben, wenn ein bestimmtes Label gelöscht werden soll?

Mein Code:

Code: Alles auswählen

import tkinter as tk

letters =["a","b","c","d"]

tkEvent = tk.Tk()
tkEvent.geometry("300x300")


letterPanel = tk.PanedWindow(tkEvent)
letterPanel.place(x=5,y=5,height=200, width=200)

x = 5
y = 5

def deleteLetter(event):

    print("gelöscht")


for l in letters:

    letterLabel = tk.Label( letterPanel,text=l)
    letterLabel.place(x=x,y=y, width=50, height=32)


    deleteLabel = tk.Label(letterPanel, text="X")

    deleteLabel.place(x=x+50, y=y, width=32, height=32)

    deleteLabel.bind("<Button-1>", deleteLetter)
    y = y + 40


tkEvent.mainloop()
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen werden generell klein_mit_unterstrich geschrieben.
Einbuchstabige Variablennamen sind schlecht, vor allem `l` das man leicht mit `I` oder `1` verwechseln kann.
Man definiert keine festen Fenstergröße, und platziert keine Elemente an fixen Positionen mit place.
Statt eines delete-Labels ist der Nutzer es eher gewöhnt, einen Knopf zu benutzen.

Code: Alles auswählen

import tkinter as tk
from functools import partial


def hide_label(label):
    label.grid_forget()

def main():
    letters =["a","b","c","d"]

    tk_event = tk.Tk()

    letter_panel = tk.PanedWindow(tk_event)
    letter_panel.pack()

    labels = []
    for row, letter in enumerate(letters):
        label = tk.Label(letter_panel, text=letter)
        label.grid(row=row, column=0)
        labels.append(label)
        delete_button = tk.Button(letter_panel, text="X", command=partial(hide_label, label))
        delete_button.grid(row=row, column=1)
    tk_event.mainloop()

if __name__ == "__main__":
    main()
Es ist unüblich, dass man Fensterelemente löscht, der Nutzer wäre verwirrt, wenn plötzlich Elemente verschwinden. Daher die Frage: was willst Du eigentlich machen? Warum sollen Labels verschwinden?
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PotterParsel: Noch ergänzend: Die Frage hat nicht wirklich was mit `PanedWindow` zu tun, und das wird hier falsch verwendet. Da steckt man keine einzelnen Widgets direkt rein, sondern benutzt `add()`. Sonst funktioniert das nicht so wie es gedacht ist.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
PotterParsel
User
Beiträge: 20
Registriert: Montag 5. September 2022, 08:58

Ich programmiere gerade ein 2D spiel, weshalb es wichtig ist, dass das Label verschwinden, wenn man drauf drückt.

Warum platziert man keine Elemente an fixen Positionen, mit place?


Sirius3 hat geschrieben: Mittwoch 12. Oktober 2022, 10:23 Variablennamen werden generell klein_mit_unterstrich geschrieben.
Einbuchstabige Variablennamen sind schlecht, vor allem `l` das man leicht mit `I` oder `1` verwechseln kann.
Man definiert keine festen Fenstergröße, und platziert keine Elemente an fixen Positionen mit place.
Statt eines delete-Labels ist der Nutzer es eher gewöhnt, einen Knopf zu benutzen.

Code: Alles auswählen

import tkinter as tk
from functools import partial


def hide_label(label):
    label.grid_forget()

def main():
    letters =["a","b","c","d"]

    tk_event = tk.Tk()

    letter_panel = tk.PanedWindow(tk_event)
    letter_panel.pack()

    labels = []
    for row, letter in enumerate(letters):
        label = tk.Label(letter_panel, text=letter)
        label.grid(row=row, column=0)
        labels.append(label)
        delete_button = tk.Button(letter_panel, text="X", command=partial(hide_label, label))
        delete_button.grid(row=row, column=1)
    tk_event.mainloop()

if __name__ == "__main__":
    main()
Es ist unüblich, dass man Fensterelemente löscht, der Nutzer wäre verwirrt, wenn plötzlich Elemente verschwinden. Daher die Frage: was willst Du eigentlich machen? Warum sollen Labels verschwinden?
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PotterParsel: Wie gross GUI-Elemente in Pixeln sind, hängt normalerweise vom Inhalt ab, und der hängt sehr oft von den Systemeinstellungen ab, die wiederum in Abhängigkeit von Bildschirmgrösse und -auflösung gesetzt werden. Und die Plattform und Theme-Einstellungen können auch einen Einfluss darauf haben wie gross GUI-Elemente sind, zum Beispiel was Rahmendicke oder Minimalabstände angeht. Wenn man also eine GUI auf einem System pixelgenau setzt, funktioniert das selbst auf dem selben System nicht mehr wenn die im System eingestellte Schriftgrösse anders ist, und auf anderen Systemen kann es noch mehr Unterschiede geben. Dann wird die GUI entweder mit mehr Platz zwischen den Anzeigeelementen dargestellt, oder mit zu wenig Platz und Elemente fangen an sich zu überlappen. Das kann so weit gehen, dass die Oberfläche dadurch unbenutzbar wird. Darum benutzt man kein `place()`.

Bei 2D-Spiel ist die Frage was das genau bedeutet. Und selbst dann ist `place()` eher nicht die Antwort, sondern `Canvas`.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn es ein Spiel sein soll, dann ist das ggf. besser durch pygame darstellbar. Das ist fuer solche Aufgaben eher gemacht. Auch wenn man mit Canvas natuerlich weit kommt.
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast die Frage nach dem "warum" nicht beantwortet, sondern nur, dass Du denkst, die Lösung wäre ein verschwinden eines Labels. Was für ein 2d-Spiel ist das? Was sollen die Labels darstellen? Sind Labels dann das richtige Element, oder ist ein Canvas nicht vielleicht besser geeignet?
Antworten