python - Python Tkinter GUI:单击按钮删除函数内定义的画布对象
问题描述
我在尝试创建的基本 GUI 时遇到了一些问题。目标是有一个按钮,可以根据旋转框中的数字生成一定数量的图块。我已经让它大部分工作,如果旋转框值更改为更大的数字,单击“生成”按钮将生成新数量的图块,如预期的那样,但是如果我将旋转框更改为较小的数字,旧的瓷砖一代的背后可见新的。我希望能够canvas.delete('all')
采用以前的画布对象。
我试图通过不重新定义我感觉导致问题的函数内部的画布来解决这个问题,但是我无法重新绘制画布边界,因此可以生成的最大图块数量将受到限制由最初绘制的画布大小。通常我会认为我可以从函数返回画布,但由于它通过命令功能和 lambda 函数附加到按钮,我不知道如何去做。
import tkinter as tk
def generate_start(window, canvas, num_tiles):
canvas.delete('all')
canvas = tk.Canvas(window, width=40*num_tiles, height=40)
canvas.grid(row=1, columnspan=num_tiles)
for i in range(num_tiles):
tile_width = 40
x1 = i * tile_width
y1 = 0
x2 = (i + 1)*tile_width - 1
y2 = tile_width - 1
canvas.create_rectangle(x1, y1, x2, y2, fill='blue')
window = tk.Tk()
window.title('GUI')
tk.Label(window, text = "Number of starting tiles:").grid(row=0)
default_start_num = 6
var = tk.IntVar(value=default_start_num)
start_num = tk.Spinbox(window, from_=1, to=100,
textvariable=var)
start_num.grid(row=0, column=1)
canvas = tk.Canvas(window, width=40*default_start_num, height=40)
canvas.grid(row=1, columnspan=default_start_num)
generate_btn = tk.Button(window, text='Generate',
command=lambda: generate_start(window, canvas, int(start_num.get())))
generate_btn.grid(row=0, column=2)
window.mainloop()
解决方案
每次单击按钮时,您都在创建一个新画布。因此,当您调用 时canvas.delete('all')
,您将从旧画布中删除它们,然后创建一个新画布。
您需要创建一次画布。那,或者在创建新画布之前删除旧画布。
推荐阅读
- javascript - 将 dvi 转换为 pdf 而不在 reactJS 的网页中显示
- amazon-web-services - 向网站添加 SSL 证书/云前端分发不起作用
- node.js - 难以让 nonce 解决方法适用于 trix-editor style-src content-security-policy 违规
- javascript - 如何在 Angular 中添加页面刷新
- powershell - 我正在尝试使用 hugo 创建一个博客页面,它给出了一些烦人的错误
- javascript - 为 React-Bootstrap-Table2 输入输入时,模态总是重新渲染
- node.js - mongoose 中的 url 解析器错误不能包含多个主机名
- html - 带有空格的工具提示最大宽度:nowrap
- mysql - 具有复合主键 LIMIT 1 的 MySQL 表非常慢,而 Limit 2 很快
- python - 计算给定坐标的函数值