Tk inter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Loster_Paddel
User
Beiträge: 39
Registriert: Samstag 16. April 2022, 20:31

Hallo,
ich mal wieder mit den mittlerweile bekanntenm Prgramm, an dem ich mal wieder arbeite
Ich verstehe den Fehlercode gar nicht und habe schon etliche Sachen ausprobiert.

Code: Alles auswählen

import tkinter as tk
from datetime import date, datetime

def main():
    root = tk.Tk()
    root.title("Punktezähler")

    namen = ["Peter", "Justus", "Bob"]
    punkte = [100,50.10]
    uhrzeit = tk.Label(root, text= datetime.now().strftime('%H:%M'))
    spiel_typ = tk.Label(root, text = "Spiel Typ")
    datum = tk.Label(root, text = date.today().strftime("%d.%m"))
    frame = tk.Frame(root)
    scrollbar = tk.Scrollbar(frame)
    namensbox = tk.Listbox(frame, yscrollcommand=scrollbar.set, width=20)
    punktebox = tk.Listbox(frame, yscrollcommand=scrollbar.set, width=20)

    uhrzeit.pack(padx=10, pady=10, side= "left")
    spiel_typ.pack(padx=10, pady=10, side= "left")
    datum.pack(padx=10, pady=10,side = "left")
    namensbox.pack(frame, side= "left")
    punktebox.pack(frame, side= "left")
    scrollbar.pack(frame, side= "left", fill=tk.Y)

    for name in namen:
        namensbox.insert("end", name)

    for punkt in punkte:
        punktebox.insert("end", punkt)
    root.mainloop()

if __name__ == '__main__':
    main()
Loster_Paddel
User
Beiträge: 39
Registriert: Samstag 16. April 2022, 20:31

Okay habs doch gefunden. Beim pack kommt nciht noch einmal Frame. Wenn ich das Frame aber wegmache, kommt gar nichts
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Loster_Paddel: Das die `pack()`-Aufrufe nicht da stehen wo die Objekte erzeugt werden, sondern alle für alle Containerwidgets am Ende ist nicht gerade übersichtlich. Ich verliere da total die Übersicht auf welches Elternwidget sich da welches `pack()` bezieht. Vielleicht hast Du ja auch deswegen einfach übersehen, dass der `frame` überhaupt nicht ge`pack()`\t wird, weshalb er auch nicht angezeigt wird.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from datetime import date, datetime


def main():
    root = tk.Tk()
    root.title("Punktezähler")

    namen = ["Peter", "Justus", "Bob"]
    punkte = [100, 50.10]
    
    pack_options = {"padx": 10, "pady": 10, "side": tk.LEFT}
    uhrzeit = tk.Label(root, text=datetime.now().strftime("%H:%M"))
    uhrzeit.pack(pack_options)
    spiel_typ = tk.Label(root, text="Spiel Typ")
    spiel_typ.pack(pack_options)
    datum = tk.Label(root, text=date.today().strftime("%d.%m"))
    datum.pack(pack_options)
    
    frame = tk.Frame(root)
    scrollbar = tk.Scrollbar(frame)
    namensbox = tk.Listbox(frame, yscrollcommand=scrollbar.set, width=20)
    punktebox = tk.Listbox(frame, yscrollcommand=scrollbar.set, width=20)
    namensbox.pack(side=tk.LEFT)
    punktebox.pack(side=tk.LEFT)
    scrollbar.pack(side=tk.LEFT, fill=tk.Y)
    frame.pack(side=tk.LEFT)

    for name in namen:
        namensbox.insert(tk.END, name)

    for punkt in punkte:
        punktebox.insert(tk.END, punkt)

    root.mainloop()


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast drei Namen, aber nur zwei Punkte, da fehlt also einer.
Du bestimmst Uhrzeit und Datum unabhängig voneinander, das kann also fast 24Stunden daneben liegen. Uhrzeit und Datum bestimmt man immer mit EINEM Aufruf.
Da fehlt ein `frame.pack()`.

Code: Alles auswählen

import tkinter as tk
from datetime import datetime

def main():
    root = tk.Tk()
    root.title("Punktezähler")

    namen = ["Peter", "Justus", "Bob"]
    punkte = [100, 50, 10]
    now= datetime.now()
    uhrzeit = tk.Label(root, text=now.strftime('%H:%M'))
    spiel_typ = tk.Label(root, text="Spiel Typ")
    datum = tk.Label(root, text=now.strftime("%d.%m"))
    frame = tk.Frame(root)
    scrollbar = tk.Scrollbar(frame)
    namensbox = tk.Listbox(frame, yscrollcommand=scrollbar.set, width=20)
    punktebox = tk.Listbox(frame, yscrollcommand=scrollbar.set, width=20)

    uhrzeit.pack(padx=10, pady=10, side= "left")
    spiel_typ.pack(padx=10, pady=10, side= "left")
    datum.pack(padx=10, pady=10,side = "left")
    frame.pack()
    namensbox.pack(side= "left")
    punktebox.pack(side= "left")
    scrollbar.pack(side= "left", fill=tk.Y)

    for name in namen:
        namensbox.insert("end", name)

    for punkt in punkte:
        punktebox.insert("end", punkt)
    root.mainloop()

