我在Tkinter中使用了Scrolled Text小部件,但是当我在上面调用destroy()方法时,Box消失了,但滚动条保持了。我提供了一些图像,以便您可以更好地了解我在说什么。我怎样才能解决这个问题?
这里是代码,我在谈论item_description小部件。
def add_item():
global options
global add
global remove
global display
add.config(state = "disabled", relief = "sunken")
remove.config(state = "disabled")
display.config(state = "disabled")
name_label = Label(options, text = "Item Name")
name_label.grid(row = 1, column = 0, columnspan = 3, sticky = "w")
item_name = Entry(options, width = 35)
item_name.grid(row = 2, column = 0, columnspan = 3, sticky = "w")
description_label = Label(options, text = "Item Description")
description_label.grid(row = 3, column = 0, columnspan = 3, sticky = "w")
item_description = ScrolledText(options, width = 25, height = 5)
item_description.grid(row = 4, column = 0, columnspan = 3, sticky = "w")
price_label = Label(options, text = "Item Price")
price_label.grid(row = 5, column = 0, columnspan = 3, sticky = "w")
item_price = Entry(options, width = 5)
item_price.grid(row = 6, column = 0, sticky = "w", columnspan = 3)
item_price.insert(0, "$0.00")
stock_label = Label(options, text = "Stock")
stock_label.grid(row = 7, column = 0, columnspan = 3, sticky = "w")
item_stock = Entry(options, width = 5)
item_stock.grid(row = 8, column = 0, sticky = "w", columnspan = 3)
calories_label = Label(options, text = "Calories")
calories_label.grid(row = 9, column = 0, sticky = "w", columnspan = 3)
item_calories = Entry(options, width = 5)
item_calories.grid(row = 10, column = 0, sticky = "w", columnspan = 3)
date_label = Label(options, text = "Expiry Date")
date_label.grid(row = 11, column = 0, sticky = "w", columnspan = 3)
item_expiry_date = Entry(options, width = 12)
item_expiry_date.grid(row = 12, column = 0, sticky = "w", columnspan = 3)
item_expiry_date.insert(0, "dd/mm/yyyy")
stock_add = Button(options, text = "Add", borderwidth = 2, relief = "groove",
command = lambda: add_to_stock(item_name.get(),
item_description.get("1.0", "end-1c"),
item_price.get(),
item_stock.get(),
item_calories.get(),
item_expiry_date.get()))
stock_add.grid(row = 13, column = 0, sticky = "w", columnspan = 3)
global widgets_add
widgets_add = [name_label, item_name, description_label, item_description, price_label, item_price,
stock_label, item_stock, calories_label, item_calories, date_label, item_expiry_date, stock_add]
这是我从前一个代码结尾处创建的widgets_add列表中删除所有窗口小部件的代码。
def remove_add():
# Remove item adding dialog
global widgets_add
for widget in widgets_add:
widget.destroy()
问题是ScrolledText
小部件实际上创建了
Frame
Scrollbar
ScrolledText
但仅返回对ScrolledText
的引用。当您将其设为destroy()
时,Frame
和Scrollbar
会落在后面。
最简单的解决方案是将所有控件添加到Canvas
实例,然后将其添加到destroy()
。这样,您不必在单独的列表中跟踪它们。
因此,假设options
是您的Tk
实例:
def add_item():
global options
global add
global remove
global display
add.config(state = "disabled", relief = "sunken")
remove.config(state = "disabled")
display.config(state = "disabled")
options_canvas = Canvas(options)
name_label = Label(options_canvas, text = "Item Name")
name_label.grid(row = 1, column = 0, columnspan = 3, sticky = "w")
item_name = Entry(options_canvas, width = 35)
item_name.grid(row = 2, column = 0, columnspan = 3, sticky = "w")
description_label = Label(options_canvas, text = "Item Description")
description_label.grid(row = 3, column = 0, columnspan = 3, sticky = "w")
item_description = ScrolledText(options_canvas, width = 25, height = 5)
item_description.grid(row = 4, column = 0, columnspan = 3, sticky = "w")
price_label = Label(options_canvas, text = "Item Price")
price_label.grid(row = 5, column = 0, columnspan = 3, sticky = "w")
item_price = Entry(options_canvas, width = 5)
item_price.grid(row = 6, column = 0, sticky = "w", columnspan = 3)
item_price.insert(0, "$0.00")
stock_label = Label(options_canvas, text = "Stock")
stock_label.grid(row = 7, column = 0, columnspan = 3, sticky = "w")
item_stock = Entry(options_canvas, width = 5)
item_stock.grid(row = 8, column = 0, sticky = "w", columnspan = 3)
calories_label = Label(options_canvas, text = "Calories")
calories_label.grid(row = 9, column = 0, sticky = "w", columnspan = 3)
item_calories = Entry(options_canvas, width = 5)
item_calories.grid(row = 10, column = 0, sticky = "w", columnspan = 3)
date_label = Label(options_canvas, text = "Expiry Date")
date_label.grid(row = 11, column = 0, sticky = "w", columnspan = 3)
item_expiry_date = Entry(options_canvas, width = 12)
item_expiry_date.grid(row = 12, column = 0, sticky = "w", columnspan = 3)
item_expiry_date.insert(0, "dd/mm/yyyy")
stock_add = Button(options_canvas, text = "Add", borderwidth = 2, relief = "groove",
command = lambda: add_to_stock(item_name.get(),
item_description.get("1.0", "end-1c"),
item_price.get(),
item_stock.get(),
item_calories.get(),
item_expiry_date.get()))
stock_add.grid(row = 13, column = 0, sticky = "w", columnspan = 3)
def remove_add():
# Remove item adding dialog
global options_canvas
options_canvas.destroy()