Cara menggunakan StringVar dari satu tab ke objek tab yang lain sambil membenarkan penggunaan f-string dan kemas kini langsung apabila menggunakan Buku Nota Tkinter

WBOY
Lepaskan: 2024-02-09 18:30:04
ke hadapan
844 orang telah melayarinya

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

Kandungan soalan

Saya sedang membuat projek kecil untuk membantu mencipta mod bg3. Matlamat utama saya ialah untuk mempunyai berbilang tab di mana saya boleh memasukkan data dan mengeksport fail apabila saya menyimpan.

Saya dapat melakukan penyimpanan dan penciptaan tab tanpa sebarang masalah. Apa yang saya mahu berlaku ialah memasukkan ke dalam configtab nama kelas tersuai yang akan dibuat oleh mod (ini untuk dnd jika ia membantu). Kemudian dalam tab penyetempatan saya mahu mempunyai tab dengan medan input. Tag akan membaca nama kelas dari configtab dan dipaparkan sebagai deskripsi nama kelas:; jadi dalam konfigurasi saya akan menaip pahlawan dan dalam penyetempatan ia akan memaparkan penerangan pahlawan:

Saya boleh memanggil stringvar untuk kemas kini langsung, tetapi ini tidak membenarkan saya menggunakan f-strings atau fungsi penggabungan lain. Jika saya menggunakan kaedah get() saya hanya menerima nilai yang ditetapkan kepada nama kelas apabila tetingkap dicipta. Jadi jika saya menggunakan classname.set("warrior"), classname.get() akan mengembalikan rentetan, saya boleh menggunakan rentetan f dan saya boleh memaparkan perihalan pahlawan. Walau bagaimanapun, get() ialah panggilan sekali sahaja dan tidak dikemas kini jika saya menukar data dalam tab konfigurasi.

Berikut ialah pelaksanaan barebones yang menunjukkan idea umum semasa saya. Pelbagai medan akan dirujuk dalam projek akhir, bukan hanya medan nama kelas.

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()
Salin selepas log masuk

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)
Salin selepas log masuk

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)
Salin selepas log masuk

Saya mencari dalam stackoverflow dan menemui soalan lain yang serupa. Mereka memetik menggunakan penjejakan, peristiwa mengikat, atau bahkan hanya menekan butang untuk memuat semula data.

Saya cuba menjejak dan mengikat tetapi tidak berjaya. Mungkin cara saya melaksanakannya tidak betul, saya minta maaf tetapi saya tidak mempunyai kod dalam fail saya untuk menunjukkan percubaan saya.


Jawapan betul


Seperti yang anda katakan, anda boleh menggunakan trace() pada pembolehubah tkinter:

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:"
Salin selepas log masuk

Atas ialah kandungan terperinci Cara menggunakan StringVar dari satu tab ke objek tab yang lain sambil membenarkan penggunaan f-string dan kemas kini langsung apabila menggunakan Buku Nota Tkinter. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan