Ткинтер использует импортированную функцию - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть следующее основное приложение, использующее tkinter, которое имеет две кнопки.С помощью первой кнопки я могу открыть папку, содержащую файлы, для которых я хочу выполнить анализ, а вторая кнопка затем запускает анализ.

from tkinter import filedialog
from tkinter import *
from pathlib import Path
from run_analysis import create_tmp_file


class MyApp():
    def __init__(self,master):
        frame = Frame(master) 
        frame.pack()
        self.button_filedialog = Button(frame, text="Öffnen", fg="red",command=self.open_filedialog)
        self.button_analyse = Button(frame, text="Starte Analyse", fg="green", command=self.make_analysis)

        ## Unpack buttons
        self.button_filedialog.pack()
        self.button_analyse.pack()

    def open_filedialog(self):
        start_path = Path.cwd()
        self.data_path =  filedialog.askdirectory(initialdir=start_path)

    def make_analysis(self):
        create_tmp_file(self.data_path,1,0.12)

root = Tk()
app = MyApp(root)
root.mainloop()

Код работает нормально.Однако на самом деле это не то, что я хочу.

Я хочу вызвать импортированную функцию create_tmp_file прямо во второй кнопке.Однако, если я заменю строку

self.button_analyse = Button(frame, text="Starte Analyse", fg="green", command=self.make_analysis)

на

self.button_analyse = Button(frame, text="Starte Analyse", fg="green", command=create_tmp_file(self.data_path,1,0.12))

Код не работает, и я получаю следующее сообщение об ошибке:

AttributeError: у объекта 'MyApp' нет атрибута 'data_path'

Что я делаю не так?

Спасибо!

1 Ответ

0 голосов
/ 17 февраля 2019

То, что здесь происходит, довольно просто.Вы устанавливаете атрибут для класса - в данном случае атрибут data_path ... - внутри метода.Но это происходит только тогда, когда метод фактически вызывается.

Установка команды - это просто ссылка на нее, поэтому до тех пор, пока она не будет вызвана, этот атрибут не существует.

Это явно проблематично, когда вы даете ссылку на метод, который устанавливает атрибут, но еще не был вызван, а затем сразу же вызывает метод, который предполагает его существование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...