Python Tkinter: Преобразование значения раскрывающегося меню в функцию как переменную? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь создать раскрывающееся меню Tkinter, чтобы добавить его в основной GUI. Назначение меню - предоставить пользователю несколько вариантов выбора нейронной сети сегментации изображений (в настоящее время их всего два).

Мне не удается получить значение раскрывающегося меню и проанализировать его с помощью функции в качестве параметра (переменной, а не строки).

Я попытался создать staticmethod в GUI класс окна для поиска значения в раскрывающемся меню и анализа значения с помощью функции сегментации изображения при нажатии кнопки сегмента в GUI. Функция сегментации принимает два параметра, net и path, где это нейронная сеть и путь к файлу изображения соответственно.

Я не совсем уверен, как изменить отдельные параметры переменной, поэтому я просто изменил всю переменную в зависимости от значения раскрывающегося меню. Единственное, что изменилось, - это параметр net функции сегмента, привязанный к кнопке Tkinter.

Код:

@staticmethod
    def find_option():
        if menu1.get() == "fcn":
            App.btn2 = Button(App.btn_frame, text="Segment", width = 10, height = 1, cursor = "hand2", command=lambda: App.segment(net=App.fcn, path=App.path))
        else:
            App.btn2 = btn2 = Button(App.btn_frame, text="Segment", width = 10, height = 1, cursor = "hand2", command=lambda: App.segment(net=App.dlab, path=App.path))

Код выпадающего меню:

fcn = models.segmentation.fcn_resnet101(pretrained=True).eval()
dlab = models.segmentation.deeplabv3_resnet101(pretrained=1).eval()
options = ["fcn", "dlab"]

variable = StringVar(btn_frame)
        variable.set(options[0]) # default value

        menu1 = OptionMenu(btn_frame, variable, *options)
        menu1.pack(side=LEFT)

btn_frame - фрейм в главном окне, содержащий кнопки.

App - основной класс GUI. На menu1 нужно было ссылаться как на App.menu1, но это по какой-то причине вызвало бы несколько ошибок (другие переменные класса стали бы undefined, а было бы App object has no attribute menu). Я также пробовал ссылаться на menu1 как на App().menu1, но каждый раз, когда я нажимал кнопку сегмента, открывал новое окно, а также никогда не показывал сегментированное изображение.

1 Ответ

0 голосов
/ 26 мая 2020

Edit: Я думаю, вам нужно что-то вроде этого. Трудно понять, когда я не могу видеть весь код, но может быть, вы забыли передать self метод find_option?

# This is the option menu part
self.options = ["fcn", "dlab"]
self.variable = tk.StringVar(btn_frame)
self.variable.set(options[0]) # default value
self.menu1 = tk.OptionMenu(
    btn_frame, self.variable, *self.options)

self.menu1.pack(side=LEFT)

# And then later you have this method (remember to pass self to find_option)
def find_option(self):
    if self.variable.get() == "fcn":
        # your code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...