使用“after”进行更新的多个顶级窗口

问题描述 投票:0回答:1

我正在开发一个 Python Tkinter 应用程序,它可以打开顶级窗口的多个实例。

以下摘录测试顶级类的实例是否正在运行,如果没有,则运行一个新实例。如果它确实存在,则会将其带到前台。

        if (ConsoleGui.winlog[pcs] is not None):
            try:
                ConsoleGui.winlog[pcs].lift()
            except:
                ConsoleGui.winlog[pcs] = ClassEpsL.CreateEspLog(Console, pcs)
        else:
            ConsoleGui.winlog[pcs] = ClassEpsL.CreateEspLog(Console, pcs)

这很有用。

我的问题是顶层窗口的每个实例都有一个在“after”循环中运行的函数来更新文本小部件,例如

def CreateEspLog(self, pcs):
        espLWin = Toplevel(self)
        ...
        text = Text(espLWin, wrap="none", width=600, height=400)
        ...
        def refreshEspL(self):
            print("pcsNode: {}".format(ClassEpsL.pcsNode))
            if MQTT.BrokerConnected:
                ClassEpsL.espLogUpdate(self)
            espLWin.after(200, refreshEspL, self)

        espLWin.after(200, refreshEspL, self)
        return espLWin

toplevel
窗口的最新实例从不再更新的旧实例接管此循环的运行。

我还没有找到解决方案:

创建以某种方式唯一标识该行的实例:

espLWin.after(200, refreshEspL, self)

或者我可以以某种方式从我的根窗口调用我的

toplevel
窗口函数
refreshEspL
,例如

ConsoleGui.winlog[pcs].refreshEspL(self)
python tkinter toplevel
1个回答
0
投票

我设法在以下帮助下解决了这个问题:如何创建一个类来在 tkinter 中创建一个主窗口的多个顶层?

我是 Python 和 Tkinter 的新手,但这可能会对其他新手有所帮助。

通过将我的实例创建为具有如下变量名称的类:

class ClassEspL(Toplevel):
    def __init__(self, top_level, textWW, pcsNode):
        super().__init__()
        self.top_level = top_level
        self.title("ESP Logging WIN: {} - {}".format(pcsNode, Site.PCSList[pcsNode].eui64))

        self.textW = textWW
        textW = Text(self, wrap="none", width=70 , height=20, bg="black")
        textW.pack()
    self.updateF(pcsNode, textW)
    
    def updateF(self, pcsNode, textW):
        print("pcsNode: {}".format(pcsNode))
        textW.insert(END, line, tag)
        textW.see(END)
        self.after(1000, self.updateF, pcsNode, textW)

并从我的根窗口调用它,如下所示:

def callback_ESPLogger(self, pcs):
    def createShowLoggerWindow(self, pcs):
        if (ConsoleGui.winlog[pcs] is not None):
            try:
                ConsoleGui.winlog[pcs].lift()
            except:
                ConsoleGui.winlog[pcs] = ClassEspL("top_level{}".format(pcs), "textW{}".format(pcs), pcs)
        else:
            ConsoleGui.winlog[pcs] = ClassEspL("top_level{}".format(pcs), "textW{}".format(pcs), pcs)
            
    if pcs == 99: # create multiple instance
        for pcs in range(0, Site.Config.numberofpcs):
            createShowLoggerWindow(self, pcs)
    else:
        createShowLoggerWindow(self, pcs) # create 1 instance

...我的 ClassEspL 的每个实例都有一个唯一的名称和句柄,并且我的 updateF 函数不会相互接管。

© www.soinside.com 2019 - 2024. All rights reserved.