質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1212閲覧

python Turtleモジュール canvas上でのマウス操作について

Platycerium

総合スコア34

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/11/25 03:13

pythonでTurtlesモジュールを用いて、tkinterのcanvas上で操作をしたいです。
クリックしたマウス位置にポインタの移動をしたいのですが方法がわからなくて困っています。
自作したコードではウインドウが2つ出てしまい、pythonTurtlesGraphicsでのマウスクリック位置が
サンプル(canvas)に反映します。canvasウインドウのみ立ち上がり、canvasウインドウ上でマウス位置
を取得したいのですが、どのように訂正をしたら良いのでしょうか?

#!/usr/bin/env python3 # coding: utf-8 import tkinter as tk from tkinter import * import turtle from turtle import * window = Tk() window.title("サンプル") window.geometry('430x307') canvas = tk.Canvas(master = window, width = 420, height = 297,bd=1,relief="ridge") canvas.grid(row=0, column=0) t = turtle.RawTurtle(canvas) def click(x,y): t.setpos(x,y) onscreenclick(click) window.mainloop()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

tkinterCanvasではなくturtleScreenでですが
以下にて目的の動作はできますがいかがでしょうか?

Python

1import turtle 2 3scr = turtle.Screen() 4t = turtle.Turtle() 5scr.title("サンプル") 6scr.setup(640,480,200,100) 7t.speed(10) # 速く 8 9def click(x,y): 10 t.setpos(x,y) 11 12scr.onclick(click)

また、tkinterCanvasを利用するコードも示します。
.getscreen()で得たスクリーンにマウスイベントをバインド(.onclick)しています。
参考:
Integrate turtle module with tkinter canvas [closed]
turtle.getscreen()

Python

1import turtle 2import tkinter as tk 3 4def click(x,y): 5 t.setpos(x,y) 6 7window = tk.Tk() 8window.title('サンプル') 9#window.geometry('430x400') 10canvas = tk.Canvas(master = window, width = 420, height = 297) 11canvas.pack() 12 13# ついでにボタンを配置 14tk.Button(master = window, text = "Fwd", command = lambda:t.forward(10)).pack(side = tk.LEFT) 15tk.Button(master = window, text = "Back", command = lambda:t.back(10)).pack(side = tk.LEFT) 16tk.Button(master = window, text = "Left", command = lambda:t.left(30)).pack(side = tk.LEFT) 17tk.Button(master = window, text = "Right", command = lambda:t.right(30)).pack(side = tk.LEFT) 18 19# マウスイベントをバインド 20t = turtle.RawTurtle(canvas) 21scr = t.getscreen() 22scr.onclick(click) 23 24window.mainloop()

投稿2018/11/25 06:14

編集2018/11/25 06:51
can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Platycerium

2018/11/25 08:08

思っていた通りのことができ、ありがとうございました。 大変恐縮なのですが、追加で1点質問があります。 シフトキーを押している間だけ カーソルの現在位置に応じて45度間隔で角度を固定することは可能でしょうか?
can110

2018/11/25 08:24

ちょっとググってみましたが、Shiftキー状態を判定する簡単な方法はなさそうですねぇ
Platycerium

2018/11/25 08:36

def kakudo_kotei(): t.left(30) scr.onkeypress(kakudo_kotei,"Shift_L") scr.listen() 上記のコードの追加でシフトを押した時に関数は動くのですが、 カーソルの現在位置に応じて45度間隔で角度を固定するコードがわからず苦戦しています。 押し続けている状態でなくても一度押した後に角度が動的に固定されるのであれば問題はないのですが、 角度を45度間隔で固定する方法はお分かりになりますでしょうか?
can110

2018/11/25 08:43

できそうですが、すぐには思いつかないです。 少なくとも現在(前回)位置を記憶しておく必要はあります。 とりあえずは たとえば今(0,0)に居たとき、(100,150)をクリックされたら亀はどこに行くべきでしょう… という問題を手で解けないとダメですね。
Platycerium

2018/11/25 08:50

ご回答ありがとうございました。 もう少し調べながら勉強してみます。 この度は色々とありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問