Передача переменных между функциями внутри класса для OptionMenu - PullRequest
0 голосов
/ 15 ноября 2018

У меня проблема с тем, как запустить какой-то кусок кода в каком-то состоянии 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 голосов
/ 15 ноября 2018

Сначала я хочу сказать, что отсутствие ошибки по умолчанию не означает «хорошо».Там может быть много причин, чтобы не получить ошибку и все еще иметь проблемы.

Теперь переходим к самому коду.У вас есть несколько проблем.

  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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...