如何删除旧的小部件

时间:2019-09-11 14:32:53

标签: python tkinter

自学python GUI构建。有一个简单的骰子滚轮程序,让您选择骰子的数量和边数。它使用for循环生成一系列小部件,这些小部件显示单个卷和每个卷的总数。

如果我增加骰子的数量,我会得到更多的小部件。

如果我减少骰子的数量,我得到的小部件就会更少。

我的问题是,尽管更多的骰子覆盖了旧的小部件,但更少的条目却无法杀死旧的小部件。

我应该在哪里放置widget.grid_remove()之类的东西,或者每次有人按下按钮时如何重新绘制所有内容?

# Get the numbers off the spinboxen:
def rollDice():

  size=int(spin_die.get())
  dice=int(spin_number.get())
  total=0
  for i in range(0, dice): 
    roll=random.randint(1, size)
    total+=roll
    rollNumber=i+1
    lbl_roll = tk.Label(app, text="Roll " + str(rollNumber) + ": " + str(roll), font=("Source Code Pro Med    ium", 12))
    roll_grid = i+3
    lbl_roll.grid(column=0, row=roll_grid)

  lbl_total = tk.Label(app, text="Total: " + str(total), font=("Source Code Pro Medium", 12))
  lbl_total.grid(column=0, row=roll_grid+1)

# Create window
window = tk.Tk()
window.title("Die Roller")
app = tk.Frame(window)
app.grid()

# create text labels for spinboxen
lbl_die = tk.Label(app, text="Size of Die: ", font=("Source Code Pro Medium", 12))
lbl_die.grid(column=0, row=0)
lbl_number = tk.Label(app, text="Number to roll: ", font=("Source Code Pro Medium", 12))
lbl_number.grid(column=0, row=1)

# Adjacent to each label, create a 1-100 spinbox
defaultDie = tk.StringVar()
defaultDie.set(6)
spin_die = tk.Spinbox(app, from_=1, to=100, width=4, textvariable=defaultDie)
spin_die.grid(column=1, row=0)

defaultNumber = tk.StringVar()
defaultNumber.set(2)
spin_number = tk.Spinbox(app, from_=1, to=100, width=4, textvariable=defaultNumber)
spin_number.grid(column=1, row=1)

# Create a button to start the action!
btn_number = tk.Button(app, text="Roll Dice", command=rollDice)
btn_number.grid(column=0, row=2)

window.mainloop()

1 个答案:

答案 0 :(得分:0)

将所有生成的窗口小部件保留在全局列表中,以便在创建新窗口小部件之前将其删除时可以访问它们。

import tkinter as tk
import random

# Get the numbers off the spinboxen:
def rollDice():
  global all_labels # inform function to use external/global variable instead of local one when you do `= []`

  # destroy old widgets
  for item in all_labels:
        item.destroy()

  # create new empty list for new widgets    
  all_labels = [] 

  size = int(spin_die.get())
  dice = int(spin_number.get())
  total = 0
  for i in range(0, dice): 
    roll = random.randint(1, size)
    total += roll
    rollNumber = i+1
    lbl_roll = tk.Label(app, text="Roll " + str(rollNumber) + ": " + str(roll), font=("Source Code Pro Med    ium", 12))
    roll_grid = i+3
    lbl_roll.grid(column=0, row=roll_grid)
    all_labels.append(lbl_roll) # append

  lbl_total = tk.Label(app, text="Total: " + str(total), font=("Source Code Pro Medium", 12))
  lbl_total.grid(column=0, row=roll_grid+1)
  all_labels.append(lbl_total) # append

# --- main ---

# empty list at start
all_labels = []

# Create window
window = tk.Tk()
window.title("Die Roller")
app = tk.Frame(window)
app.grid()

# create text labels for spinboxen
lbl_die = tk.Label(app, text="Size of Die: ", font=("Source Code Pro Medium", 12))
lbl_die.grid(column=0, row=0)
lbl_number = tk.Label(app, text="Number to roll: ", font=("Source Code Pro Medium", 12))
lbl_number.grid(column=0, row=1)

# Adjacent to each label, create a 1-100 spinbox
defaultDie = tk.StringVar()
defaultDie.set(6)
spin_die = tk.Spinbox(app, from_=1, to=100, width=4, textvariable=defaultDie)
spin_die.grid(column=1, row=0)

defaultNumber = tk.StringVar()
defaultNumber.set(2)
spin_number = tk.Spinbox(app, from_=1, to=100, width=4, textvariable=defaultNumber)
spin_number.grid(column=1, row=1)

# Create a button to start the action!
btn_number = tk.Button(app, text="Roll Dice", command=rollDice)
btn_number.grid(column=0, row=2)

window.mainloop()

grid_remove()仅从网格中删除,而不从内存中删除,因此您可以再次显示它们,但我不想再次使用它们,因此我使用destroy()从内存中删除它们,并自动将它们删除从网格。

相关问题