Seite 1 von 1
Tk inter
Verfasst: Samstag 18. Juni 2022, 16:51
von Loster_Paddel
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()
Re: Tk inter
Verfasst: Samstag 18. Juni 2022, 16:53
von Loster_Paddel
Okay habs doch gefunden. Beim pack kommt nciht noch einmal Frame. Wenn ich das Frame aber wegmache, kommt gar nichts
Re: Tk inter
Verfasst: Samstag 18. Juni 2022, 17:17
von __blackjack__
@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()
Re: Tk inter
Verfasst: Samstag 18. Juni 2022, 17:19
von Sirius3
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()
Re: Tk inter
Verfasst: Sonntag 19. Juni 2022, 07:18
von Loster_Paddel
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...
Re: Tk inter
Verfasst: Sonntag 19. Juni 2022, 09:08
von __blackjack__
@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.
Re: Tk inter
Verfasst: Montag 20. Juni 2022, 08:03
von Loster_Paddel
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?
Re: Tk inter
Verfasst: Montag 20. Juni 2022, 13:48
von Loster_Paddel
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()
Re: Tk inter
Verfasst: Montag 20. Juni 2022, 14:00
von Sirius3
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.