我正在开发一个 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)
我设法在以下帮助下解决了这个问题:如何创建一个类来在 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 函数不会相互接管。