我的问题如下:
当您单击鼠标左键时,应该修复一次点击,但由于某种原因,它仅由一个立方体修复。
我附上代码。
from tkinter import *
import random
class Rectangle:
def __init__(self, canvas, coord, fill, outline=None):
self.x = random.randint(-5, 5)
self.y = random.randint(-5, 5)
self.canvas = canvas
self.outline = outline if outline is not None else fill
self.fill = fill
self.canvas_id = self.canvas.create_rectangle(coord, outline=self.outline, fill=self.fill)
self.canvas.bind('<Button-1>', self.click)
def draw(self):
if (self.canvas.coords(self.canvas_id)[0] < 1 or self.canvas.coords(self.canvas_id)[2] > 700):
self.x = self.x * (-1)
elif (self.canvas.coords(self.canvas_id)[1] < 1 or self.canvas.coords(self.canvas_id)[3] > 400):
self.y = self.y * (-1)
self.canvas.move(self.canvas_id, self.x, self.y)
self.canvas.after(35, self.draw)
def click(self, event):
x = event.x
y = event.y
print(self.canvas_id)
if (x < self.canvas.coords(self.canvas_id)[2] and x > self.canvas.coords(self.canvas_id)[0]) and (
y < self.canvas.coords(self.canvas_id)[3] and y > self.canvas.coords(self.canvas_id)[1]):
print('Target')
#self.canvas.delete(self.canvas_id)
root = Tk()
root.geometry('800x500')
root.title('Курсовая работа')
c = Canvas(width=700, height=400, bg='black')
c.place(x=50, y=10)
rectangle = [Rectangle(c, (10, 20, 40, 50), fill='red') for i in range(8)]
for rec in rectangle:
rec.draw()
# Кнопки запуска, остановки и выхода из программы
vars = IntVar()
vars.set(0)
r1 = Radiobutton(text='СТАРТ', indicatoron=0, variable=vars, value=1, font='Times 15', bg='green')
r2 = Radiobutton(text='СТОП', indicatoron=0, variable=vars, value=0, font='Times 15', bg='yellow')
r1.place(x=50, y=430)
r2.place(x=150, y=430)
root.mainloop()
您已在“循环”中创建了 8 个对象 -
rectangle[0], ...,rectangle[7]。当它们每个被创建时,
__init__()命令被执行(在方法中)self.canvas对于他们每个人来说,都有相同的对象 -c。但self.click不会,因为此方法特定于每个对象- 它只测试该对象的鼠标单击匹配。这意味着在创建一个新的对象后,每次都重写鼠标单击与其应执行的功能之间的连接,并且最终单击将仅与最后一个对象的过程相关联。
self.click方法.bind()就简单了rectangle[7].click!更正:
从方法中删除此命令,从而从类定义中删除
__init__()方法定义。使用click函数click()中的方法代码,即 在类定义之外,创建对象(Canvas 类型)和对象列表之后的某个位置:click()crectangle然后将鼠标点击绑定到此函数:
笔记:
.click()我使用了类方法中的代码Rectangle,因此您可以立即看到相似性。但正如你可能明白的那样,他并不是最美丽的。我希望你也喜欢这个: