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()
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)
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.
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:"
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!