Tkinter菜单命令能否直接将变量设为None以替代调用函数
Tkinter菜单命令能否直接将变量设为None以替代调用函数
当然可以实现这个需求,但直接写command=SUDO_PASSWORD=None是行不通的,我来给你掰扯清楚其中的门道:
首先得说为什么直接赋值不行:
当你写
command=SUDO_PASSWORD=None时,Python会立刻执行这个赋值操作——也就是在你创建菜单的那一刻,SUDO_PASSWORD就被设成None了,完全不是你想要的“点击菜单时才修改”的效果。而且这个赋值语句的返回值是None,会被传给command参数,但Tkinter要求command必须是一个可调用对象(比如函数),点击菜单时会去调用它,所以后续点击菜单还会触发“None不可调用”的错误。
那正确的简化方式是什么呢?用lambda表达式就行,它可以把你的赋值逻辑包装成一个可调用的匿名函数,只有在菜单被点击时才会执行:
self.tools_menu.add_command(label="Forget sudo password", underline=0, font=g.FONT, command=lambda: setattr(globals(), 'SUDO_PASSWORD', None), state=tk.DISABLED)
这里用setattr(globals(), ...)是因为你的SUDO_PASSWORD是全局变量,如果这个变量是某个类的实例属性(比如绑定在self上),可以改成更直观的写法:
lambda: setattr(self, 'SUDO_PASSWORD', None)
要是你觉得lambda的写法不够直观,或者以后可能需要给这个操作加更多逻辑(比如打印日志、做额外校验),那保留你原来写的ForgetPassword函数其实也很稳妥——毕竟代码的清晰性有时候比简短更重要。
备注:内容来源于stack exchange,提问作者WinEunuuchs2Unix
相关产品推荐
相关产品推荐

