【发布时间】:2020-02-15 21:40:39
【问题描述】:
我在尝试创建的基本 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()
【问题讨论】:
标签: python user-interface canvas tkinter lambda