将getMouse()函数应用于窗口的某个部分

0 投票
1 回答
6357 浏览
提问于 2025-04-17 21:27

我正在尝试把getMouse()这个函数应用到窗口的某个特定区域,而不是整个窗口。我希望如果点击的是'rect1'这个区域,它的颜色会改变。但是如果点击的是其他区域,就什么都不发生。我附上了我觉得和这个问题有关的代码部分,希望有人能帮我。

#draw the grid 
for j in range (6):
    for i in range(6):
        sq_i = Rectangle(Point(20 + (40*i), 20 + (40*j)),
                         Point(60 + (40*i),60 + (40*j)))
        sq_i.draw(window)
        sq_i.setFill('white')
        sq_i.setOutline('grey')

#wait for a click 
window.getMouse ()

#turn the alotted region red
rect1 = Rectangle(Point(20 + (40*1), 20 + (40*1)),
                         Point(60 + (40*1), 60 + (40*1)))
rect1.setOutline('black')
rect1.draw(window)
rect1.setFill('brown')

#if the mouse is clicked in rect1, change the block color to black 
while window.getMouse() in rect1:
    rect1.setFill('black')

1 个回答

2

首先,你需要明白 window.getMouse() in rect1 这个代码在干什么。Python里的 in 操作符是通过把 a in b 转换成 b.__contains__(a) 这个方法来工作的。可惜的是,Rectangle 类并没有 __contains__ 这个方法。这就是你现在面临的主要问题。

所以,你需要用其他的方法来测试。我建议你使用Python的链式比较操作符,自己来检查边界(在 graphics 模块里似乎没有现成的库可以用来做这个):

mouse = window.getMouse()
if rect1.p1.x < mouse.x < rect1.p2.x and rect1.p1.y < mouse.y < rect1.p2.y
    rect1.setFill("black")

注意,我把 while 循环改成了 if 语句。如果你想要不断测试鼠标点击,直到有一次点击在矩形内,你可能想用 while True 来循环,然后在条件满足时用 break 来退出循环:

while True:
    mouse = window.getMouse()
    if rect1.p1.x < mouse.x < rect1.p2.x and rect1.p1.y < mouse.y < rect1.p2.y
        rect1.setFill("black")
        break

撰写回答