@korsarqa

Как корректно вызвать метод из другого класса?

Приветствую!
В строке меню добавил элемент, при нажатии на который должен вызываться метод другого класса и передаваться ему значение переменной.
new_item.add_command(label='Запуск', command=Analyze.start(self.catalog))


Для проверки кода, просто завел метод start класса Analyze
class Analyze(object):
    def start(x):
        print(x+'123')


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

Полный блок:

import os
import xlsxwriter
from tkinter import *
from tkinter.ttk import *
from tkinter import filedialog

class Analyze(object):
    def start(x):
        print(x+'123')

class Interface(Frame):
    catalog = ''

    def chooseCatalog(self):
        self.catalog = filedialog.askdirectory()

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.parent.title("Обработка файлов")
        self.pack(fill=BOTH, expand = 1)
        self.parent.resizable(0, 0)
        self.centerWindow()
        self.addMenu()
        self.catalogButton = Button(self, text="Указать каталог с исходными файлами", command=self.chooseCatalog)
        self.catalogButton.place(x=0, y=0, width=500,height=50)

    def addMenu(self):
        menu = Menu(self.parent)
        new_item = Menu(menu, tearoff=0)
        new_item.add_command(label='Запуск', command=Analyze.start(self.catalog))
        new_item.add_command(label='Выход', command=self.exit)
        menu.add_cascade(label='Файл', menu=new_item)
        self.parent.config(menu=menu)

    def centerWindow(self):
        userWidth = 500
        userHeigth = 250
        windowWidth = self.parent.winfo_screenwidth()
        windowHeigth = self.parent.winfo_screenheight()
        x = (windowWidth-userWidth)/2
        y = (windowHeigth-userHeigth)/2
        self.parent.geometry('%dx%d+%d+%d' % (userWidth, userHeigth, x, y))

    def exit(self):
        self.quit()

def main():
    window = Tk()
    interface = Interface(window)
    window.mainloop()

if __name__ == '__main__':
    main()
  • Вопрос задан
  • 1657 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Каждую неделю кто-нибудь задаёт этот вопрос. Именованный аргумент command принимает ссылку на функцию, а не результат её вызова! Хотите передать в вызываемую функцию аргумент, используйте частичное применение.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы