Tkinter:列表中的添加和自删除按钮|添加作品,不删除

问题描述 投票:0回答:1

我正处于为程序创建入口表格的过程中,似乎我对这一逻辑感到困惑。

基本上,我想设计一个dropdwon列表,该列表将单词添加到数组中并将这些单词显示为数组下方的小按钮。当您单击按钮时,它们再次消失并从阵列中删除它们自己。我想很简单。到目前为止,添加工作正常。但是删除不多...按钮数组存在逻辑错误,我似乎无法弄清楚!

我提取了要检查的代码,

非常感谢您的帮助!

Word adding Window

import tkinter as tk
from tkinter import ttk

def rel_add(*args):
    rel_array.append(tkvar.get())
    print(rel_array)
    rel_buttons_update()


def del_button(i):
    print(i)
    del rel_array[i] 
    print(rel_array)
    rel_buttons[i].grid_remove()
    # del rel_buttons[i]
    rel_buttons_update()


def rel_buttons_update():
    for i, rel in enumerate(rel_array):
        rel_buttons.append(tk.Button(rel_grid, text=rel, font="Helvetica 7", command=lambda c=i: del_button(c)))
        rel_buttons[i].grid(column=i, row=0, sticky="nw")

rel_array = []
rel_buttons = []
win = tk.Tk()                           

tkvar = tk.StringVar(win)             # Create a Tkinter variable

choices_words = ["oolbath", "pflanze", "haus", "wasser", "brimbambum"]      # Create Variable List

tkvar.set('Related Words...')              # set the default option
choices_words.sort()                        # Sort List

tk.Label(win, text="Related Words: ").grid(row=0,column=0, sticky="w")
rel = tk.OptionMenu(win, tkvar, *choices_words)   
rel.grid(row=0,column=1, sticky="w")  

# Callbuck Function for Dropdwon Menu

tkvar.trace("w", rel_add)

rel_grid = tk.Frame(win)



# Display the Buttons for the related Words

rel_grid.grid(row=1,column=1, sticky="w") 


win.mainloop()
python button tkinter callback optionmenu
1个回答
0
投票

主要问题是您不断重复创建相同的按钮,因此rel_buttons包含的元素比您预期的要多。

作为一个简单的实验,像这样向rel_buttons_update添加打印语句:

def rel_buttons_update():
    for i, rel in enumerate(rel_array):
        rel_buttons.append(ttk.Button(rel_grid, text=rel, command=lambda c=i: del_button(c)))
        rel_buttons[i].grid(column=i, row=0, sticky="nw")
    print('in update, rel_buttons is now', rel_buttons)

[您会注意到,第一次使用选项菜单时有一个按钮,第二次是三个按钮,第三次是六个按钮,依此类推。

您只需创建新按钮,或删除所有旧按钮,然后再重新创建它们。

© www.soinside.com 2019 - 2024. All rights reserved.