我目前正在尝试建立一个探路者角色创造者并且已经撞墙了。我有多个选项卡,使用ttk.notebook
,在单独的文件和全局变量文件中设置。我试图根据self.acroMod_Label
文件中使用Skill_Tab.py
中的数据进行修改的全局变量str_mod
,在global_variable.py
中更新Stats_Tab.py
。
main.py
from tkinter import *
from tkinter import ttk
from Stats_Tab import Stats_Tab
from Skills_Tab import Skills_Tab
#creates main window and nests the tabs
Class Pathfinder_GUI(Frame):
def __init__(self):
Frame.__init__(self)
self.master.title("RPG Character Generator")
self.master.rowconfigure(0, weight = 1)
self.master.columnconfigure(0, weight = 1)
self.grid(sticky = W+E+N+S)
#tab creation
self.notebook = ttk.Notebook(self,width=760, height=480)
self.notebook.grid(sticky = W+E+N+S)
stats_tab = Stats_Tab(self.notebook)
self.notebook.add(stats_tab, text = "Stats")
skills_tab = Skills_Tab(self.notebook)
self.notebook.add(skills_tab, text = "Skills")
def main():
Pathfinder_GUI().mainloop()
main()
global_variable.py
str_mod = 0
#takes score from stats_tab.Mod() and changes global variable str_mod
def abil_Mod(score):
global str_mod
str_mod = var * 2
Stats_Tab.py
from tkinter import *
from tkinter import ttk
import global_variables as gvar
class Skills_Tab(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.strMod_Var = IntVar()
self.strength_Var = IntVar()
self.strength_Entry = Entry(self, textvariable=self.strength_Var,
width = 3,justify=CENTER)
self.strength_Entry.bind('<KeyRelease>', lambda event,
ability = self.strength_Var, label =
self.strMod_Var: self.mod(event, ability,
label))
self.strength_Entry.grid(row = 2, column = 1)
self.strMod_lbl = Label(self,textvariable = self.strMod_Var)
self.strMod_lbl.grid(row = 2,column = 2)
def mod(self, event, ability, label):
#calls gvar.abil_Mod using 'score' to change gvar.str_mod and set
#the label to the appropriate value
score = ability.get()
gvar.abil_Mod(score)
label.set(gvar.str_mod)
Skills_Tab.py
from tkinter import *
from tkinter import ttk
import global_variables as gvar
self.acroMod_Var = IntVar()
self.acroMod_Label = Label(self, textvariable = self.acroMod_Var)
self.acroMod_Label.grid(row = 2, column = 4)
这会将标签设置为0,但在变量更改后我无法更新标签。
我已就此事进行了一些研究,并阅读了有关.after()
,.trace()
和update_idletasks()
但我不确定前2是否是我需要的以及何时尝试使用第3个它只是给了我2个重复的我的框架垂直堆叠在窗口中的另一个上面。
答案 0 :(得分:0)
根据您提供的文件
&#39;
中的数据进行修改str_mod
文件中的全局变量global_variable.py
,使用Stats_Tab.py
&#39;
str_mod
被修改的假设只是 false 。
全局变量并不像这个问题所暗示的那样全球化。它们不共享,或者可以无缝地在多个python脚本之间访问。
如果脚本具有全局变量,则意味着可以在该脚本中的任何位置访问变量,并且该脚本单独,除非该脚本由另一个脚本import
编辑。即使在剧本与想要的&#39;全球&#39;变量是import
ed,之后对导入脚本和导入脚本单独的变量进行了更改。
如果文件中的数据需要多个python脚本可访问,则每个脚本都必须读取或 import
ed 想要访问它。
如果脚本需要文件中的数据,则脚本必须读取或 reload
(或import
如果它是第一次)它,每次脚本想要将其值更新为最新值。
如果脚本需要更改文件中的数据,要被另一个脚本访问,它必须覆盖该文件中的数据,或者它可以将其放在其他位置,以便其他脚本可以从该位置访问它已由第一个脚本编写。
在下面的示例中,假设某些其他脚本或某人手动通过不时覆盖some_module
来编辑variable
。
您可以使用variable
功能将some_module
中定义的reload
更新为最新值。下面的示例使用label
每半秒更新一次after
的文字:
import tkinter as tk
import importlib as imp # to reload some_module after it has been imported
def show_var():
global label
global some_module
try:
imp.reload(some_module) # to reload some_module if it has already been imported
except:
import some_module # to import some_module if it has never been imported
label['text'] = some_module.variable
label.after(500, show_var) # to recursively call itself every 500 miliseconds
if __name__ == '__main__':
root = tk.Tk()
label = tk.Label(root)
show_var()
label.pack()
root.mainloop()
和some_module.py
:
variable = 3
使用类变量(BooleanVar
,DoubleVar
,IntVar
,StringVar
)可能很麻烦,因为它们需要tk.Tk()
的实例才能存在