Python turtle能否取样背景颜色?

4
我希望能够利用Python的海龟绘图库有效地模拟乐高机器人。乐高机器人可以采样机器人所处位置的颜色。基于此,我想创建一个背景迷宫,并让机器人在其中寻找出路。我希望将其应用于10年级编程学生。
目前为止,我可以使用tkinter创建一个简单的画布,并在其中放置一个有颜色的矩形。我可以将海龟放置在画布上并共存。海龟可以放置在有颜色的矩形上。
现在我只需要以某种方式对颜色进行采样。这可能通过获取海龟的位置,然后对该坐标进行采样来完成。但是我卡在了这一点上。
以下是我的代码:
from tkinter import Tk, Canvas, Frame, BOTH
import turtle

top = Tk()
C = Canvas(top, height=500, width=600)

Doug = turtle.RawTurtle(C)

rectangle = C.create_rectangle(30, 10, 120, 80, outline="#fb0", fill="#fb0")

Doug.fd(50)
Doug.rt(90)
Doug.fd(50)

C.pack(fill=BOTH, expand=1)
top.mainloop()

我注意到当我运行代码时,海龟的“路径”在矩形后面,这表明存在图层问题。

你可以使用http://lab.open-roberta.org来完成这个任务。学生可以使用编程块编写程序,然后你可以在模拟器或真实的EV3上运行代码。 - ensonic
2个回答

0
你可以询问画布下方有哪些物品,并报告你感兴趣的任何填充颜色。例如,你可以将迷宫中要绘制的所有矩形添加到一个矩形列表中,并使用该列表确定乌龟是否在矩形中。然后报告颜色。
from tkinter import Tk, Canvas, Frame, BOTH
import turtle

top = Tk()
C = Canvas(top, height=500, width=600)

Doug = turtle.RawTurtle(C)

rectangles = []
rectangles.append(C.create_rectangle(30, 10, 120, 80, outline="#fb0", fill="#fb0"))

Doug.fd(50)
Doug.rt(90)
Doug.fd(50)

# For some reason Doug's y-coord is opposite what Canvas uses, so * -1 to fix it... 
overlapping = C.find_overlapping(Doug.xcor(), Doug.ycor() * -1, Doug.xcor(), Doug.ycor() * -1)
for item_id in overlapping:
   if item_id in rectangles:
        print(C.itemcget(item_id, "fill"))

C.pack(fill=BOTH, expand=1)
top.mainloop()

作为最后的思考,与问题无关。我强烈建议您在实例化对象时使用小写名称(将“C”更改为“canvas”,将“Doug”更改为“doug”)。在Python和许多其他语言中,大写表示类本身,而不是它的实例。我在上面的代码中保持不变,这样您就可以尝试修复代码而对您的代码进行最少的更改。

0
根据文档所述,海龟并没有获取当前位置颜色的任何功能。我的方法是使用二进制地图作为行走指示器,但这可能过于静态,无法模拟乐高机器人环境。
如果您使用的是Windows系统,则可以利用win32gui库从屏幕上的像素获取像素颜色(是否可以通过X和Y坐标获取屏幕上特定像素的颜色?)。将其与turtle.hideturtle()turtle.pos()结合起来,并为父窗口添加一些偏移量,您可能会得到所需的功能。 如果这对您有用,我建议您创建自己的模块提供此功能,以便学生可以专注于解决迷宫问题,而不是Windows API。

谢谢Philip!我会调查win32gui库。我想让它跨平台兼容。也许我可以找到Macintosh和Linux的等效库。 - dougc905

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接