python-3.x - 在 OptionMenu 的类内的函数之间传递变量
问题描述
我在如何在 OptionMenu 的某些状态下运行某些代码时遇到问题。
from tkinter import *
class Browser(Frame):
def __init__(self, root):
self.root = root
super().__init__(self.root)
self.createUtility()
return
def createUtility(self):
self.main_frame = Frame(bg="")
self.main_frame.grid(row=0, column=0)
self.display_frame = Frame(width=50, height=50, bg="")
self.display_frame.grid(row=1, column=0)
options = ["Plants", "Wood", "Mushrooms", "Animals"]
self.variable = StringVar()
self.variable.set("Wood")
self.change_menu = OptionMenu(self.main_frame, self.variable, *options, command=self.func)
self.change_menu.grid(row=0, column=0)
self.exit_button = Button(self.display_frame, text="Quit!", command=quit)
self.exit_button.grid(row=1, column=1)
if value == "Plants":
#do some code
elif value == "Wood":
#do some code
elif value == "Mushrooms":
#do some code
elif value == "Animals":
#do some code
else:
#do some code
return
def func(self, value):
return value
#This value should be used for an if block in createUtility function
if __name__ == "__main__":
b = Browser(Tk())
mainloop()
我没有收到错误,所以这很好。我可以在 OptionMenu 中单击并选择选项,但没有任何反应。
解决方案
首先我想说的是,默认情况下没有出错并不意味着“好”。没有得到错误并且仍然存在问题的原因可能有很多。
现在继续讨论代码本身。你有几个问题。
您的方法
func
在这里没有做任何有用的事情。将事件返回到菜单项将不会产生任何结果,因为它被OptionMenu
. 所以在这里你不会得到任何错误,因为它被忽略了。您的
if/elif
语句将只运行一次并且应该失败并出现错误:NameError: name 'value' is not defined
。由于值从未在createUtility
方法中定义。您
return
在这些地方都不需要使用,实际上也没有任何用处。b = Browser(Tk()) mainloop()
不是一个好办法。您需要更明确地说明您的 tkinter 实例。小小的委屈,但值得一提。而不是这样做,
from tkinter import *
你应该在需要import tkinter as tk
的地方使用tk.
前缀。这将有助于防止从 tkinter 中意外过度使用导入。
把它改成这样:
if __name__ == "__main__":
root = Tk()
Browser(root)
root.mainloop()
代码:
import tkinter as tk
class Browser(tk.Frame):
def __init__(self, root):
super().__init__(root)
main_frame = tk.Frame(bg="")
display_frame = tk.Frame(width=50, height=50, bg="")
main_frame.grid(row=0, column=0)
display_frame.grid(row=1, column=0)
options = ["Plants", "Wood", "Mushrooms", "Animals"]
self.variable = tk.StringVar()
self.variable.set("Wood")
self.change_menu = tk.OptionMenu(main_frame, self.variable, *options, command=self.check_value)
self.exit_button = tk.Button(display_frame, text="Quit!", command=quit)
self.change_menu.grid(row=0, column=0)
self.exit_button.grid(row=1, column=1)
def check_value(self, event):
if event == "Plants":
print(event)
elif event == "Wood":
print(event)
elif event == "Mushrooms":
print(event)
elif event == "Animals":
print(event)
else:
print("No match")
if __name__ == "__main__":
root = tk.Tk()
Browser(root)
root.mainloop()
推荐阅读
- windows - 为什么 Windows 在启用时在 Hyper-V 中运行?
- java - 多个应用程序上下文在 Spring Boot 中有自己的容器
- git - git clean 的 --exclude-from 选项发生了什么?
- angular - 等待服务功能完成
- sql-server - 从存储过程中的 Orderline 表更新 ItemId
- scala - 如何在 Spark Dataframe 上应用转换来生成元组?
- c++ - 给定代码是否有任何更改,因此我可以为问题提供正确的输出
- javascript - Javascript实践测试题:匿名函数
- amazon-web-services - 尝试使用信用卡付款时出现 AWS Workspaces 问题
- groovy - 如何逐行读取文本文件在jmeter中使用groovy脚本引擎定义计数函数