确定哪个 Tkinter 小部件位于顶部(或可见)

Bur*_*ski 5 python tkinter

我想确定哪个小部件(在本例中为框架)位于顶部(或无论如何可见)。

from Tkinter import *
spam1=0
spam2=1000

def busywork():
    global spam1
    global spam2
    #if frame1 is on top / visible
    spam1=spam1+1
    label1.config(text=str(spam1))

    #if frame2 is on top / visable
    spam2=spam2+1
    label2.config(text=str(spam2))
    root.after(10,busywork)

root=Tk()
frame1=Frame(root)
frame2=Frame(root)

button1=Button(frame1,text="Bring Frame 2 to top",command=frame2.lift)
label1=Label(frame1,text=str(spam1))
button1.pack()
label1.pack()
frame1.place(relx=0,rely=0)


button2=Button(frame2,text="Bring Frame 1 to top",command=frame1.lift)
label2=Label(frame2,text=str(spam2))
button2.pack()
label2.pack()
frame2.place(relx=0,rely=0)
root.after(10,busywork)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

[这很接近]但它适用于窗口而不是框架(或一般的小部件)

在我的应用程序中,我有几个框架。每个框架上都有许多标签。busywork 功能从机床读取所有这些信息。一直获取所有信息会使整个机器变得缓慢。我只想获取和更新用户可以看到的信息。我可以找到一种方法,通过手动保留一个全局变量来告诉我最后一个 .lift()ed 窗口。但这似乎并不干净。(总共大约有 400 个标签需要更新。但是在任何给定时间最多只有大约 60 个可见。而且一些“标签”实际上是图形仪表面,因此更新时浪费了很多精力当它们不可见时这些)

fur*_*ras 2

当您单击按钮时,您可以设置一些变量来保存哪些标签可见的信息。

您可以将该变量添加到标签中:

frame1 = Frame(...)
frame1.visible = False
Run Code Online (Sandbox Code Playgroud)

或者您可以保留对可见框架的访问

visible = frame1
Run Code Online (Sandbox Code Playgroud)

如果所有框架都是具有功能的类,update则它只能更新该框架中的值

visible.update( all_data )
Run Code Online (Sandbox Code Playgroud)