Seite 1 von 1
Komischer Abstand in TkInter
Verfasst: Montag 6. Juni 2022, 12:53
von Loster_Paddel
Hallo,
ich versuche mich gerade mal wieder mit Tkinter. Zurzeit mit Scrollbars...
Mien Code sieht wie folgt aus:
Code: Alles auswählen
from tkinter import *
root = Tk()
root.geometry("400x400")
root.title("Test mit Scrollbars und Listboxen")
namen = ["Justus", "Peter", "Bob"]
punkte = [7, 10, 9]
scrollbar = Scrollbar(root)
namensbox = Listbox(root, yscrollcommand = scrollbar.set, width = 20)
punktebox = Listbox(root, yscrollcommand = scrollbar.set, width = 20)
Überschrift = Label(root, text = "Listen", pady = 10)
Überschrift.pack()
namensbox.pack(side = "left")
punktebox.pack(side = "left")
scrollbar.pack(side = "left")
root.mainloop()
Ich kann mir den Abstand zwischen dem Label oben und dann den Listbocen und der scrollbar nciht erklären. Ich weiß, dass ich die noch befüllen muss und alles, aber das wäre erst der nächste Step. Unter anderem, hätte ich die Listboxen gerne in der Mitte, aber dann weiß ich nciht, wie ich das machen soll, dass diese mit der Scrollbar nebeneinander stehen...
Danke
Re: Komischer Abstand in TkInter
Verfasst: Montag 6. Juni 2022, 14:25
von __blackjack__
@Loster_Paddel: Lass doch einfach mal den `geometry()`-Aufruf weg. Wobei das auch ein bisschen ”gefährlich” ist `side` so zu mischen. Das hätte auch anders ausgehen können. Ich würde in einem Container immer den gleichen `side`-Wert nehmen.
Ansonsten: Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 140 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).
Wenn es eine Konstante im `tkinter`-Modul für Werte mit festen Bedeutungen gibt, sollte man die verwenden, statt eine literale Zeichenkette mit dem Wert zu verwenden.
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
def main():
root = tk.Tk()
root.title("Test mit Scrollbars und Listboxen")
namen = ["Justus", "Peter", "Bob"]
punkte = [7, 10, 9]
tk.Label(root, text="Listen", pady=10).pack()
frame = tk.Frame(root)
scrollbar = tk.Scrollbar(frame)
namensbox = tk.Listbox(frame, yscrollcommand=scrollbar.set, width=20)
namensbox.insert(0, *namen)
punktebox = tk.Listbox(frame, yscrollcommand=scrollbar.set, width=20)
punktebox.insert(0, *punkte)
namensbox.pack(side=tk.LEFT)
punktebox.pack(side=tk.LEFT)
scrollbar.pack(side=tk.LEFT, fill=tk.Y)
frame.pack()
root.mainloop()
if __name__ == "__main__":
main()
Re: Komischer Abstand in TkInter
Verfasst: Montag 6. Juni 2022, 16:51
von Loster_Paddel
Erstmal danke. Das mit der modulebene und dem ganzen zeugs weiß ich schon. Das war nur ein ganz schnelles Programm zum Testen.
Das mit dem Import as tk ist doch voll nervig, weil ich jetzt die ganze Zeit tk vorschreiben muss oder nicht? Wie siehst aus mit Import tkinter?
Außerdem wenn er die Boxen und die scrollbar in eine Zeile packt. Wie siehts aus, wenn ich jetzt etwas anderes packen will. Wieso sollte er genau dann eine neue Zeile nehmen?
Re: Komischer Abstand in TkInter
Verfasst: Montag 6. Juni 2022, 18:41
von __blackjack__
@Loster_Paddel: Ich finde es deutlich nerviger wenn man nicht weiss wo ein Name her kommt oder wenn es Namenskollisionen gibt, oder wenn man Sachen importiert mit denen man so überhaupt nicht rechnet, beispielsweise das `re`-Modul. Das ist in ``from tkinter import *`` mit dabei. Oder auch nicht. Kommt auf die Python-Version an. Man importiert mit dem * ja nicht nur was im `tkinter`-Modul definiert ist, sondern auch alles was dieses Modul selbst von woanders importiert. Ich weiss nicht was das alles ist, und in welcher Python-Version sich das ändert oder nicht.
Die letzte Frage verstehe ich nicht so wirklich. Ich habe jetzt im Hauptfenster implizit ``pack(side=tk.TOP)`` verwendet. Wenn man da mehr rein packt sollte man das auch so machen, das wird dann jeweils unten angehängt. Wenn man unter dem bisherigen mehrere Sachen nebeneinander packen will, dann geht das genau so wie ich das mit den Listboxen und der Scrollbar gemacht habe: man packt das horizintal in einen `Frame` und hängt den dann unten an.