Обновить текстовый виджет окна из другого окна - PullRequest
0 голосов
/ 21 сентября 2019

Я создаю приложение tkinter и хочу добавить новое окно в это приложение, где я могу обновить статус текущей операции.Я хочу, чтобы каждый раз, когда событие завершалось, я хотел обновить его до текстового виджета отдельного окна, которое работает параллельно.Как и в окне консоли, пользователи могут легко читать и понимать состояние приложений / ошибок и т. Д.

Я довольно новичок в Python и Tkinter, мой подход заключается в следующем,

Прежде чем напрямуювключив его в реальное приложение, я попытался воспроизвести то, что имел в виду, в отдельном проекте.

Сначала я создал простое главное окно следующим образом:

from tkinter import *
from tkinter import ttk
from Console import ConsoleWindow

class Main:

    def __init__(self, master):

        self.master = master
        self.master.title('Main')
        self.master.geometry('640x480')
        self.btn = ttk.Button(self.master, text = 'Run Console', command = self.runConsole)
        self.btn.pack(side = LEFT)
        self.btn2 = ttk.Button(self.master, text = 'Update Console', command = self.updateConsole, state = DISABLED)
        self.btn2.pack(side = RIGHT)

    def runConsole(self):

        self.btn.configure(state = 'disabled')
        self.btn2.configure(state = 'normal')
        consolewindow = Toplevel(self.master)
        console = ConsoleWindow(consolewindow)
        consolewindow.mainloop()


    def updateConsole(self):

        string = 'Console Text !!'
        ConsoleWindow.insertText(string)

def main():

    mainWindow = Tk()
    mainGUI = Main(mainWindow)
    mainWindow.mainloop()

if __name__ == "__main__":
    main()

Далее,окно консоли

from tkinter import *

class ConsoleWindow:

    def __init__(self, master):

        self.master = master
        self.master.title('Console Window')
        self.master.geometry('640x480')
        self.scrollBar = Scrollbar(self.master)
        self.textArea = Text(self.master)
        self.scrollBar.pack(side=RIGHT, fill=Y)
        self.textArea.pack(side=LEFT, fill=Y)
        self.scrollBar.config(command=self.textArea.yview)
        self.textArea.config(yscrollcommand=self.scrollBar.set)
        self.textArea.insert(INSERT, 'Running')
        self.textArea.configure(state='disabled')

    def insertText(self, textToUpdate):

        text = f'{textToUpdate}\n'
        self.textArea.configure(state='normal')
        self.textArea.insert(INSERT, text)
        self.textArea.configure(state='disabled')

Я ожидаю использовать функцию insertText для многократного обновления текстового виджета во время выполнения приложения.Когда я запускаю этот код, я могу создать экземпляр ConsoleWindow, но когда я нажимаю кнопку «обновить консоль», я получаю следующую ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Aswin Kumar\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/Aswin Kumar/Console Window/Main.py", line 31, in updateConsole
    ConsoleWindow.insertText(string)
TypeError: insertText() missing 1 required positional argument: 'textToUpdate'

Я попытался добавить экземпляр ConsoleWindowto insertText (),

ConsoleWindow.insertText(console, string)

И, получая следующую ошибку,

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Aswin Kumar\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/Aswin Kumar/Console Window/Main.py", line 31, in updateConsole
    ConsoleWindow.insertText(console, string)
NameError: name 'console' is not defined

Как обновить окно консоли из моего главного окна.Или есть какой-то альтернативный подход, который я могу использовать для этого случая.

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