Python Turtle 中的 onkeypress() 和 Listen() 问题

2024-06-30

我的一个功能有问题。我使用 Python 3.7,当我尝试使用onkeypress()函数,什么也没有发生。我尝试检查它,但是当我按键时乌龟模块没有反应。

我尝试使用“w”键向上移动桨。但这不起作用。 以下是我的 *.py 文件:

main.py

import elements
import turtle


#Windows settings

window = turtle.Screen()
window.title("Pong game by Kosa")
window.bgcolor('black')
window.setup(width=800, height=600)
window.tracer(0)

paletka_1 = elements.Objects()
paletka_1.paddle_a()
    
window.onkeypress(paletka_1.paddle_a_up(), "w")
window.listen()
while True:
    window.update()

元素.py

import turtle

class Objects:

    def __init__(self):
        #Paddle A

        #self.paddle_b = turtle.Turtle()


        # #Paddle B

        #Ball
        self.ball = turtle.Turtle()

    def paddle_a(self):

        paddle_a_x = -350
        #paddle_a_y = 0
        self.paddle_a = turtle.Turtle()
        self.paddle_a.speed(0)
        self.paddle_a.shape("square")
        self.paddle_a.shapesize(stretch_wid=5, stretch_len=1)
        self.paddle_a.color('green')
        self.paddle_a.penup()
        self.paddle_a.goto(paddle_a_x, 0)

    def paddle_b(self):
        paddle_b_x = -350
        paddle_b_y = 0

        self.paddle_b.speed(0)
        self.paddle_b.shape("square")
        self.paddle_b.shapesize(stretch_wid=5, stretch_len=1)
        self.paddle_b.color('green')
        self.paddle_b.penup()
        self.paddle_b.goto(paddle_b_x, paddle_b_y)

    def ball(self):
        self.ball.speed(0)
        self.ball.shape("square")
        self.ball.color('white')
        self.ball.penup()
        self.ball.goto(0, 0)

    def paddle_a_up(self):
        y = self.paddle_a.ycor()
        y += 20
        self.paddle_a.sety(y)
        print(y)

    def paddle_b_up(self):
        y = self.paddle_b.ycor()
        y += 20
        self.paddle_b.sety(y)

程序启动时我得到的结果:我可以按键,但拨片没有变化。你能发现我的错误吗?我添加了print(y) in paddle_a_up()只是为了确保它有效。我得到的结果是print().

这很奇怪,因为没有错误。


这是初学者在设置事件处理程序时常见的错误:

window.onkeypress(paletka_1.paddle_a_up(), "w")

你不想call paddle_a_up, 你想要pass当事件发生时,它会调用其他一些代码:

window.onkeypress(paletka_1.paddle_a_up, "w")

尝试一下,看看它是否更适合您。就代码的其余部分而言,我有一些建议:

window.tracer(0)

Avoid tracer() and update()直到您的程序正常运行,否则只会使开发和调试过程变得复杂。仅当您需要时才将它们添加回来——如果程序运行得令您满意,则将它们排除在外。

while True:
    window.update()

这个循环实际上应该是调用mainloop()将控制权交给 tkinter 的事件处理程序:

window.mainloop()

让成员变量和实例方法同名是一个坏主意:

self.ball = turtle.Turtle()
...
def ball(self):

与 Python 的其他部分一样,其中一个会覆盖另一个,并且会发生不好的事情。我对你的代码进行了修改:

main.py

from turtle import Screen
import elements

# Windows settings

window = Screen()
window.title("Pong game by Kosa")
window.bgcolor('black')
window.setup(width=800, height=600)

paletka_1 = elements.Objects()

window.onkeypress(paletka_1.paddle_a_up, "w")

window.listen()
window.mainloop()

元素.py

from turtle import Turtle

class Objects:

    def __init__(self):
        # Paddle A
        self.paddle_a = Turtle("square")
        self.init_paddle_a()

        # Paddle B
        self.paddle_b = Turtle("square")
        self.init_paddle_b()

        # Ball
        self.ball = Turtle("square")
        self.init_ball()

    def init_paddle_a(self):

        paddle_a_x = -350

        self.paddle_a.speed('fastest')
        self.paddle_a.shapesize(stretch_wid=5, stretch_len=1)
        self.paddle_a.color('green')
        self.paddle_a.penup()
        self.paddle_a.setx(paddle_a_x)

    def init_paddle_b(self):
        paddle_b_x = 350

        self.paddle_b.speed('fastest')
        self.paddle_b.shapesize(stretch_wid=5, stretch_len=1)
        self.paddle_b.color('red')
        self.paddle_b.penup()
        self.paddle_b.setx(paddle_b_x)

    def init_ball(self):
        self.ball.speed('fastest')
        self.ball.color('white')
        self.ball.penup()
        self.ball.home()

    def paddle_a_up(self):
        y = self.paddle_a.ycor() + 20
        self.paddle_a.sety(y)

    def paddle_b_up(self):
        y = self.paddle_b.ycor() + 20
        self.paddle_b.sety(y)

现在应该会弹出一个窗口,左侧和右侧都有桨,中间有一个球。点击窗口后可以按“w”使左桨上升。现在完成程序!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Turtle 中的 onkeypress() 和 Listen() 问题 的相关文章

  • 使用正则表达式在 Pandas Series 的各个单元格内分隔逗号分隔的值

    我有一个来自数据库的 csv 文件 我已将其转换为我正在尝试清理的 Pandas DataFrame 问题之一是多个值已输入到需要拆分的单个单元格中 复杂的因素是有一些字符串注释 也带有逗号 需要保持完整 下面的示例以系列形式说明了该问题
  • 使用 scipy 在 python 中读取 MatLab 文件

    我正在使用 python 和 scipy 包来读取 MatLab 文件 然而 它需要太长时间并且崩溃 The Dataset http realitycommons media mit edu RealityMining zip大小约为50
  • 使用 pip freeze 安装 numpy

    I need to install Numpy version 1 17 1 but every time it just freezes I have now tried multiple times and I have been wa
  • 使用脚本取消设置 PDF 字体

    我正在使用 xhtml2pdf 库自动创建 PDF 几个月前我有过这个问题 https stackoverflow com questions 25203219 xhtml2pdf doesnt embed helvetica 库嵌入了我没
  • 如何在 Python 中执行等效的 Excel INDEX MATCH

    我有一个问题 关于如何执行相当于使用 Excel 中的 INDEX MATCH 函数返回值并在 Python 中应用它的操作 作为一名对大型数据集执行数据分析和操作的 Excel 用户 为了提高效率 我已转向 Python 我试图做的是根据
  • 使用多处理或线程加速单个任务

    是否可以使用多处理 线程来加速单个任务 我的直觉是答案是否定的 以下是我所说的 单一任务 的示例 for i in range max pick random choice on off both 当参数为 10000000 时 在我的系统
  • Python 内存使用情况

    因此 我有一些代码接收一组文件 将其可以缝合在一起 然后绘制它们 我发布了大部分代码 试图使其更具可读性 如果需要 可以添加更多代码 for paths dirs files in os walk start path for d in d
  • 使用 Numpy 对多维数组进行切片/索引

    我有 3 个 4x4 数组 矩阵 使用以下命令创建 arr np linspace 1 48 48 reshape 3 4 4 矩阵如下所示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2
  • TypedDict 中的 Python 任意键

    是否可以使用一组已知键创建 TypedDict 然后创建任意键的类型 例如 在 TypeScript 中 我可以这样做 interface Sample x boolean y number name string string Pytho
  • 无法从 BigQuery 中的工作表查询表

    我正在尝试在 python 中使用 BigQuery 来查询通过工作表生成的表 from google cloud import bigquery Prepare connexion and query bigquery client bi
  • scikit learn中partial_fit遇到的错误

    在 scikit learn 中使用partial fit 函数进行训练时 即使训练后的模型行为正确并给出正确的输出 我也会在程序未终止的情况下收到以下错误 这怎么可能 以及这样做的后果是什么 这是值得担心的事情吗 usr lib pyth
  • 以另一种风格制作一个带有形状和偏移参数的 numpy 数组

    我想以 3 元素实体 3d 位置 和单个元素 每个 x y z 坐标 的形式访问我的数组 经过一番研究后 我最终做了以下事情 gt gt gt import numpy as np gt gt gt arr np zeros 5 dtype
  • Python:控制超时长度

    我在脚本中运行了类似于以下的代码 try s ftplib FTP xxx xxx xxx xxx username password except print Could not contact FTP serer sys exit 如果
  • 在窗口中定位画布 - Tkinter/python

    有没有办法将画布放置在窗口中并在其周围放置一个框架 我只找到了如何在画布内放置对象 您可以创建一个框架 然后将您的小部件放入其中 f tk Frame c1 tk Canvas f c2 tk Canvas f c1 pack side l
  • DataFrame.stack() 之后的新索引级别名称

    注意这个问题 https stackoverflow com questions 26002474 pandas name of the column after a group by function 28303765 28303765看
  • 模拟 default=timezone.now 进行单元测试

    我正在尝试为执行大量日期时间操作的 django 应用程序编写单元测试 我已经安装了mock http www voidspace org uk python mock 给 django 打猴子补丁timezone now为了我的测试 虽然
  • 使用 plt 在热图上绘制梯度箭头

    我正在尝试绘制箭头以可视化热图上的梯度 这是我到目前为止的代码 import matplotlib pyplot as plt import numpy as np function to plot lambda x y x y 2 hor
  • SQLalchemy“load_only”不只加载指定的列

    我正在尝试从带有 sqlalchemy 的表中选择列的子集load only功能 不幸的是 它似乎不仅仅返回函数调用中指定的列 具体来说 它似乎还获取主键 在我的例子中 是一个 auto increment id 字段 一个简单的例子 如果
  • python中1+1可以等于3吗? [复制]

    这个问题在这里已经有答案了 在继续之前 我知道人们应该never做这个 这个问题纯粹是出于教育目的 我进行这个练习是为了更好地理解 python 的内部结构ctypes 以及它们如何工作 我知道在 python 中更改整数的值相对容易 其实
  • 为什么 a.insert(0,0) 比 a[0:0]=[0] 慢很多?

    使用列表的insert函数比使用切片分配实现相同效果要慢得多 gt python m timeit n 100000 s a a insert 0 0 100000 loops best of 5 19 2 usec per loop gt

随机推荐