每当我try 运行我的程序时,它都会画出两只乌龟,然后窗口停止响应.

我所期待的是,直到其中一块接触到另一块基于我拖动它靠近另一块的基础上,我将能够自己拖动它们两个.然而,每当我运行程序时,在绘制了两只乌龟之后,窗口停止响应.我没有收到任何错误,它只是在冻结后关闭,直到我单击关闭按钮.我看过其他人的帖子,他们有这个问题,但他们最后没有creen.mainloop(),而我有.

import turtle

captured_pieces = []

blue = turtle.Turtle()
black = turtle.Turtle()
screen = turtle.Screen()

blue.penup()
black.penup()

blue.shape('square')
black.shape('triangle')

blue.setpos(100,100)
black.setpos(-100,-100)

blue.color('blue')
black.color('black')

def bmove():
    black.ondrag(black.goto)
    if black.distance(blue) < 30:
            captured_pieces.append("BlC")
            print(captured_pieces)
            check()

def blmove():
    blue.ondrag(blue.goto)
    if blue.distance(black) < 30:
            captured_pieces.append("BC")
            print(captured_pieces)
            check()

def check():
      if "BlC" in captured_pieces:
            print("blue captured")

def check():
      if "BC" in captured_pieces:
            print("black captured")

while "BlC" not in captured_pieces and "BC" not in captured_pieces:
      bmove()
      blmove()

screen.mainloop()

推荐答案

while循环一遍又一遍地做两件事:添加拖动操纵柄和判断距离.循环不会调用导致Turtle的呈现/事件循环运行的任何Turtle方法(例如,.forward().goto()),因此距离判断不可能为真来中断循环.我们希望使用mainloop()来支持用户交互,但除非允许用户交互,否则我们无法实现--我们被困住了.

避免循环(通常不希望在实时 turtle 程序中使用while),判断拖动处理程序内部而不是循环中的冲突,然后让mainloop()运行 turtle 渲染循环.

这揭示了一个新的问题:内部循环的"滑动"速度导致拖拽非常不顺畅.您可以使用tracer(0)禁用内部循环,使用turtle.update()在需要时手动触发重绘,从而消除任何滑动行为,并使您可以完全控制重现器.

下面是一个简单的例子:

import turtle


turtle.tracer(0)
blue = turtle.Turtle()
black = turtle.Turtle()
screen = turtle.Screen()
blue.penup()
black.penup()
blue.shape("square")
black.shape("triangle")
blue.setpos(100, 100)
black.setpos(-100, -100)
blue.color("blue")
black.color("black")


def handle_drag(piece, other, x, y):
    piece.goto(x, y)
    turtle.update()

    if piece.distance(other) < 30:
        print("capture:", piece.color()[0], other.color()[0])


black.ondrag(lambda x, y: handle_drag(black, blue, x, y))
blue.ondrag(lambda x, y: handle_drag(blue, black, x, y))
turtle.update()
screen.mainloop()

不久之后,您可能需要定制类(比如Piece个类,它可能由具有不同特征的各种类型的块划分为子类)和数据 struct .上面使用独立变量的方法是不可伸缩的.但为了使其适用于您当前的问题,我暂时将其保留不变.

Python相关问答推荐

覆盖Django rest响应,仅返回PK

如何使用没有Selenium的Python在百思买着陆页面上处理国家/地区 Select ?

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

Python中的嵌套Ruby哈希

按顺序合并2个词典列表

如何在虚拟Python环境中运行Python程序?

在np数组上实现无重叠的二维滑动窗口

在vscode上使用Python虚拟环境时((env))

使用groupby方法移除公共子字符串

实现神经网络代码时的TypeError

如何指定列数据类型

Python中的变量每次增加超过1

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

Django admin Csrf令牌未设置

dask无groupby(ddf. agg([min,max])?''''

幂集,其中每个元素可以是正或负""""

python中csv. Dictreader. fieldname的类型是什么?'

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

删除Dataframe中的第一个空白行并重新索引列