if __name__ == '__main__':
    main()
Loster_Paddel
User
Beiträge: 39
Registriert: Samstag 16. April 2022, 20:31

Okay das ergibt schon alles Sinn. Jetzt klatscht der es aber so hässlich in eine Zeile. Ab wann, "eroffnet" der pack Manager eine neue Zeile. DOch eigentlich mit pack(). Hier macht er das aber nicht...
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Loster_Paddel: Der `pack()`-Manager eröffnet keine neuen Zeilen. Da Du hier tk.LEFT verwendet wird im `root`-Fenster wird nebeneinander platziert. Wenn Du den Frame unter den anderen Widgets haben möchtest, müssten die auch in einem Frame stecken und die beiden Frames müssten mit `tk.TOP` ge`pack()`t werden. Innerhalb eines Container-Widgets sollte man `pack()` immer nur mit dem gleichen `side`-Wert verwenden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Loster_Paddel
User
Beiträge: 39
Registriert: Samstag 16. April 2022, 20:31

Vorher habe ich noch nie mit Frames gearbeitet. Deswegen war ich ein bisschen durcheinander. Also einfach einen neuen Träne erstellen, den mit packen und wieder erneut einfüllen? Dann habe ich doch am Ende ziemlich viele verschiedene Frames verschiedene Frames oder?
Loster_Paddel
User
Beiträge: 39
Registriert: Samstag 16. April 2022, 20:31

So langsam wirds... Aber das ist doch keine richtige Scrollbar. Was ist mit dem Schieberegler. Alles was ich mir durchlese, ist genau so, nur das deren Scrollbar viel viel besser aussieht. Was mache ich hier wieder falsch?!

Code: Alles auswählen

import tkinter as tk
from datetime import date, datetime


def main():
    root = tk.Tk()
    root.title("Punktezähler")

    namen = ["Peter", "Justus", "Bob","Peter", "Justus", "Bob","Peter", "Justus", "Bob","Peter", "Justus", "Bob","Peter", "Justus", "Bob","Peter", "Justus", "Bob","Peter", "Justus", "Bob"]
    punkte = [100, 50, 10,100, 50, 10,100, 50, 10,100, 50, 10,100, 50, 10,100, 50, 10,100, 50, 10,100, 50, 10,100, 50, 10,100, 50, 10]
    
    labels_pack_options = {"padx": 10, "pady": 10, "side": tk.LEFT}
    other_pack_options = {"padx": 5, "pady": 10, "side": tk.LEFT}

    titelFrame = tk.Frame(root)
    titelFrame.pack()
    uhrzeit = tk.Label(titelFrame, text=datetime.now().strftime("%H:%M"))
    uhrzeit.pack(labels_pack_options)
    spiel_typ = tk.Label(titelFrame, text="Spiel Typ")
    spiel_typ.pack(labels_pack_options)
    datum = tk.Label(titelFrame, text=date.today().strftime("%d.%m"))
    datum.pack(labels_pack_options)
    
    boxenFrame = tk.Frame(root)
    boxenFrame.pack()

    scrollbar = tk.Scrollbar(boxenFrame)
    namensbox = tk.Listbox(boxenFrame, yscrollcommand=scrollbar.set, width=20)
    namensbox.pack(other_pack_options)
    punktebox = tk.Listbox(boxenFrame, yscrollcommand=scrollbar.set, width=20)
    punktebox.pack(other_pack_options)

    scrollbar.config(command=namensbox.yview)
    scrollbar.pack(fill=tk.Y)

    for name in namen:
        namensbox.insert(tk.END, name)

    for punkt in punkte:
        punktebox.insert(tk.END, punkt)

    root.mainloop()


if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt hast Du 21 Namen aber 30 Punkte. Das zeigt, warum man nicht zusammengehörende Daten in getrennten Listen speichert, sondern in EINER Liste. Den Punkt mit dem `datetime` hast Du auch noch nicht repariert, der selbe Fehler ist in Deinem neuen Code immer noch drin.
Und den anderen Fehler, den __blackjack__ angesprochen hat, führt nun zu dem seltsamen Verhalten, das Du siehst: das side-Argument muß bei allen Widgets, die in einen Frame ge`pack`t werden, das selbe sein.
`yview` muß für beide Listen aufgerufen werden und auch jeweils für die andere Liste, wenn ein yscollcommand ausgelöst wird.
Antworten