如何在Tkinter窗口中动态添加/删除/更新标签?

时间:2015-07-13 08:52:34

标签: python python-3.x tkinter

我创建了一个脚本,可以在窗口中动态添加/删除/更新标签。 我唯一的问题是旧的框架标签不会消失.. 这个问题导致一些标签在窗户的bg中产生干扰,当然这会导致某种内存泄漏(不确定这里是否是正确的术语......)。

这是我的代码:

import tkinter as tk
from tkinter.ttk import *
from subprocess import call,Popen,PIPE, STDOUT

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("devices networks")
        self.update_clock()
        self.root.mainloop()

    def update_clock(self):
        i=0
        adb_absolute_path = "C:\\Users\\ilan.MAXTECH\\AppData\\Local\\Android\\Sdk\\Platform-tools\\"

        # Get the list of connected devices
        cmd = adb_absolute_path+"adb.exe devices"
        proc = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT)
        device_list = proc.communicate()[0].decode().split("\r\n")
        # remove unnecessary text in devices call
        device_list.pop(0)
        device_list.remove("")
        device_list.remove("")


#### not working.... #######
#        #erase the old labels ( in case a device has been disconected
#        for line in range(10):
#            lb = Label(self.root, text="")
#            lb.grid(row=1, column=line)
###########################

        #print netcfg for each device
        for device in device_list:

            #get the netcfg for specific device
            device_serial = device.split("\t")[0]
            cmd = adb_absolute_path + "adb.exe -s " + device_serial + " shell netcfg"
            proc = Popen(cmd, shell=True, stdout=PIPE, stderr=STDOUT)
            netcfg_output = proc.communicate()[0].decode()

            #add a new label to the screen
            lb = Label(self.root, text=device_serial+"\n"+netcfg_output)
            lb.grid(row=1, column=i)
            lbblank = Label(self.root,text="\t\t")
            lbblank.grid(row=1, column=i+1)
            i += 2

        self.root.geometry(str(device_list.__len__()*450)+"x700")
        self.root.after(1000, self.update_clock)

app=App()

以下是一些屏幕截图:

连接了3个设备,然后显示3个标签:

3 devices are connected then 3 labels are shown

连接了2个设备,然后显示了2个标签:

2 devices are connected then 2 labels are shown

新标签位于旧标签之上:

new labels are on top an old ones

1 个答案:

答案 0 :(得分:1)

使用grid()作为布局机制,您可以使用grid_removegrid_forget删除标签。 如果要永久删除它们,请在小部件本身上使用destroy()

我建议使用更动态的行为。您可以使用tk.StringVar()(在这种情况下为其列表 - > device_list)来存储您的数据 - 并使用

lb=tk.Label(self.root, textvariable=device_list[-1])

显示您的数据。使用它将为您提供有限数量的标签,而不是为每个数据字段创建一个新标签。

将标签存储在列表中以将其删除或考虑将标签放入容器(例如tk.Frame())并在读取新数据时重建此容器。

另请参阅此question以获取有关删除小部件的建议。