0

我在 Calico IDE 中使用 Graphics 和 Myro 包,任何人都可以想办法让我按下“q”键并让程序终止吗?目前,当我按下“q”键时,我必须在窗口上单击鼠标才能终止。

def main():
    win = Window(800,500)
    bg = Picture("http://www.libremap.org/data/boundary/united_states/contig_us_utm_zone_14_600px.png")
    bg.draw(win)
    while True:
        char = win.getKeyPressed()
        if char == 'q':
            win.close()
            break
        x, y = win.getMouse()
        MPO = Rectangle(Point(x,y), Point(x+10,y+10))
        MPO.fill = Color("white")
        MPO.draw(win)
4

1 回答 1

1

我以前从未听说过 Calico,但是从 5 秒看文档,我看到了:

getMouse() - 等待用户点击并返回窗口中的 (x, y) 位置

所以,我敢打赌这就是为什么你必须在按下 Q 键之前单击窗口的原因——因为你的程序卡在getMouse()调用内部等待,正如文档所说的那样。

即使文档没有解释这一点,您也可以通过添加一些打印/日志记录和/或在调试器中运行,以查看当它没有响应您的按键时它在哪里陷入困境。

例如,快速而肮脏的方式来做到这一点:

while True:
    print 'Before getKeyPressed'
    char = win.getKeyPressed()
    print 'After getKeyPressed, got', char
    if char == 'q':
        print 'About to close because of q'
        win.close()
        print 'Closed'
        break
    print 'Before getMouse'
    x, y = win.getMouse()
    print 'After getMouse, got', x, y

… 等等。

当然,在现实生活中,您不想为每一行代码添加打印语句。(并且,当您确实需要时,您需要一种比手动编写所有这些行更智能的检测方式。)但是您可以添加一些以将其缩小到一般区域,然后放大并在该区域内添加更多,依此类推,直到找到罪魁祸首。

同时,如果您将代码更改为使用getMouseNow()而不是getMouse(),那将解决问题,但只有通过忙循环和一遍又一遍地重绘窗口,无论您是否已经做过任何事情。

您在这里真正需要的——对于任何 GUI 应用程序——是一个事件循环。我可以看到有一些名为onMouseDownand的函数onKeyPress,这看起来正是您在这里所需要的。

于 2013-01-02T23:54:00.963 回答