ウィンドウ内のラベルを動的に追加/削除/更新するスクリプトを作成しました。私が抱えている唯一の問題は、古いフレームのラベルが消えないことです。この問題により、ウィンドウの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つのラベルが表示されます。
新しいラベルは古いラベルの上にあります:
使用するgrid()
レイアウト・メカニズムとして、あなたは使用することができgrid_remove
たりgrid_forget
、あなたのラベルを削除します。それらを完全に削除したい場合destroy()
は、ウィジェット自体で使用してください。
より動的な動作を使用することをお勧めします。あなたは使用することができますtk.StringVar()
- (>その場合には、それのリストをdevice_list
あなたのデータを格納するために) -と使用
lb=tk.Label(self.root, textvariable=device_list[-1])
データを表示します。これを使用すると、ラベルの数が制限され、データフィールドごとに新しいラベルが作成されるわけではありません。
ラベルをリストに保存して削除するか、ラベルをコンテナ(例tk.Frame()
)に入れて、新しいデータを読み取るときにこのコンテナを再構築することを検討してください。
ウィジェットの削除に関するアドバイスについては、この質問も参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加