当前位置: 首页 > 面试题库 >

如何检测python Turtle图形中的X(关闭)按钮?

程枫
2023-03-14
问题内容

当我在Turtle图形中运行无限循环绘图时单击X(关闭)按钮时,会出现一些错误消息。

这是一个例子:

import turtle

wn = turtle.Screen()
tess = turtle.Turtle()

while True:
    tess.forward(50)
    tess.left(120)
    tess.forward(50)

wn.mainloop()

当我关闭窗口时,将显示以下错误消息。

Traceback (most recent call last):
  File "/Users/user/Downloads/test.py", line 8, in <module>
    tess.forward(50)
  File "/Users/user/anaconda3/lib/python3.6/turtle.py", line 1637, in forward
    self._go(distance)
  File "/Users/user/anaconda3/lib/python3.6/turtle.py", line 1605, in _go
    self._goto(ende)
  File "/Users/user/anaconda3/lib/python3.6/turtle.py", line 3178, in _goto
    self._pencolor, self._pensize, top)
  File "/Users/user/anaconda3/lib/python3.6/turtle.py", line 545, in _drawline
    self.cv.coords(lineitem, *cl)
  File "<string>", line 1, in coords
  File "/Users/user/anaconda3/lib/python3.6/tkinter/__init__.py", line 2463, in coords
    self.tk.call((self._w, 'coords') + args))]
_tkinter.TclError: invalid command name ".!canvas"

我想知道如何避免此类错误消息。

有什么方法可以将tkinter模块中Tk类的“协议”方法与“ WM_DELETE_WINDOW”选项一起使用?


问题答案:

是的,确实可以通过注册一个函数(我称它为on_close,但是您可以选择任何函数名)来拦截窗口关闭事件,从而避免这种情况。

一个棘手的事情是该类的protocol一种方法Tk。在不tkinter使用Turtle的情况下,您可以Tk自己创建对象作为顶级(或“根”)窗口小部件。在使用turtle模块提供的小部件时,
我们如何访问顶级小部件? 它可以通过 winfo_toplevel canvas方法使用
(可以通过turtle模块或屏幕对象进行访问)。

您所观察到的错误是由无限循环导致的,该循环试图在窗口(以及画布)已经消失时绘制东西。因此,下一个棘手的事情是,如何防止它尝试这样做?正如Apostolos对“如何在Tkinter中处理窗口关闭事件?”的回答所建议的,我们可以使用全局布尔标志。(就像我叫Apostolos一样running。但是您可以选择对您有意义的任何名称。)这样,我们的循环不再是无限的了,它是一个有条件的循环。因为在三个乌龟移动之间可能关闭了窗口,所以我也检查了那里的标志:

import turtle

wn = turtle.Screen()
canvas = wn.getcanvas()  # or, equivalently: turtle.getcanvas()
root = canvas.winfo_toplevel()

tess = turtle.Turtle()

def on_close():
    global running
    running = False

root.protocol("WM_DELETE_WINDOW", on_close)

running = True

while running:
    tess.forward(50)
    if not running:
        break
    tess.left(120)
    if not running:
        break
    tess.forward(50)

在我的计算机上,如果没有这两个提示,它也可以正常工作而没有错误消息

    if not running:
        break

零件,但这可能只是幸运的时机,所以我不会依赖它。(除非有人可以解释为什么这总是足够的。)

注意: 不需要调用root.destroy()in on_close,因为无论如何,循环是程序中最后要运行的东西。( 请注意 ,我也
不会调用mainloop())。因此,当我们退出循环或由于其条件不再成立而导致循环结束时,程序将结束并关闭窗口。



 类似资料:
  • 我是Android新手。我正在尝试制作一个应用程序,它将在后台运行,并检测三次快速按下电源按钮。我查阅了很多资料,但无法澄清我的困惑。谁能给我一些建议吗?蒂亚。

  • 问题内容: 我有一个窗口(源自JFrame),并且我想在某些不可中断的操作期间禁用关闭按钮。我知道我可以通过调用按钮使按钮不执行任何操作(或在WindowListener中调用处理程序) 但我想在视觉上明确一点,单击它毫无意义。 问题答案: 如果我正确理解,则此错误报告表明当前无法实现。

  • 我对Java还很陌生,我试着查了一下,但没有找到任何有用的东西。我想知道我怎么能检测到一个特定的窗口关闭了?我一直在使用windowClosing(),但这适用于关闭的任何窗口,因此如果窗口B关闭,我希望由于窗口a关闭而发生的事件也会发生。我如何只在窗口A关闭的情况下进行检测?抱歉,如果这是一个糟糕的措辞,我不知道那么多Java术语。提前致谢:)

  • 问题内容: 您好,我要在关闭选项卡(不是浏览器)事件中查找信息,如果Java中有一个applet信息。我想知道是否有一个事件或一种检查该方法的方法。我只想捕获事件并创建一个小弹出框,说明您的会话将过期或类似的内容。使用Java或Javascript完全有可能吗? 更新:好的,你们向我指出的信息使我能够获得足够简单的JavaScript信息。现在它在IE,Chrome和Firefox中可以正常工作,

  • 我使用,并希望显示玩家得分的条形图,得分在y轴上,玩家的游戏在x轴上分组。 例如 由于玩家不必玩相同数量的游戏,因此在创建数据集时会产生大量空白,因为它试图为玩家2绘制一个条 有谁能帮我把这个空白处补上吗?理论上,玩家1可以继续玩100场游戏,而玩家2和3只玩几场,所以这看起来很荒谬!我是JFreeChart的新手,所以可能有一个明显的解决方案! 提前感谢您的帮助。

  • 问题内容: 我正在尝试在我的c程序中检测从Linux关闭或重新启动。我发现程序可以使用signal(SIGTERM,handler)(SIGKILL,handler)。但是,如果用户也使用命令杀死该进程,这两个触发器也会触发。 他们说,在某些解决方案中,可以使用运行级别,但无法运行。在系统初始化运行级别之前,不知道该进程是否被杀死。我什至尝试将脚本放在rcx.d中,但仍然无法正常工作。 有人建议吗