Turtle Graphics - извлечение цвета из onscreenclick

Я использую Turtle Graphics в Python для более крупной программы. Я могу вернуть точку, на которую нажимает пользователь, используя Turtle.onscreenclick

Однако я хотел бы извлечь цвет RGB точки, на которую нажимает пользователь. Можно ли это сделать даже в черепашьей графике и как это сделать? Благодарю вас!

import turtle

# Global variables specifying the point clicked

xclick = 0
yclick = 0

# Draw a rectangle that is red

height = float(50)
length = height *(1.9)
length = round(length,2)
turtle.begin_fill()
turtle.color("red")
turtle.down()
turtle.forward(length)
turtle.right(90) 
turtle.forward(height)
turtle.right(90)
turtle.forward(length)
turtle.right(90)
turtle.forward(height)
turtle.right(90)
turtle.end_fill()

# Gets the click 

def getcoordinates():
    turtle.onscreenclick(turtle.goto)
    turtle.onscreenclick(modifyglobalvariables) 

# Modifies the global variables    

def modifyglobalvariables(rawx,rawy):
    global xclick
    global yclick
    xclick = int(rawx//1)
    yclick = int(rawy//1)
    print(xclick)
    print(yclick)

getcoordinates()
turtle.done()

person robert    schedule 19.11.2017    source источник


Ответы (1)


turtle не имеет функции для получения цвета пикселя. Он использует tkinter (и виджет tkinter.Canvas - turtle.getcanvas()) для отображения всего, но у него нет функции для получения цвета пикселя.

Canvas сохраняет все как объекты и второй ответ для "Получить цвета пикселей холста tkinter" показывает, как получить цвет объекта в позиции (x,y). Может быть, это сработает для вас.


EDIT: я сделал рабочий пример

canvas использует другие координаты - нужно было изменить y = -y

import turtle

# --- functions --- (lower_case_names)

def get_pixel_color(x, y):

    # canvas use different coordinates
    y = -y

    canvas = turtle.getcanvas()
    ids = canvas.find_overlapping(x, y, x, y)

    if ids: # if list is not empty
        index = ids[-1]
        color = canvas.itemcget(index, "fill")
        if color != '':
            return color.lower()

    return "white" # default color 

def modify_global_variables(rawx,rawy):
    global xclick
    global yclick

    xclick = int(rawx)
    yclick = int(rawy)

    print(get_pixel_color(xclick, yclick))


def draw_rect(x1, y1, width, height, color):
    y1 = -y1
    canvas = turtle.getcanvas()
    canvas.create_rectangle((x1, y1, x1+width, y1+height), fill=color, width=0)

# --- main ---

# Global variables specifying the point clicked

xclick = 0
yclick = 0

# Draw a rectangle that is red

height = 50.0 # now it is float
length = height * 1.9
length = round(length, 2)

turtle.down()
turtle.color("RED")

turtle.begin_fill()

for _ in range(2):
    turtle.forward(length)
    turtle.right(90) 
    turtle.forward(height)
    turtle.right(90)

turtle.end_fill()

# Use tkinter.Canvas to draw rectangle

draw_rect(100, 100, length, height, 'green')

# Gets the click & Modifies the global variables    

turtle.onscreenclick(modify_global_variables) 

turtle.done()
person furas    schedule 20.11.2017
comment
Спасибо за пример. Я принял ответ. - person robert; 09.08.2019