Python TKinter:如何使用for循环中创建的相同名称删除多个小部件?

时间:2018-03-31 17:27:33

标签: python tkinter

我一直在尝试使用Python制作棋盘游戏,但我想知道如何在for循环中删除多个按钮,因为所有按钮都被称为btn并且是在for循环中创建的。目前,它只是在你点击它时打印每个数字,但我希望底部按钮删除所有编号的按钮。目前,它只删除按钮号63,无论我按下它多少次。有谁知道如何删除所有这些或通过删除框架或其他东西使用解决方法?这是我到目前为止所描述的代码。

from tkinter import *
from time import *
def remove():
    for x in range(0,64):
        btn.destroy()
def main():
    root = Tk()
    root.title("8x8 grid")
    Button(command = remove,text = "Remove all").grid(row = 8,column = 3,columnspan = 2)
    for pos in range(0,64):
        global btn
        btn = Button(command = lambda pos = pos: print(pos),width = 5,height = 2,relief = RIDGE,text = pos)
        btn.grid(row = pos // 8,column = pos % 8)
    root.mainloop()
main()

谢谢大家! (对不起,如果已经提出这个问题 - 我没有找到任何其他人提出同样的问题)

1 个答案:

答案 0 :(得分:1)

嗯,一个选项肯定是这样的:

from tkinter import *

buttons = []

def remove():
    for btn in buttons:
        btn.destroy()

def main():

    root = Tk()
    rem_btn = Button(command=remove, text="Remove all")
    rem_btn.grid(row=8, column=0, columnspan=8, sticky="ew")

    for pos in range(0, 64):
        btn = Button(command=lambda pos=pos: print(pos), width=5, height=2, relief=RIDGE, text=pos)
        btn.grid(row=pos // 8, column=pos % 8)
        buttons.append(btn)

    root.mainloop()

main()

这里的代码非常明显。将小部件存储在列表中,然后在remove事件中浏览并删除每个小部件 正如@progmatico指出的那样,winfo_children()方法也是可行的。这涉及更多的代码...

from tkinter import *

def main():

    def remove():
        for btn in frame.winfo_children():
            btn.destroy()

    root = Tk()

    frame = Frame(root)
    frame.grid(row=0, column=0)

    rem_btn = Button(root, command=remove, text="Remove all")
    rem_btn.grid(row=1, column=0, sticky="ew")

    for pos in range(0, 64):
        btn = Button(frame, command=lambda pos=pos: print(pos), width=5, height=2, relief=RIDGE, text=pos)
        btn.grid(row=pos // 8, column=pos % 8)

    root.mainloop()

main()

在这里,您可以创建一个单独的框架(缺乏想象力的frame)来保存您要删除的按钮。触发remove回调后,tkinter将删除此帧的所有子项,并通过frame.winfo_children()方法删除。 请注意,您在remove内定义main,否则Python将无法引用frame