【问题标题】:Tkinter: Adding and self-deleting buttons in list | Adding works, Deleting notTkinter:在列表中添加和自删除按钮 |添加作品,不删除
【发布时间】:2020-03-30 12:53:10
【问题描述】:

我正在为一个程序创建一个输入表单,似乎我已经被这个逻辑卡住了。

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

我提取了代码进行审查,

非常感谢任何帮助!

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】:

    主要问题是您不断重复创建相同的按钮,因此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)
    

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

    您只需要创建新按钮,或者在重新创建之前删除所有旧按钮。

    【讨论】:

    • 好的,谢谢!但对我来说问题不是我不知道我必须删除按钮;问题是我无法弄清楚 _ 在哪里 _ 这样做。经过一些尝试,我想出了这样的东西:` def rel_buttons_update(arr): for rel in rel_buttons: rel.destroy() rel_buttons = [] ` 在 update_function 中,但它越来越混乱!
    • 或者换句话说:问题是,lambda 命令引用的不是这个特定的按钮,它是用它创建的 - 所以 del_button 函数大部分时间都不会删除任何东西。
    • @fschober:是的,这是另一种说法。您正在使用数组中的索引,并且您没有正确管理数组,因此索引引用的小部件与您认为的不同。
    猜你喜欢
    • 2018-01-27
    • 2023-01-20
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多