首页 > 解决方案 > 在 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 中单击并选择选项,但没有任何反应。

标签: python-3.xfunctionclassvariablestkinter

解决方案


首先我想说的是,默认情况下没有出错并不意味着“好”。没有得到错误并且仍然存在问题的原因可能有很多。

现在继续讨论代码本身。你有几个问题。

  1. 您的方法func在这里没有做任何有用的事情。将事件返回到菜单项将不会产生任何结果,因为它被OptionMenu. 所以在这里你不会得到任何错误,因为它被忽略了。

  2. 您的if/elif语句将只运行一次并且应该失败并出现错误:NameError: name 'value' is not defined。由于值从未在createUtility方法中定义。

  3. return在这些地方都不需要使用,实际上也没有任何用处。

  4. b = Browser(Tk()) mainloop()不是一个好办法。您需要更明确地说明您的 tkinter 实例。

  5. 小小的委屈,但值得一提。而不是这样做,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()

推荐阅读