Здравствуйте и добро пожаловать в Stackoverflow.
Когда я запустил ваш скрипт, я вообще не смог увидеть кнопку "Импорт XML". Мне нужно было сначала изменить размер окна. Вот почему я поиграл с вызовами .pack
и .grid
в вашем коде.
Чтобы решить вашу проблему, я добавил аргумент callback
к вашему import_onclick
методу. Это дает возможность классу ButtonAction
вернуть данные обратно в класс Window
. Здесь новый метод update_text
отвечает за заполнение содержимого textarea
.
Так как теперь нам нужен дополнительный аргумент для import_onclick
, я заключил предыдущий аргумент ButtonAction().import_onclick
в лямбду:
lambda: ButtonAction().import_onclick(self.update_text)
Полученный код отлично работает для меня:
from tkinter.filedialog import *
class Window(Frame):
def __init__(self):
super().__init__()
self.textarea = Text(self)
self.initgui()
def initgui(self):
self.pack(fill=BOTH, expand=True)
self.textarea.pack(side=LEFT, padx=5, pady=5)
import_button = Button(self,
text="Import XML",
command=lambda: ButtonAction().import_onclick(self.update_text)
)
import_button.pack(side=RIGHT, padx=5, pady=5)
def update_text(self, text):
self.textarea.delete(1.0, END)
self.textarea.insert(END, text)
class ButtonAction:
def __init__(self):
pass
def import_onclick(self, callback):
file = askopenfile(mode='r')
if file is not None:
content = file.read()
# just so i can see if i successfully imported my txt file
print(f"read {len(content)} lines")
callback(content)
if __name__ == '__main__':
root = Tk()
root.title("Test Project")
gui = Window()
root.mainloop()