在OptionMenu类内部的函数之间传递变量

时间:2018-11-15 16:44:16

标签: python-3.x function class variables tkinter

我在如何在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中单击并选择选项,但是什么也没发生。

1 个答案:

答案 0 :(得分:0)

首先,我想说的是默认情况下未收到错误并不表示“好”。没有错误但仍然有问题的原因可能很多。

现在进入代码本身。你有一些问题。

  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()