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

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

WBOY
WBOYnach vorne
2024-02-09 18:30:04839Durchsuche

使用 Tkinter Notebooks 时,如何将一个选项卡中的 StringVar 用于另一个选项卡对象,同时允许 f 字符串使用和实时更新

Frageninhalt

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.


Richtige Antwort


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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen