使用海龟模块 exitonclick()

2023-12-03

我的代码应该在第一部分之后关闭turtle.screen,然后启动另一个屏幕并执行第二部分。但在那里它没有按预期工作。

import turtle

ws = turtle.Screen()
tod_1 = turtle.Turtle()
tod_1.color("red", "green")
tod_1.begin_fill()
for i in range(3):
    tod_1.forward(50)
    tod_1.left(360 / 3)
tod_1.end_fill()
ws.exitonclick()

input("go'press any thing' ")

ws = turtle.Screen()
tod_2 = turtle.Turtle()
tod_2.color("red", "green")
tod_2.begin_fill()
for i in range(6):
    tod_2.forward(50)
    tod_2.left(360 / 6)
tod_2.end_fill()
ws.exitonclick()

第一部分工作正常,但我在 input() 之后得到这个:

go'press any thing' 
Traceback (most recent call last):
  File "test2.py", line 16, in <module>
    tod_2 = turtle.Turtle()
  File "C:\Users\itt\AppData\Local\Programs\Python\Python36-32\lib\turtle.py", line 3816, in __init__
    visible=visible)
  File "C:\Users\itt\AppData\Local\Programs\Python\Python36-32\lib\turtle.py", line 2557, in __init__
    self._update()
  File "C:\Users\itt\AppData\Local\Programs\Python\Python36-32\lib\turtle.py", line 2660, in _update
    self._update_data()
  File "C:\Users\itt\AppData\Local\Programs\Python\Python36-32\lib\turtle.py", line 2646, in _update_data
    self.screen._incrementudc()
  File "C:\Users\itt\AppData\Local\Programs\Python\Python36-32\lib\turtle.py", line 1292, in _incrementudc
    raise Terminator
turtle.Terminator

我尝试使用以下方法清除所有变量:

import sys
sys.modules[__name__].__dict__.clear()

然后再次导入海龟并执行第二步。部分,但没有成功。


似乎当turtle被导入它会创建许多对象并且exitonclick()删除所有它们 - 不仅Screen(). exitonclick()被创建来结束程序。

但你可以使用oscreenclick(function_name)将功能分配给鼠标单击,这将清除屏幕并绘制下一个对象。onscreenclick使用两个参数执行函数 - 单击的位置 - 因此函数必须接收此信息。

import turtle

# --- functions ---

def second(x, y): 
    # clear screen
    tod.reset()

    tod.color("red", "green")
    tod.begin_fill()
    for i in range(6):
        tod.forward(50)
        tod.left(360 / 6)
        tod.end_fill()

    # run another function on click
    #turtle.onscreenclick(third)

    # end program on click 
    turtle.exitonclick()

# --- main ---

tod = turtle.Turtle()

tod.color("red", "green")
tod.begin_fill()
for i in range(3):
    tod.forward(50)
    tod.left(360 / 3)
    tod.end_fill()

# assign function to click on screen
turtle.onscreenclick(second)

# you need it to - it checks if you clicked (and does othere things)
turtle.mainloop()

EDIT:如果您必须删除窗口并再次显示,则可以使用tod._screen._root访问主窗口,使用tkinter,您可以隐藏/显示它

tod._screen._root.iconify()   # hide
input("Press Enter: ")
tod._screen._root.deiconify() # show again

工作示例:

#!/usr/bin/env python3

import turtle

# --- functions ---

def stop(callback):

    #tod._screen._root.attributes("-topmost", False)

    tod._screen._root.iconify()
    # upper Y in text means that it will be default answer if you press only Enter
    answer = input("Show more images? [Y/n]: ").strip().lower()
    if not answer: # empty string treat as `Y`
        answer = 'y'
    tod._screen._root.deiconify()

    # problem with moving window above other windows
    #tod._screen._root.lift()
    tod._screen._root.attributes("-topmost", True)
    #tod._screen._root.update()

    if answer == 'y':
        callback()
    else:
        #turtle.exitonclick()
        # or
        turtle.bye()

def first(x=0, y=0):
    tod.color("red", "green")
    tod.begin_fill()
    for i in range(3):
        tod.forward(50)
        tod.left(360 / 3)
        tod.end_fill()

    # assign function to click on screen
    turtle.onscreenclick(lambda x,y:stop(second))

def second(x=0, y=0):
    # clear screen
    tod.reset()

    tod.color("red", "green")
    tod.begin_fill()
    for i in range(6):
        tod.forward(50)
        tod.left(360 / 6)
        tod.end_fill()

    # assign function to click on screen
    turtle.onscreenclick(lambda x,y:stop(third))

def third(x=0, y=0):
    # clear screen
    tod.reset()

    tod.color("red", "green")
    tod.begin_fill()
    for i in range(12):
        tod.forward(50)
        tod.left(360 / 12)
        tod.end_fill()

    # end program on click
    turtle.exitonclick()

# --- main ---

tod = turtle.Turtle()

first()

# you need it to - it checks if you clicked (and does othere things)
turtle.mainloop()

但不是input()您可以使用tkinter及其消息框

answer = tkinter.messagebox.askyesno('More?', "Show more images?")

工作示例:

#!/usr/bin/env python3

import turtle
import tkinter.messagebox

# --- functions ---

def stop(callback):

    answer = tkinter.messagebox.askyesno('More?', "Show more images?")
    print('answer:', answer)

    if answer:
        callback()
    else:
        #turtle.exitonclick()
        # or
        turtle.bye()

def first(x=0, y=0):
    tod.color("red", "green")
    tod.begin_fill()
    for i in range(3):
        tod.forward(50)
        tod.left(360 / 3)
        tod.end_fill()

    # assign function to click on screen
    turtle.onscreenclick(lambda x,y:stop(second))

def second(x=0, y=0):
    # clear screen
    tod.reset()

    tod.color("red", "green")
    tod.begin_fill()
    for i in range(6):
        tod.forward(50)
        tod.left(360 / 6)
        tod.end_fill()

    # assign function to click on screen
    turtle.onscreenclick(lambda x,y:stop(third))

def third(x=0, y=0):
    # clear screen
    tod.reset()

    tod.color("red", "green")
    tod.begin_fill()
    for i in range(12):
        tod.forward(50)
        tod.left(360 / 12)
        tod.end_fill()

    # end program on click
    turtle.exitonclick()

# --- main ---

tod = turtle.Turtle()

first()

# you need it to - it checks if you clicked (and does othere things)
turtle.mainloop()

EDIT:我检查了源代码turtle看来你可以设置

turtle.TurtleScreen._RUNNING = True

to run turtle再次之后exitonclick()

尝试使用和不使用此代码turtle.TurtleScreen._RUNNING = True

import turtle

turtle.goto(0,50)
turtle.exitonclick()

turtle.TurtleScreen._RUNNING = True

turtle.goto(50,150)
turtle.exitonclick()

turtle.TurtleScreen._RUNNING = True

但也许对于更复杂的代码它不会工作,因为exitonclick()做其他事情 - 执行的原始函数exitonclick()

def _destroy(self):
    root = self._root
    if root is _Screen._root:
        Turtle._pen = None
        Turtle._screen = None
        _Screen._root = None
        _Screen._canvas = None
    TurtleScreen._RUNNING = False
    root.destroy()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用海龟模块 exitonclick() 的相关文章

  • 行未从树视图复制

    该行未在树视图中复制 我在按行并复制并粘贴到未粘贴的任何地方后制作了弹出复制 The code popup tk Menu tree opportunity tearoff 0 def row copy item tree opportun
  • 为什么 .setGeometry() 不改变 QWidget 实例的大小?

    我想使用 QWidget 更改 QPushButton 的大小 setGeometry https doc qt io qtforpython 5 PySide2 QtWidgets QWidget html PySide2 QtWidge
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • 创建一个类似于 Tkinter 的表

    我希望创建类似于 Tkinter 中的表格的东西 但它不一定是这样的 例如 我想创建标题 Name1 Name2 Value 并在每个标题下面有几个空白行 然后 我希望稍后用我计算的值或名称的字符串值填充这些行 因此是标签 对于 Name2
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • 获取列表中倒数第二个元素[重复]

    这个问题在这里已经有答案了 我可以通过以下方式获取列表的倒数第二个元素 gt gt gt lst a b c d e f gt gt gt print lst len lst 2 e 有没有比使用更好的方法print lst len lst
  • 如何使用Python的super()来更新父值?

    我对继承很陌生 之前所有关于继承和 Python 的 super 函数的讨论都有点超出我的理解 我当前使用以下代码来更新父对象的值 usr bin env python test py class Master object mydata
  • Python:计算数据帧列中所有行中特定字符的实例数

    我有一个包含列 toaddress ccaddress body 的数据框 df 我想迭代数据帧的索引 以获取 toaddress 和 ccaddress 字段中电子邮件地址的最小 最大和平均数量 这是通过计算这两列中每个字段中的 和 的实
  • 将 Pandas 列中的列表拆分为单独的列

    这是我在 pandas 数据框中的 特征 列 Feature Cricket 82379 Kabaddi 255 Reality 4751 Cricket 15640 Wildlife 730 LiveTV 13 Football 4129
  • 将输入发送到 python 子进程而不等待结果

    我正在尝试为一段代码编写一些基本测试 该代码通常通过 stdin 无休止地接受输入 直到给出特定的退出命令 我想检查程序是否在给出一些输入字符串时崩溃 经过一段时间来考虑处理 但似乎无法弄清楚如何发送数据而不是陷入等待我不知道的输出关心 我
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • 张量流:注册 numpy bfloat16 扩展

    正如我所见 tensorflow 中有 bfloat16 的 numpy 扩展 https github com tensorflow tensorflow blob 24ffe9f729160a095a5cab8f592392018280
  • Python组合目录中的所有csv文件并按日期时间排序

    我有 2 年的每日数据分成每月文件 我想将所有这些数据合并到一个按日期和时间排序的文件中 我正在使用的代码组合了所有文件 但不按顺序 我正在使用的代码 import pandas as pd import glob os import cs
  • 如何将列表字典写入字符串而不是 CSV 文件?

    This 堆栈溢出问题 https stackoverflow com questions 37997085 how to write a dictionary of lists to a csv file将列表字典写入 CSV 文件的答案
  • 异步和协程与任务队列

    我一直在阅读有关 python 3 中的 asyncio 模块的内容 以及更广泛地了解 python 中的协程的内容 但我不明白是什么让 asyncio 成为如此出色的工具 我的感觉是 你可以用协程做的所有事情 通过使用基于多处理模块 例如
  • 来自 django 教程 was_published_recently.admin_order_field = 'pub_date'

    From Django 教程 https www jetbrains com help pycharm 2017 1 creating and running your first django project html d28041e21
  • 使用 Python 生成类似于 Messenger 或 kik 代码的圆形二维码

    我可以使用 Python 生成圆形 QR 码 就像 Facebook Messenger 或 kik 使用的那样吗 我访问了很多网站 但找不到这种类型的二维码 默认情况下 Python 生成方形 QR 码 但在我的项目中我想要圆形 QR 码

