首頁  >  文章  >  後端開發  >  使用 Tkinter Notebooks 時,如何將一個選項卡中的 StringVar 用於另一個選項卡對象,同時允許 f 字串使用和即時更新

使用 Tkinter Notebooks 時,如何將一個選項卡中的 StringVar 用於另一個選項卡對象,同時允許 f 字串使用和即時更新

WBOY
WBOY轉載
2024-02-09 18:30:04803瀏覽

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

問題內容

我正在建立一個小專案來幫助建立 bg3 mods。我的最終目標是擁有多個選項卡,我可以在其中輸入數據,並在我保存時匯出檔案。

我能夠毫無問題地執行儲存和選項卡創建。我想要發生的是在 configtab 中輸入 mod 將創建的自訂類別的名稱(如果有幫助的話,這是用於 dnd 的)。然後在 localizationtab 中我希望有一個輸入欄位的標籤。標籤將從 configtab 中讀取類別名稱並顯示為類別名稱描述:;所以在設定中我會輸入 warrior,在本地化中它將顯示 warrior 描述:

我可以呼叫 stringvar 進行即時更新,但這不允許我使用 f 字串或其他串聯功能。如果我使用 get() 方法,我只會收到在建立視窗時設定為類別名稱的值。因此,如果我使用 classname.set("warrior"),classname.get() 將傳回字串,我可以使用 f-string,並且可以讓它顯示 warrior description。但是,get() 是一次性調用,如果我更改配置選項卡中的數據,則不會更新。

下面是一個準系統的實現,展示了我目前的整體思路。最終項目中將引用多個字段,而不僅僅是類別名字段。

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)

我在 stackoverflow 中進行了搜索,發現了其他類似的問題。他們引用了使用的追蹤、綁定事件,甚至只是按下一個按鈕來刷新資料。

我嘗試過追蹤和綁定,但沒有成功。也許我實現它的方式不正確,我很抱歉,但我的文件中沒有程式碼來顯示我的嘗試。


正確答案


正如您所說,您可以在 tkinter 變數上使用 trace()

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:"

以上是使用 Tkinter Notebooks 時,如何將一個選項卡中的 StringVar 用於另一個選項卡對象,同時允許 f 字串使用和即時更新的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除