Я пишу простой графический интерфейс с использованием 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()