随机推荐

  • 使用 Hibernate 通过 SSH 隧道获取数据

    最近开始学习Hibernate技术 要使用Hibernate从数据库中获取数据 问题是我只能通过 SSH 隧道连接到数据库 有没有我可以使用的属性hibernate cfg xml文件来解决这个问题 或者您可以提出另一种新手可以理解的方法
  • 如何在Python中迭代列表时从列表中删除元素? [复制]

    这个问题在这里已经有答案了 给定一个数字列表 L 1 2 3 4 5 当我迭代它时 如何从列表中删除一个元素 假设是 3 我尝试了以下代码 但没有成功 for el in L if el 3 del el 最好的做法通常是建设性地进行 建立
  • 处理超过 200 个复选框,将它们存储在状态中

    我有一个表 父元素 它获取用户并将每一行呈现为它自己的组件 表中的行包含复选框 目标是能够使用复选框并检索选中的复选框 问题是 当我将函数传递给每一行 子组件 时 触发将选中的复选框值添加到数组 由选定用户的 id 组成 中 整个组件会重新
  • 在共享库的类中调用 GSL 函数

    我正在尝试用 C 创建一个共享库来实现费米气体的工具 我正在使用 GSL 库以数值方式求解函数 并且我的代码在作为脚本运行时运行没有问题 但在尝试将其转换为共享库和类时遇到问题 我见过类似的问题 Q1 Q2 Q3 我对 C 编程相当陌生 似
  • 为什么要在CMake中的add_library/add_executable命令中添加头文件?

    我有一个项目 它使用 CMake 作为构建工具 并制作了一个简单的模板供我和我的同事使用 当我在线搜索最佳且易于使用的实践时 我遇到了创建库的不同方法 在此模板中 我在两个单独的变量中列出了头文件和源文件 并且我没有将标头传递给add li
  • R 中的限制命令?

    R 中的限制命令或函数是什么 我无法通过使用 和 函数搜索或在介绍性手册中找到它 lim 和 limit 不存在 这是在 F X 的极限 X gt Y 的意义上 我不是指任何人编写代码 我指的是任何人 我的意思是 作为安装标准包含在 R 中
  • android 标签图标不显示

    现在我正在尝试让选项卡布局正常工作 我已经完成了所有操作 就像 Android TabView 教程中一样 应用程序运行正常 但问题是我没有看到我在 ic tab artists xml 中定义的任何图标 只有文字 我想这与默认主题或样式或
  • 将 JDBC 与 SQL Server 连接

    我正在尝试将我的 JAVA 代码连接到我本地的 SQL Server 这就是我想要的 public static void main String args throws ClassNotFoundException SQLExceptio
  • 类名中的正则表达式用于识别控件

    某个程序的控件ClassnameNN被识别为AutoIt 窗口信息工具 as WindowsForms10 BUTTON app 0 24f4a7c r27 ad19在以前的版本中 在当前版本中它更改为 WindowsForms10 BUT
  • 安排每周将 Excel 文件下载到唯一的名称

    我们有一个数据库 每周一都会从客户端上传一个 Excel 文件 该文件始终具有相同的名称 因此如果我们忘记了它 就会丢失它 有没有办法制作一个脚本来重命名脚本并为其提供日期或数字 我们现在使用 FileZilla 来获取文件 文件齐拉不允许
  • 设置 pandas 数据框中时间戳数据的时区

    我有一个经常更改的 pandas 数据框 如下所示 date name time timezone 0 2016 08 01 aaa 0900 Asia Tokyo 1 2016 08 04 bbb 1200 Europe Berlin 2
  • Android 应用内结算:“RESULT_DEVELOPER_ERROR”

    我无法理解为什么我在 应用内计费 的实现中收到 RESULT DEVELOPER ERROR 我做了什么 将代码从示例应用程序复制到我的应用程序 android 清单包含 在 Android 4 0 4 和 Google Play 应用程序
  • 确定当前本地时间是否在两个时间之间(忽略日期部分)

    考虑到 Cocoa Touch 中没有 NSTime iPhone 上的 Objective C 并且以 NSString 形式给出两个时间 以 NSString 形式给出一个时区 如何计算当前 LOCAL 时间是否在这两个时间之间 请记住
  • 备份和恢复eMMC

    从 Google Coral 开发板的 SD 卡映像备份板载 eMMC 的过程是什么 同样 我们应该按照什么步骤将镜像恢复到板载的emmc驱动器上呢 从SD卡镜像备份板载eMMC Mendel OS 映像未安装在 SD 卡上 所以您的意思是
  • XAML:访问用户控件内的控件

    我有这样的用户控件
  • SimpleDateFormat 使用“S”格式显示不正确的毫秒,但使用“SSS”时则不显示

    我遇到一个问题 显示的日期的毫秒部分乘以 10 具体来说 时间52 050显示为52 50 when a S使用格式 但是52 050 when a SSS使用格式 采取以下代码示例 Some arbitrary point with 50
  • SmartGwt DateItem useTextField=true - 如何使文本输入字段不可编辑

    因为我不知道如何解决我提出的问题here我暂时在想一个临时的解决办法 我有一个smartgwtDateItem widget DateItem date new DateItem Adate date setWidth 120 date s
  • React.js 中所有者和父组件有什么区别

    React 0 13 带来基于父级的上下文而不是基于所有者的上下文 所以 我不太明白所有者组件和父组件之间的区别 示例将不胜感激 var A React createClass render return b b
  • 重新渲染 rich:dataTable 的特定行

    早上好 是否可以仅重新渲染 rich dataTable 的 1 特定行 我有一个 rich dataTable 当我执行某些操作时 我确信只有 1 行发生了更改 我只需要重新渲染这一行 而不是整个表 是否可以 如何 XHTML
  • 使用海龟模块 exitonclick()

    我的代码应该在第一部分之后关闭turtle screen 然后启动另一个屏幕并执行第二部分 但在那里它没有按预期工作 import turtle ws turtle Screen tod 1 turtle Turtle tod 1 colo