如何根据另一个文件修改的变量自动更新标签?

时间:2018-01-10 08:45:14

标签: python python-3.x tkinter

我目前正在尝试建立一个探路者角色创造者并且已经撞墙了。我有多个选项卡,使用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个重复的我的框架垂直堆叠在窗口中的另一个上面。

1 个答案:

答案 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

使用类变量(BooleanVarDoubleVarIntVarStringVar)可能很麻烦,因为它们需要tk.Tk()的实例才能存在