【问题标题】:can a python turtle sample background colour?python turtle 可以采样背景颜色吗?
【发布时间】:2016-03-25 08:44:00
【问题描述】:

我想使用 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()

我确实注意到,当我运行代码时,海龟的“轨迹”位于矩形后面,这表明存在分层问题。

【问题讨论】:

  • 仅供参考:您可以使用lab.open-roberta.org 来执行此操作。学生可以使用积木编写程序,您可以在模拟器中运行代码或使用真正的ev3。

标签: python tkinter turtle-graphics lego


【解决方案1】:

从文档中关于 turtle 的内容来看,它没有任何函数来获取当前位置的颜色。我的方法是使用二进制地图作为步行指示器,但这可能太静态而无法模拟乐高机器人环境。

如果您使用的是 Windows,则可以使用 win32gui 库,它会为您提供屏幕上像素的像素颜色 (Is it possible to get the color of a particular pixel on the screen with it's X and Y coordinates?)。将其与turtle.hideturtle()turtle.pos() 结合使用,并为父窗口添加一些偏移量,您可能会获得所需的功能。 如果这对您有用,我建议您创建自己的模块来提供此功能,以便学生可以专注于解决迷宫问题而不是 windows api。

【讨论】:

  • 谢谢菲利普!我将研究 win32gui 库。我想让它跨平台兼容。也许我也可以找到 Macintosh 和 Linux 的等价物。
【解决方案2】:

您可以向 Canvas 询问 Turtle 下方有哪些项目,并报告您感兴趣的任何项目的填充颜色。例如,您可以将要为迷宫绘制的所有矩形添加到矩形列表中,然后使用该列表来确定海龟是否在矩形中。然后报告颜色。

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 和许多其他语言中,大写表示类本身,而不是它的实例)。我在上面的代码中将其单独保留,因此您可以通过对代码的最小更改来尝试修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2013-01-15
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多