<p>我觉得另一个基于OP代码的答案,在产生错误结果的同时,使问题变得更加复杂。下面是我尝试简化逻辑并生成正确的值(例如,6段HSB圆上的红色为0,黄色为1等)。我将圆旋转90度,以使数学对齐。此外,结果打印在圆的中心:</p>
<pre><code>from turtle import Turtle, Screen
from colorsys import hsv_to_rgb
import math
FONT_SIZE = 18
FONT = ('Arial', FONT_SIZE, 'normal')
RADIUS = 200
WIDTH = 100
last_result = () # Also how could I store that value to a variable?
def arch(radius, width, colorlist):
''' Creates a color wheel around position (0,0) '''
degree = 360 / len(colorlist)
inner_radius = radius - width
turtle = Turtle(visible=False)
turtle.penup()
turtle.setx(radius)
turtle.setheading(90)
for color in colorlist:
turtle.color(color)
turtle.begin_fill()
turtle.circle(radius, degree)
position = turtle.position()
heading = turtle.heading()
turtle.left(90)
turtle.forward(width)
turtle.left(90)
turtle.circle(-inner_radius, degree)
turtle.end_fill()
turtle.setposition(position)
turtle.setheading(heading)
def get_number(x, y, turtle, segments):
'''
Click somewhere on the wheel, and be told how many degrees around the
circle the color you clicked. For a six-color wheel, if you click on
red, you get 0. If you click on yellow, you get 1, etc.
'''
global last_result
if (RADIUS - WIDTH) ** 2 < x ** 2 + y ** 2 < RADIUS ** 2:
angle = math.degrees(math.atan2(y, x)) % 360
number = int(angle * segments / 360)
turtle.undo()
turtle.write('{} ({:5.1f}\u00b0)'.format(number, angle), align='center', font=FONT)
last_result = (number, angle)
def main():
screen = Screen()
segments = int(screen.numinput('Color Wheel', 'How many colors?'))
colorlist = [hsv_to_rgb(i / segments, 1.0, 1.0) for i in range(segments)]
screen.tracer(False)
arch(RADIUS, WIDTH, colorlist)
screen.tracer(True)
magic_marker = Turtle(visible=False)
magic_marker.penup()
magic_marker.sety(-FONT_SIZE/2)
magic_marker.write('', align='center', font=FONT)
screen.onscreenclick(lambda x, y, t=magic_marker, s=segments: get_number(x, y, t, s))
screen.mainloop()
if __name__ == '__main__':
main()
</code></pre>
<p>为了简化代码,我将颜色逻辑更改为0.0到1.0,并使其仅在单击色轮时才响应,而不仅仅是在窗口中的任何位置。在</p>
<p><a href="https://i.stack.imgur.com/NxvIp.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/NxvIp.png" alt="enter image description here"/></a></p>