Heim > Artikel > Backend-Entwicklung > So verwenden Sie eine StringVar von einem Tab zu einem anderen Tab-Objekt und ermöglichen gleichzeitig die Verwendung von F-Strings und Live-Updates bei Verwendung von Tkinter Notebooks
Ich erstelle ein kleines Projekt, um bei der Erstellung von BG3-Mods zu helfen. Mein ultimatives Ziel ist es, mehrere Registerkarten zu haben, auf denen ich Daten eingeben und die Datei beim Speichern exportieren kann.
Ich konnte das Speichern und die Tab-Erstellung ohne Probleme durchführen. Was ich tun möchte, ist, in die Registerkarte „Configtab“ den Namen der benutzerdefinierten Klasse einzugeben, die der Mod erstellen wird (dies ist für DND, wenn es hilft). Dann möchte ich im Localizationtab einen Tab mit einem Eingabefeld haben. Das Tag liest den Klassennamen aus der Konfigurationsregisterkarte und zeigt ihn als Klassennamenbeschreibung an:; also würde ich in der Konfiguration „Krieger“ eingeben und in der Lokalisierung wird die Beschreibung des Kriegers angezeigt:
Ich kann stringvar für Live-Updates aufrufen, aber das erlaubt mir nicht, F-Strings oder andere Verkettungsfunktionen zu verwenden. Wenn ich die Methode get() verwende, erhalte ich nur den Wert, der beim Erstellen des Fensters auf den Klassennamen gesetzt wurde. Wenn ich also classname.set("warrior") verwende, gibt classname.get() einen String zurück, ich kann einen F-String verwenden und die Beschreibung des Kriegers anzeigen lassen. Get() ist jedoch ein einmaliger Aufruf und wird nicht aktualisiert, wenn ich die Daten auf der Registerkarte „Konfiguration“ ändere.
Unten ist eine Barebone-Implementierung, die meine aktuelle allgemeine Idee zeigt. Im endgültigen Projekt wird auf mehrere Felder verwiesen, nicht nur auf das Klassennamenfeld.
mainprogram.py
import tkinter as tk import tkinter.ttk as ttk from classconfigtab import classconfigtab from localizationtab import localizationtab # create tkinter window root = tk.tk() root.title("bg3 mod creation tool") root.geometry("650x150") # create notebook nb = ttk.notebook(root) config_tab = classconfigtab(nb) localization_tab = localizationtab(config_tab, nb) nb.add(config_tab, text='configure class') nb.add(localization_tab, text='localization') # load window nb.pack(expand=1, fill="both") root.mainloop()
classconfigtab.py
import tkinter as tk from tkinter import ttk class classconfigtab(ttk.frame): """content for the required tab for creating a class mod.""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.classname = tk.stringvar(name="classname") self.classname.set("warrior") self.place_widgets() def place_widgets(self): entry_classname = ttk.entry(self, width=50, textvariable=self.classname) # place widgets entry_classname.grid(column=0, row=1, padx=10, pady=0, sticky=tk.w)
localizationtab.py
import tkinter as tk from tkinter import ttk class LocalizationTab(ttk.Frame): """This will contain what is going to be shown on the localization tab.""" def __init__(self, config_tab, *args, **kwargs): super().__init__(*args, **kwargs) # This updates automatically but can't use f-string. self.label_main_name = ttk.Label(self, textvariable=config_tab.classname) # This loads the StringVar value on window creation, but does not auto update. self.label_main_name_two = ttk.Label(self, text=config_tab.classname.get()) self.place_widgets() def place_widgets(self): self.label_main_name.grid(column=0, row=0, padx=10, pady=5, sticky=tk.W) self.label_main_name_two.grid(column=1, row=0, padx=10, pady=5, sticky=tk.W)
Ich habe in Stackoverflow gesucht und andere ähnliche Fragen gefunden. Sie nannten die Verwendung von Tracking, das Binden von Ereignissen oder einfach nur das Drücken einer Taste zum Aktualisieren von Daten.
Ich habe es mit Nachverfolgung und Bindung versucht, aber ohne Erfolg. Vielleicht ist die Art und Weise, wie ich es implementiert habe, falsch. Es tut mir leid, aber ich habe nicht den Code in meiner Datei, um meinen Versuch anzuzeigen.
Wie Sie sagten, können Sie trace()
für Tkinter-Variablen verwenden:
class LocalizationTab(ttk.Frame): """This will contain what is going to be shown on the localization tab.""" def __init__(self, config_tab, *args, **kwargs): super().__init__(*args, **kwargs) self.config_tab = config_tab # save for later access self.label_main_name = ttk.Label(self) # call self.update_label() whenever the variable is updated config_tab.classname.trace_add("write", self.update_label) self.place_widgets() self.update_label() # update label initially def place_widgets(self): self.label_main_name.grid(column=0, row=0, padx=10, pady=5, sticky=tk.W) def update_label(self, *args): self.label_main_name["text"] = f"{self.config_tab.classname.get()} Description:"
Das obige ist der detaillierte Inhalt vonSo verwenden Sie eine StringVar von einem Tab zu einem anderen Tab-Objekt und ermöglichen gleichzeitig die Verwendung von F-Strings und Live-Updates bei Verwendung von Tkinter Notebooks. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!