Отобразить импортированный текст, сгенерированный из функции кнопки Tk, в Tk Text - PullRequest
1 голос
/ 11 апреля 2020

Я просто новичок в программировании на python. Я хотел бы создать пример проекта, в котором я импортирую текстовый файл в команде нажатия кнопки и отображаю его в текстовом виджете. Функция Button находится в другом классе с именем ButtonAction, а виджет создается в другом классе с именем Window. Проблема в том, что у меня нет идеи, как получить существующий текстовый виджет, чтобы я мог добавить импортированные данные.

Я удалил некоторые коды форматирования.

Код:

from tkinter.filedialog import *


class Window(Frame):

    def __init__(self):
        super().__init__()

        self.initgui()

    def initgui(self):
        self.pack(fill=BOTH, expand=True)

        textarea = Text(self)
        textarea.grid(row=0, column=0, columnspan=2, rowspan=4,
                    padx=10, pady=10, sticky=E + W + S + N)

        imprtbutton = Button(self, text="Import XML", command=ButtonAction().import_onclick)
        imprtbutton.grid(row=0, column=2, padx=5, sticky=S)


class ButtonAction:

    def __init__(self):
        pass

    def import_onclick(self):
        file = askopenfile(mode='r')
        if file is not None:
            content = file.read()
            print(content) #just so i can see if i successfully imported my txt file


if __name__ == '__main__':
    root = Tk()
    root.geometry("500x500+300+200")
    root.title("Test Project")
    gui = Window()
    root.mainloop()

1 Ответ

0 голосов
/ 11 апреля 2020

Здравствуйте и добро пожаловать в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...