删除从同一变量创建的标签

时间:2014-09-16 06:55:15

标签: python tkinter labels

我想从屏幕上删除某些标签。问题是我不知道如何单独访问每个标签。我使用相同的变量tile_frame_column创建了每个标签, 假设我的屏幕上显示以下字母:'a''r''p'''d''''j':我想删除'r''e''d'但是每个字母都创建了按tile_frame_column

我尝试使用tile_frame_column.place_forget(),但它只删除了创建的最后一个字母 - 'j'。如何访问这些相关标签?

以下代码:

def add_letter():
   global tile_frame_column
   global list_to_string
   global i
   global j
   if not tiles_letter:
       return
   rand = random.choice(tiles_letter)
   tile_frame_column = Label(root, text=rand)  # each letter is created from tile_frame_column
   tile_frame_column.place(x=i, y=j)  # I place random letters on the screen
   tiles_letter.remove(rand)  # remove that tile from list of tiles
   i+=20
   if (len(tiles_make_word) % 12 == 0) & (len(tiles_make_word) > 0):
       i=35
       j+=20
       tile_frame_column.place(x=i, y=j)
       i+=20
   tiles_make_word.append(rand)
   list_to_string = ''.join(tiles_make_word)  # converts each letter in list to a string
   root.after(1000, add_letter)

root.after(1000, add_letter)

2 个答案:

答案 0 :(得分:1)

除了建议的答案之外,我建议使用字典而不是列表。这使您可以选择为标签指定密钥,这样可以更轻松地找到要删除的标签。这是一个例子:

这将生成具有随机字符的标签,并将标签放在作为字符的键下的self.dict下。这样,当您知道它包含的字符时,您可以轻松删除标签。在此示例中,您可以在条目中输入要删除的标签的字符,并删除该标签。

请注意,当您有两个相同的字母时,您必须考虑如何使用它,因为当您尝试在同一个键下放入时,第二个标签将替换字典中的第一个。您可以使用if letter in self.dict.keys():

检查它是否已存在
import Tkinter as tk
import random
import string

class App():

    def __init__(self):

        self.root = tk.Tk()
        self.dict={}
        button1 = tk.Button(self.root, text='print dict', command=self.print_dict)
        button1.pack()
        button2 = tk.Button(self.root, text='insert label', command=self.insert_label)
        button2.pack()
        self.var = tk.StringVar()
        entry = tk.Entry(self.root, textvariable=self.var)
        entry.pack()
        button3 = tk.Button(self.root, text='delete label', command=self.delete_label)
        button3.pack()
        self.root.mainloop()

    def insert_label(self):
        letter = random.choice(string.letters)
        # you could put something like
        # if not letter in self.dict.keys():
        # here to prevent making two of the same labels
        self.dict[letter] = tk.Label(self.root, text=letter)
        self.dict[letter].pack()

    def print_dict(self):
        print self.dict

    def delete_label(self):
        letter = self.var.get()
        try:
            self.dict[letter].pack_forget()
            del self.dict[letter]
            self.var.set('')
        except:
            self.var.set('Label unknown')

App()

答案 1 :(得分:-1)

您可以创建另一个变量num_labels来计算所做标签的数量,然后在标签变量名称中使用该变量,例如。

global num_labels
num_labels = 0
def add_letter():
    global num_labels
    num_labels += 1
    tiles_frame_column = [1, 2, 3, 4, 5, 6, 7, 8, 9] # etc. however many numbers you have.
    tiles_frame_column[num_labels] = Label(root, text=rand)
    # and carry on with rest of code

然后你必须测试每个标签号码,看看你想要删除一些字母时的字母。