Как назначить возвращаемые значения функции переменным класса в графическом интерфейсе tkinter? - PullRequest
0 голосов
/ 11 января 2019

Я пишу простой графический интерфейс с использованием tkinter в Python3. Это позволяет пользователю нажимать кнопку, которая вызывает функцию select_files, которая позволяет пользователю выбрать группу файлов. Функция обрабатывает файлы и выводит кортеж из трех вещей, которые необходимо назначить переменным класса, скажем, a, b, c, для дальнейшей обработки. Эти переменные должны быть доступны для любой функции, которую я определяю внутри класса.

Я попытался сделать следующее, но у меня появляется ошибка name 'self' is not defined. Функция select_files уже определена и записана в отдельный файл .py, и я импортирую ее из правильного расположения. Я относительно новичок в программировании GUI и объектно-ориентированном программировании в целом.

Я изучал похожий вопрос, заданный здесь: Python tkinter Возвращаемое значение из функции, используемой в команде , которая была полезна в целом, но не смогла помочь мне с моей конкретной проблемой.

Должны ли эти self.a, self.b, self.c переменные появляться в методе __init__()? Если да, то как мне назначить их для возвращаемых значений функции select_files? Кроме того, это сделало бы функцию open_files ненужной?

from ... import select_files
import tkinter as tk
from tkinter import filedialog

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.run_button()

    def open_files(self):
        self.a, self.b, self.c = select_files()

    print(self.a) #self is not defined error comes from here

    def run_button(self):
        self.button = tk.Button(root, text = 'run', command = self.open_files)
        self.button.pack()

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

РЕДАКТИРОВАТЬ: основываясь на комментарии Рассара, я сделал следующее изменение, и оно работает. Пользователь может нажать кнопку печати, и объект будет напечатан. Может кто-нибудь теперь объяснить, почему self.run_button() и self.print_button() должны быть в методе init?

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.run_button()
        self.print_button()

    def open_files(self):
        self.a, self.b, self.c = select_files()

    def print_files(self):
        print(self.a)

    def run_button(self):
        self.button = tk.Button(root, text = 'run', command = self.open_files)
        self.button.pack()

    def print_button(self):
        self.button = tk.Button(root, text = 'print', command = self.print_files)
        self.button.pack()

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...