首页 > 解决方案 > 立即销毁 tkinter 按钮和菜单

问题描述

我是使用 tkinter 的新手,我正在尝试开发一个界面,该界面接受初始用户输入,使用它从数据库中获取数据,然后更改窗口中的小部件以收集不同的用户输入。

现在,我的应用程序将从条目小部件中获取一个字符串,并从选择菜单中获取一个字符串。然后我有一个开始按钮,它连接到我编写的用于启动数据收集过程的函数。

单击此按钮时,我希望删除下拉菜单、输入框和按钮,以便我可以在它们的位置添加其他小部件,例如我试图cycle_bins在下面的节略代码中添加的功能中的按钮.

我知道我需要使用 destroy() 函数来删除这些小部件,但我遇到的问题是原始小部件在整个功能完成之前不会被删除,而我希望这些小部件被删除在我执行其余的功能之前,我可以继续收集其他用户输入,使用不同的小部件。

我正在使用以下精简代码:

# code to get data from database and start the count
def start_count(cycle_count, tmstamp):
    # delete original widgets (not working, does not remove immediately)
    button.destroy()
    ent_date.destroy()
    menu.destroy()
    
    # get data from db
    bin_list = fn.get_info(cycle_count, tmstamp) # returns dataframe of bins and locations
    
    # call next function to start cycle of data
    cycle_bins(bin_list)

# code to cycle through bins returned from db and ask for user input
def cycle_bins(bins): 
    # add new button to go to next bin and record user input
    new_button = tk.Button(
        text="new",
        width=25,
        height=5,
        bg="grey"
    )
    new_button.pack()
    
    # code loop to cycle through list of bins and gather user input from newly added widgets

# create window code
window = tk.Tk()
window.geometry("500x250")
window.title("Cycle Count")
greeting = tk.Label(text="Cycle Count", height=5)
greeting.pack()

# entry widget
ent_date = tk.Entry(master=window)
ent_date.pack()

# drop down menu
count_type = tk.StringVar(window)
menu = tk.OptionMenu(window, count_type, "AL", "AU", "BL", "BU", "Audit")
menu.pack()

# start button
button = tk.Button(
    text="Start Cycle Count",
    width=25,
    height=5,
    bg="grey",
    command = lambda: start_count(count_type.get(), ent_date.get())
)
button.pack()

window.mainloop()

我认为问题可能是在整个函数结束之前窗口不会用新的小部件更新,所以我尝试编写一个简单的函数,它只有代码来破坏我调用的原始小部件,start_count但这给了我仍然遇到同样的问题,窗口不会破坏旧的小部件并添加新的小部件,直到start_count功能完成。我也无法在网上找到任何其他有类似问题的人来找到答案。

我之所以需要立即更新窗口是因为当原来的按钮调用时start _count,那个函数调用的cycle_bins函数,在官方代码中,有一个大循环,循环遍历start_count函数传入的数据帧,并要求用户输入,通过新的小部件,基于数据框的当前行。但是,就目前的程序而言,函数中的循环和代码cycle_bins必须在对窗口进行任何更新之前完成,因为它是由start_count. 因此,当程序的其余部分运行时,窗口将有一个按下的按钮和两个输入小部件。

我还应该解释一下,我fn.get_info()在单独的文件中具有类似功能,以使事情更有条理和清晰。我在 tkinter 窗口的同一个文件中拥有这篇文章中显示的两个函数的唯一原因是因为它们编辑了窗口,据我所知,这必须在同一个文件中完成,按照我一直在关注的教程关于创建 tkinter GUI。

如果您以前遇到过这个问题并找到了解决方案,或者我是否以错误的方式解决这个问题并且有更简单的方法,请告诉我。非常感谢您的专业知识。

标签: pythontkinter

解决方案


试试root.update()方法。

没问题。


推荐阅读