我创建了一个脚本,可以在窗口中动态添加/删除/更新标签。 我唯一的问题是旧的框架标签不会消失.. 这个问题导致一些标签在窗户的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个标签:
连接了2个设备,然后显示了2个标签:
新标签位于旧标签之上:
答案 0 :(得分:1)
使用grid()
作为布局机制,您可以使用grid_remove
或grid_forget
删除标签。
如果要永久删除它们,请在小部件本身上使用destroy()
。
我建议使用更动态的行为。您可以使用tk.StringVar()
(在这种情况下为其列表 - > device_list
)来存储您的数据 - 并使用
lb=tk.Label(self.root, textvariable=device_list[-1])
显示您的数据。使用它将为您提供有限数量的标签,而不是为每个数据字段创建一个新标签。
将标签存储在列表中以将其删除或考虑将标签放入容器(例如tk.Frame()
)并在读取新数据时重建此容器。
另请参阅此question以获取有关删除小部件的建议。