私は位置(0,0)の周りにカラーホイールを作成する、亀のプログラムをPythonで作成しました。ここにペーストビン:http://pastebin.com/xDyddfwaです。私ができることを望んでいるのは、ホイールのどこかをクリックすることができ、クリックした色が円の周りの何度にあるかを伝えることができます。だから、基本的に、デカルト座標の代わりに、私は円形グラフの座標が好きです。カラーホイールプログラムを実行した場合は、番号を入力するよう求められます。 6を入力すると、6色のホイールが描画されます。赤い部分が右下に表示されます。私はそれをクリックして0を取得したいと思います。次に、黄色をクリックすると、1などが得られます。また、どのように変数にその値を格納できますか? (私はonclick()を使って問題を抱えてきました)助けてください。クリックした位置の円グラフ座標を取得する方法
答えて
onclick()
は、タートルをクリックした場合にのみ機能します。すべてのクリックで機能を実行するには、onscreenclick(callback)
を使用してください。それはあなたに(x,y)
を与えるので、度でangle
を計算してから、角度を正しい数値に変換する必要があります。それは色だけでなく、画面上のクリックごとに数値を計算するので理想的ではありません。
import turtle
from turtle import *
import colorsys
import math
def arch(radius, degree, width, colour):
color(colour)
pd()
begin_fill()
circle(radius, degree)
lt(90)
fd(width)
lt(90)
circle(-radius+width, degree)
lt(90)
fd(width)
lt(90)
end_fill()
pu()
circle(radius, degree)
pd()
def start():
pu()
rt(90)
fd(200)
lt(90)
def startover():
reset()
main()
def get_number(x, y):
# inform function to use global variable
#global k
angle = 180 - math.degrees(math.atan2(x,y))
angle %= 360
number = int(angle*k/360)
print('Pos:', x, y, 'Angle:', angle, 'Number:', number)
def main():
# Inform function to use global variable when you use `=`
# You will need this value in `get_number
global k
s = turtle.Screen()
#t = turtle.Turtle()
s.colormode(255)
tracer(False)
reset()
start()
k = int(numinput(""," How many colors?"))
colorlist = []
for i in range(k):
colorlist.append(list(colorsys.hsv_to_rgb(i/k,1,255)))
print(colorlist)
for i in range(len(colorlist)):
for j in range(len(colorlist[i])):
colorlist[i][j] = int(colorlist[i][j])
arch(200, 360/k, 100, (colorlist[i]))
onkey(startover, "a")
onscreenclick(get_number)
#listen()
done()
if __name__ == "__main__":
main()
EDIT:turtle
はバックグラウンドでtkinter
を使用し、tkinter
がより強力である - すなわち。 arc
、pieslice
などを描画する機能があり、キャンバス上のすべてのオブジェクトにマウスのクリックを割り当てることができます。
import turtle
from turtle import *
import colorsys
def get_number(event, number):
#print('widget:', event.widget)
print('number:', number)
def main():
s = turtle.Screen()
s.colormode(255)
k = int(numinput("","How many colors?"))
colorlist = []
for i in range(k):
color = colorsys.hsv_to_rgb(i/k,1,255)
color = (int(color[0]), int(color[1]), int(color[2]))
colorlist.append(color)
canvas = s.getcanvas()
for i in range(len(colorlist)):
# convert (255, 255, 255) into '#ffffff'
color = s._colorstr(colorlist[i])
# create `arc`
part_id = canvas.create_arc(-200, -200, 200, 200, outline=color, start=(i*360/k)-90, extent=360/k, width=100, style='arc')
# assign button click to this part with `number`
canvas.tag_bind(part_id, '<Button>', lambda event, number=i:get_number(event, number))
done()
if __name__ == "__main__":
main()
effbot.org:
The Tkinter Canvas Widgetは私が間違った結果を生成しながらOPのコードに基づいて、他の答えは、必要以上に複雑な問題になる感じ。以下は、ロジックを単純化し、正しい値を生成しようとした私の試みです(例えば、赤は0、黄色は1などです)。サークルを90度回転させて、数学のアライメントを良くしました。また、結果は、円の中心に印刷されています
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()
私は、コードを簡素化するために0.0〜1.0にカラーロジックを変更し、それだけであなたがカラーホイール自体をクリックしたときに応答行った、ではありません窓のどこにでもあります。
ありがとう、私の質問に答えてくれてありがとう!私はそのようにプログラムすることができれば幸いです。そんなに助けて! –
私は別の質問があります。 onscreenclick()はどのようにしてリスニングを止めることができますか?私は2回クリックして2つの数字を取得してから、他の機能に移動することができます。FTR:私は自分自身でそれを理解しようとしましたが、調査しましたが、いつものように、何も見つかりませんでした。それ以上の助けをいただければ幸いです。 –
@JoshHendersonは、大部分のカメのイベントハンドラーと同様に、イベントハンドラーとして 'None'を指定すると、それをオフにします:' screen.onscreenclick(None) 'これは単純なウェブ検索で簡単に見つかるPythonのカメの文書に記述されています。 – cdlane
- 1. アンドロイドのキャンバスに円drwanの位置(x座標とy座標)を取得する方法は?
- 2. Googleマップから位置の座標を取得する方法
- 3. OpenGL - マウスの位置座標を取得
- 4. 円グラフの端に沿ってスライス座標を取得する方法は?
- 5. UIButtonから位置座標を取得
- 6. クリックしたポイントの座標を取得する方法は?
- 7. JavaScriptのx座標とy座標のキャレット位置を取得する
- 8. Googleマップをクリックして座標を取得する方法
- 9. クリックした要素の位置を取得する方法
- 10. MATLABマウスのクリック座標を取得する方法
- 11. 座標対位置
- 12. mouseClickのx座標とy座標を取得する方法
- 13. 他のオブジェクトの座標系でオブジェクトの位置を取得
- 14. ボタンに現在の位置座標を取得するためのアンドロイドコード
- 15. Indesign.Linkの位置(XとY座標)を取得
- 16. Android - GPSの座標と位置を取得
- 17. SceneKit - 画面座標の位置を取得
- 18. 楕円の中のピクセルの座標を取得する方法は? (スクリーンショット)
- 19. 位置座標から経度を取得
- 20. JSONデータセットから位置座標を取得できません
- 21. ピンを落とす方法とオフラインマップタイルから現在の位置と座標を取得する方法は?
- 22. 方法(左上)の位置座標を取得するときにオフセット避けるために、内側のdiv
- 23. ggplot2円グラフ悪い位置
- 24. Highcharts:円グラフは、位置
- 25. a-frameシーンのマウスクリックの3D座標位置を知る方法
- 26. シンプルな座標位置
- 27. 与えられたX座標とY座標を円の中間点として円を描く方法は?
- 28. APPIUM、スワイプのx座標とy座標の取得方法
- 29. クリックするとイメージのX座標とY座標を取得する方法(スウィフト)
- 30. 現在の位置座標をデータベースに保存された座標と照合する方法
常にコードと完全なエラーメッセージが表示されます。 – furas
これを 'IDLE'の外側で実行するには' done() 'または' mainloop() 'が必要です。 'turtle'と' IDLE'は 'mainloop()'が必要な 'tkinter'を使います。 'IDLE'を実行すると' mainloop() 'が実行され、このコードは動作しますが、IDLEの外側では円を描きません。 – furas
コードを読みやすくする: 'def'の前に空行を入れ、' if __name__'を空白にして、コンマの後にスペースを入れます。詳細:[PEP 8スタイルガイド(Pythonコード)]( – furas