Tkinter, вызывающий функции внутри класса

#function #tkinter #command

#функция #tkinter #команда

Вопрос:

Привет, у меня возникли проблемы с вызовом функций в tkinter

Вот код

 class Demo(tk.Frame):
    def ShowOption(self):
        print(self.v1.get())

    def __init__(self,controller):
        tk.Frame.__init__(self,width=800, height=600)
        f = Frame(self)

        optionList = ('A', 'B','C')
        self.v1 = tk.StringVar()
        self.v1.set(optionList[0])
        
        Opt1 = tk.OptionMenu(f, self.v1, *optionList,command = self.ShowOption)
        Opt1.grid(row=2,column=2,sticky='w')

        f.place(relx = 0.5,rely=0.5,anchor='c')
 

Проблема, с которой я сталкиваюсь, заключается в том, что если я использую этот метод, в нем указывается, что функция принимает 1 позиционный аргумент, и ни один из них не был задан, но если я использую

         Opt1 = tk.OptionMenu(f, self.v1, *optionList,command = self.ShowOption() )
 

Функция запускается сразу после создания класса.

Любая помощь с благодарностью.

Ответ №1:

Обратный вызов для command опции OptionMenu ожидает аргумент, который является выбранным элементом.

Так что либо вы используете lambda , чтобы пропустить аргумент:

 command=lambda v: self.ShowOption()
 

Или переопределите ShowOption() , чтобы принять аргумент:

 def ShowOption(self, value):
    ...
 

Комментарии:

1. Могу ли я узнать необходимость позиционного аргумента v

Ответ №2:

сделайте это

 command = lambda : self.ShowOption()
 

Комментарии:

1. Этот ответ будет улучшен с дальнейшим объяснением: в чем проблема была в исходном коде, как это ее решает.