在Tkinter的滚动文本小部件上使用.destroy()方法后,滚动条不会消失

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

我在Tkinter中使用了Scrolled Text小部件,但是当我在上面调用destroy()方法时,Box消失了,但滚动条保持了。我提供了一些图像,以便您可以更好地了解我在说什么。我怎样才能解决这个问题?Picture 1, Item DescriptionPicture 2, after calling the destroy() method

这里是代码,我在谈论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()
python python-3.x list tkinter scrollbar
1个回答
0
投票

问题是ScrolledText小部件实际上创建了

Frame
    Scrollbar
    ScrolledText

但仅返回对ScrolledText的引用。当您将其设为destroy()时,FrameScrollbar会落在后面。

最简单的解决方案是将所有控件添加到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()
© www.soinside.com 2019 - 2024. All rights reserved.