Komischer Abstand in TkInter

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 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
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Loster_Paddel
User
Beiträge: 39
Registriert: Samstag 16. April 2022, 20:31

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?
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten