Python GUI Labels stapeln sich

Fragen zu Tkinter.
Antworten
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

Hallo, ich habe hier ein Programm bei dem eine Zahl ausgelost wird, wenn man den Knopf drückt. Nur missfällt es mir, dass sich die Zahlen untereinader stapeln, wenn man den Knopf mehrmals betätigt. Weiß da jemand weiter? Schonmal danke im voraus. :) Hier der code:

Code: Alles auswählen

from tkinter import *
import random

fenster=Tk()
fenster.geometry("600x600")
def test():
    a=random.randint(1,5)
    if a==1:
        label1=Label(fenster, text="1")
        label1.pack()
    elif a==2:
        label1=Label(fenster, text="2")
        label1.pack()
    elif a==3:
        label1=Label(fenster, text="3")
        label1.pack()
    elif a==4:
        label1=Label(fenster, text="4")
        label1.pack()
    elif a==5:
        label1=Label(fenster, text="5")
        label1.pack()
        
button1=Button(fenster, text="Knopf", command=test)
button1.pack()
BlackJack

@Duardo: Vielleicht solltest Du noch dazu sagen was stattdessen passieren soll. Sollen sie nebeneinander erscheinen? Oder übereinander? Dann schau Dir das `side`-Argument von `pack()` an.
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

BlackJack hat geschrieben:@Duardo: Vielleicht solltest Du noch dazu sagen was stattdessen passieren soll. Sollen sie nebeneinander erscheinen? Oder übereinander? Dann schau Dir das `side`-Argument von `pack()` an.
Es soll immer das selbe Label bleiben, nur dass sich immer die Zahlen verändern. Also, dass wenn da zum Beispiel eine 1 steht und man den Knopf drückt sich diese Zahl zum Beispiel zu einer 4 ändert.
BlackJack

@Duardo: Dann darfst Du ganz einfach nicht jedes mal ein neues Label erzeugen sondern musst einmal eines erzeugen und von dem dann nur den Text ändern.

Code: Alles auswählen

try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk
from functools import partial
from random import randint


def set_radom_text(label):
    label['text'] = randint(1, 5)


def main():
    root = tk.Tk()
    label = tk.Label(root)
    label.pack()
    tk.Button(root, text='Knopf', command=partial(set_radom_text, label)).pack()
    root.mainloop()


if __name__ == '__main__':
    main()
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

@BlackJack: Danke für die hilfreiche Antwort :D
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

@BlackJack: Wo wir schon beim Thema stapeln sind: Ich habe hier nämlich noch ein Problem. Und zwar stapeln sich bei mir auch die Buttons. Hier der Beispielcode:

Code: Alles auswählen

from tkinter import *

def test():
    button=Button(text="test")
    button.pack()

button1=Button(text="test2", command=test)
button1.pack()

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

@Duardo: und zwar aus dem gleichen Grund wie die Labels.
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

Sirius3 hat geschrieben:@Duardo: und zwar aus dem gleichen Grund wie die Labels.
Wie mache ich das denn? Im Gegensatz zu den Labels möchte ich ja beide Buttons behalten.
BlackJack

@Duardo: Welche beiden? Du hast eine Schaltfläche die eine Funktion aufruft die jedes mal eine weitere Schaltfläche erzeugt. Genau wie vorher bei den Labels.
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

@BlackJack: Ja dann sag doch bitte wie. Ich habe hier ja keine Labels, bei denen ich immer den Text ändere. Und sag bitte nicht wieder, dass ich es wie bei den Labels machen soll. Das bringt mich nicht weiter.
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

Hat sich wieder erledigt, habe die Buttons mit dem place() befehl auf eine Stelle gepackt, dann klappt es.
BlackJack

@Duardo: Das ist ziemlicher sicher keine Lösung sondern ein ganz ekliger Hack. `place()` ist sowieso schon eine schlechte Lösung und Du beseitigst hier nicht die Ursache sondern doktorst nur am Symptom herum.
Duardo
User
Beiträge: 54
Registriert: Mittwoch 2. Juli 2014, 16:56

@BlackJack: Natürlich ist es eine Lösung und kein "Hack". Ich bediene mich dem, was ich mit tkinter bekomme und solange es funktioniert, ist es in meinen Augen weder ein Hack, noch ein herumdoktieren an dem Symptom.
BlackJack

@Duardo: Das ist eine ziemlich unsinnige Auffassung. Denn dann gibt es ja überhaupt keine Hacks wenn ”funktioniert” der einzige Massstab ist. Ist er aber für normale Programmierer nicht.

Du stapelst Widgets übereinander die alle immer wieder gezeichnet werden, also Speicherplatz und Rechenzeit verbrauchen, obwohl man letztlich nur jeweils den letzten von den Buttons sehen und verwenden kann. Das ist ein Hack. Und kein schöner. Das ist herumdoktorn am Symptom, und zwar definitiv, denn statt die Ursache: das erzeugen von vielen unnötigen Buttons zu beseitigen, versteckst Du den Unsinn nur vorm Benutzer. Dazu noch mit `place()`, was eine schlechte Lösung ist, selbst wenn man keine unnötigen Button-Objekte erstellen würde.
Antworten