Есть ли способ напечатать список списков в ярлыке tkinter? - PullRequest
1 голос
/ 04 марта 2020

У меня есть код, в котором я пытаюсь напечатать список списков в ярлыке 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()

1 Ответ

1 голос
/ 05 марта 2020

Стандартное правило:

"if you have many elements then keep them on list"    

Вы должны хранить метки в списке, и вам не нужно использовать exec() для создания переменных Label%d, а позже вы можете использовать for -l oop до 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()
...