【发布时间】:2018-05-31 21:10:03
【问题描述】:
我正在创建一个简单的程序,该程序通过每次鼠标单击在每个单击位置上绘制一个随机颜色的缩小圆圈。每次单击都会创建一个直径为 50 的圆,该圆立即开始缩小到 0。每次点击都应该创建新的收缩圈。
但是,在我单击并创建另一个圆圈后,我的程序会停止缩小第一个圆圈。它仅完全收缩最后创建的圆圈。所有其他人都保持静止。 我认为问题在于功能本身。它调用未完成的相同函数。如何让它运行多次(每次点击分别)?还是我对局部变量和全局变量有误?
到目前为止,这是我的代码:
import tkinter
import random
c = tkinter.Canvas(width = 400, height = 300)
c.pack()
def klik(event):
global x, y, farba, circ, r
r = 50 #circle diameter
x, y = event.x, event.y #clicked position
color = '#{:06x}'.format(random.randrange(256 ** 3)) #random color picker
circ = c.create_oval(x - r, y - r, x + r, y + r, fill=color) #print circle
print(x, y, farba) #check clicked coordinates, not important
if r < 50: #reset size after each circle
r = 50
shrink()
def shrink():
global circ, x, y, r
print(r) #check if countdown runs correctly
if r > 0:
r -= 1 #diameter shrinking
c.coords(circ, x-r, y-r, x+r, y+r) #changing circle size
c.after(100, shrink) #timer, size 1pt smaller until size is 0
c.bind('<Button-1>', klik)
tkinter.mainloop()
【问题讨论】:
-
如果你想要多个圈子,你将需要使用和数组,而不仅仅是一个
circ变量 -
您可能希望在一个自包含的类中构建圆圈,该类在调用时将调用一个新的类实例并运行到完成。
-
@LioraHaydont 实际上根本不需要数组。所有这些都可以在具有嵌套函数或类的自包含函数中完成。
标签: python-3.x function tkinter bind tkinter-canvas