自学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()
答案 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()
从内存中删除它们,并自动将它们删除从网格。