Tkinter 从另一个窗口更新窗口的文本小部件

Tkinter 从另一个窗口更新窗口的文本小部件,tkinter,Tkinter,我正在创建一个tkinter应用程序,希望在该应用程序中添加一个新窗口,以便更新当前操作的状态。我的意图是,每当一个事件完成时,我都想将其更新为一个单独窗口的文本小部件,该窗口并行运行。类似于控制台窗口,便于用户阅读和理解应用程序/错误等的状态 我对python和Tkinter相当陌生,我的方法如下: from tkinter import * from tkinter import ttk from Console import ConsoleWindow class Main:

我正在创建一个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 *
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'
我尝试将ConsoleWindow实例添加到insertText()

并得到以下错误

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

如何从主窗口更新控制台窗口。或者是否有其他方法可以用于此案例

您正在调用类本身的
insertText()
,而不是您创建的类的实例。嘿,jason,谢谢。是的,这是有效的,问题是,我创建的控制台窗口实例不是Main的一部分,或者只是在runConsole函数中,当我将它与主窗口self.console=ConsoleWindow(ConsoleWindow)关联时。现在这个self允许我使用实例调用它的函数。谢谢