Python 按钮的TKInter全局变量

Python 按钮的TKInter全局变量,python,tkinter,Python,Tkinter,我使用Steven M.Vascillao示例中的多帧窗口。 我不明白是否可以使用全局变量,因为每一帧在每次更改时都会被破坏。如果我点击第二个按钮并转到第一页,然后在那里做一些事情并返回开始页,则开始页上的第一个(共两个按钮)按钮将被禁用。第一个按钮必须被激活 如果我在StartPage类中声明global \u tkinter.TclError:无效的命令名“!startpage.!button2” 如果我在PageOne类中声明它 name错误:未定义名称“install\u svc” 这不

我使用Steven M.Vascillao示例中的多帧窗口。 我不明白是否可以使用全局变量,因为每一帧在每次更改时都会被破坏。如果我点击第二个按钮并转到第一页,然后在那里做一些事情并返回开始页,则
开始页
上的第一个(共两个按钮)按钮将被禁用。第一个按钮必须被激活

如果我在
StartPage
类中声明
global

\u tkinter.TclError:无效的命令名“!startpage.!button2”

如果我在
PageOne
类中声明它

name错误:未定义名称“install\u svc”

这不是个好主意,但我想到了第三帧,在那里我再次定义了按钮

编辑1:

class MyGUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self._frame = None
        self.switch_frame(StartPage)
        self.geometry("400x300")

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

    def quit_app(self):
        self._frame.destroy()
        self.destroy()

class StartPage(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        global install_svc

class PageOne(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
    def entry_check(self,parent):
        global install_svc

在根级别(全局范围)声明并初始化
install\u svc
。语句
global install\u svc
不会自动神奇地在全局范围内创建变量:它只会查找具有此类名称的全局变量,但是,如果您尝试使用该变量而不首先为其赋值,则会抛出
namererror

密码 您还可以检查变量是否存在,进行
尝试..除了
,但这将是非常难看的(至少对我来说是这样),并且您需要在任何地方进行这样的检查:

class MyGUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self._frame = None
        self.switch_frame(StartPage)
        self.geometry("400x300")

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

    def quit_app(self):
        self._frame.destroy()
        self.destroy()

class StartPage(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        global install_svc

        try:
            install_svc
        except NameError:
            install_svc = None # Or some initial value

class PageOne(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
    def entry_check(self,parent):
        global install_svc

        try:
            install_svc
        except NameError:
            install_svc = None # Or some initial value

global
语句的确切位置以及该错误发生的时间/地点?@martineau
类起始页(tk.Frame):def\uuuu init\uuuuuuuuuuuuuuuuu(self,parent)global install\u svc
以及在一些例行的
def entry\u检查(self,parent):global install\u svc
之后的
PageOne
方法中。正如我所想的那样,我可以实现我想要的。请参考变更方面的变更,因为您还没有发布任何自己的代码。为了帮助您,我们需要能够重现问题。您还需要显示整个错误消息,包括指示错误发生位置的回溯。仅仅停留在一些
global
语句本身不会导致
namererror
。运行您添加到问题中的代码时,我没有发现任何错误。@martineau OP没有在任何地方使用
install\u svc
,只是执行
global install\u svc
,这本身不会引发任何错误。他需要发布错误和一个更完整、更可验证的示例。我想我的问题是,我从
PageOne
方法调用变量。在
PageOne
中,我检查与SQL DB的连接,如果一切都满足条件,则单击
StartPage
上的按钮active@RostislavAleev我的回答对你有用吗?如果是这样,请将其标记为已接受(绿色复选标记),否则,请告诉我出了什么问题。提前通知!它起作用了。但我不认为外部全局变量是个好主意。我更喜欢第三帧(类)。认可的。对不起,忘了回答。
class MyGUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self._frame = None
        self.switch_frame(StartPage)
        self.geometry("400x300")

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

    def quit_app(self):
        self._frame.destroy()
        self.destroy()

class StartPage(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        global install_svc

        try:
            install_svc
        except NameError:
            install_svc = None # Or some initial value

class PageOne(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
    def entry_check(self,parent):
        global install_svc

        try:
            install_svc
        except NameError:
            install_svc = None # Or some initial value