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