Hilfe bei Notebook-Tabs

Fragen zu Tkinter.
Antworten
Benutzeravatar
DasWollvieh
User
Beiträge: 2
Registriert: Mittwoch 1. März 2023, 16:00

Hallo, ich bräuchte mal ein kleines bisschen Hilfe mit dem ttk.Notebook.

Ich möchte einen Charsheed für ein Pen & Paper bauen, bei dem man jedem Charakter einen eigenen Tab zuordnen kann.
Beim herumprobieren ist mir aufgefallen, das ich zwar Taps mit verschiedenen werten der Charaktere erstellen kann, diese aber vom nächsten gleich wieder überschrieben werden, wenn ich einen neuen Reiter erstelle.

Gibt es die Möglichkeit, die Daten den spezifischen Taps zu zu ordnen und mit ihnen zu arbeiten?

Hier ein kleiner "Beispielcode" von mir mit den Charakteren Bob und Jana.
Bob mit 10, Jana mit 15 Lifepoints.

Die LPs werden zwar bei den Chars angezeigt, aber nur die von Jana werden verwendet und verändert.

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

name=['Bob','Jana']
life=[10,15]

root=tk.Tk()
root.title('Test')
root.geometry('500x500')

char_Notebook=ttk.Notebook(root)
char_Notebook.pack()

def lifepoints_Plus():
    char_LP.set(char_LP.get()+1)

for num,nam in enumerate(name):
    char_Name=nam
    char_LP=tk.IntVar()
    char_LP.set(life[num])
    char_Tap=tk.Frame(char_Notebook)
    char_Tap.pack(fill='both',expand=1)

    char_Name_Lab=tk.Label(char_Tap,text=char_Name)
    char_Name_Lab.pack()

    char_LP_Lab=tk.Label(char_Tap,textvariable=char_LP)
    char_LP_Lab.pack()

    lp_Plus_Butt=tk.Button(char_Tap,text='+',command=lifepoints_Plus)
    lp_Plus_Butt.pack()

    char_Notebook.add(char_Tap,text=char_Name)

root.mainloop()
Schreibfehler dürfen Behalten werden!
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DasWollvieh: Am Ende der Schleife hat `char_LP` *einen* Wert, und der wird halt verwendet wenn die ”Funktion” `lifepoints_Plus()` aufgerufen wird.

GUI-Programmierung setzt im Grunde objektorientierte Programmierung (OOP) voraus, also eigene Klassen schreiben, und OOP wiederrum, dass man sauber mit Funktionen umgehen kann. Das heisst keine globalen Variablen und Funktionen bekommen alles was sie ausser Konstanten benötigen, als Argument(e) übergeben. 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).

Namen sollten keine kryptischen Abkürzungen enthalten oder gar nur daraus bestehen. Der Name soll dem Leser vermitteln was der Wert dahinter im Programm bedeutet, nicht zum rätseln zwingen.

`name` ist kein guter Name für eine Liste mit Namen, das wäre `names`. Dann muss man den einzelnen Namen auch nicht `nam` nennen, sondern kann dort dann `name` verwenden.

`num` wird als Index verwendet. Das macht man so nicht. Wenn man über zwei ”parallele” Datenstrukturen iterieren will, verwendet man die `zip()`-Funktion. Allerdings sollten diese Informationen gar nicht erst in verschiedenen Listen stecken wenn sie doch zusammengehören.

Wie gesagt, keine Abkürzungen. `Lab` ist eine gängige Abkürzung für „laboratory“, weshalb man `lable` schreiben sollte wenn man `lable` meint.

Tap ist was anderes als Tab.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DasWollvieh
User
Beiträge: 2
Registriert: Mittwoch 1. März 2023, 16:00

Ich wollte schon zu einer dezent bissigen Antwort ansetzen, als ich gestern deine Antwort las, @__blackjack__, da ich sie am Anfang nicht verstand und ziemlich Frustriert war, da es nie geklappt hatte!

Ich hatte mir für jeden Absatz einen bissigen Kommentar überlegt, ich war kurz vor dem Absenden, dann habe ich mir, ich glaube zum 20. mal deinen Post durchgelesen..
Du hast recht, ich musste mich noch einmal hinsetzen und mich durch die OOP durcharbeiten!

Danke dir, es hat mir sehr geholfen und auch mein Problem gelöst!
Schreibfehler dürfen Behalten werden!
Antworten