我有一个代码,试图在tkinter标签中打印列表列表,但是它不能按我想要的方式工作。当我在下面运行脚本时,它将在list.txt中搜索输入的文本并将其打印在tkinter标签中。输入更多文本时,应清除先前搜索的文本,并根据list.txt文件中的搜索结果显示新文本。但是前面的文本没有被清除。下面是部分代码:
import tkinter as tk
import re
from tkinter import Label
class App(tk.Tk):
def __init__(self):
super().__init__()
self.var = tk.StringVar()
self.var.trace("w", self.show_message)
self.entry = tk.Entry(self, textvariable=self.var)
self.label = tk.Label(self)
self.entry.pack()
self.label.pack()
def show_message(self, *args):
value = self.var.get()
scen = []
text = "{}".format(value) if value else scen.clear()
if text:
words = re.split('[ ]', text.lower())
with open('list.txt','r') as mfl:
scen.clear()
for line in mfl:
if all(word in line.lower() for word in words):
txt = re.split("[._ -]",line)
scen.append(txt[:-1])
for i in range(len(scen)):
exec('Label%d=Label(app,text="%s")\nLabel%d.pack()'%(i,scen[i],i))
if __name__ == "__main__":
app = App()
app.mainloop()
答案 0 :(得分:1)
标准规则:
"if you have many elements then keep them on list"
您应该将标签保留在列表中,然后不必使用exec()
创建变量Label%d
,以后可以使用for
循环来destroy()
全部标签,然后再添加新标签。
import tkinter as tk
import re
from tkinter import Label
class App(tk.Tk):
def __init__(self):
super().__init__()
self.var = tk.StringVar()
self.var.trace("w", self.show_message)
self.entry = tk.Entry(self, textvariable=self.var)
self.label = tk.Label(self)
self.entry.pack()
self.label.pack()
# list for all labels
self.all_labels = []
def show_message(self, *args):
text = self.var.get()
scen = []
if text:
words = text.lower().split(' ')
with open('list.txt') as mfl:
scen.clear()
for line in mfl:
if all(word in line.lower() for word in words):
txt = re.split("[._ -]", line)
scen.append(txt[:-1])
# remove all labels
for item in self.all_labels:
item.destroy()
self.all_labels.clear() # remove references to old labels (as @acw1668 noticed in comment)
# add new labels
for item in scen:
l = tk.Label(self, text=item)
l.pack()
self.all_labels.append(l)
if __name__ == "__main__":
app = App()
app.mainloop()