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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

666閲覧

tkinter canvas上にあるオブジェクトの回転角度を取得したい。

ppap

総合スコア68

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/08/17 06:54

編集2022/08/17 06:56

前提

Pythonでpillowとtkinterを用い、画面クリックで画像が回転するコードを作成しています。
ランダムな角度で回転を止めた際、「画面が何度傾いたか」という情報を抽出したいと模索しています。

過去の質問 (https://teratail.com/questions/162074) を参考にしましたが、解決に至りませんでした。

実現したいこと

張り付けたpngファイルの座標を取得することで、回転角度を算出できるようにしたいと考えています。

座標の取得にこだわっているわけではなく、
「正確に何度傾いているか」を求めることが重要なので、
別のアイデアがありましたら、参考にさせてください。

発生している問題・エラーメッセージ

・'Canvas' object has no attribute 'key_bind'
・'Canvas' object has no attribute 'cords'

Python

1 2#---SVV測定に使用する画像の作成--- 3 4from PIL import Image, ImageDraw 5 6#背景色が黒色のキャンパスを作成。 7im = Image.new('RGB', (500, 500), (0, 0, 0)) 8draw = ImageDraw.Draw(im) 9 10#中央に線を描画 11draw.line((50, 250, 450, 250), fill=(255, 255, 255), width=10) 12 13#同じサイズの画像を作成 14im_clear = Image.new("RGBA", im.size, (0, 0, 0, 0)) 15width = im.size[0] 16height = im.size[1] 17 18for x in range(width): 19 for y in range(height): 20 pixel = im.getpixel( (x, y) ) 21 22 # 黒なら処理しない 23 if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0: 24 continue 25 26 # 黒以外なら、用意した画像にピクセルを書き込み 27 im_clear.putpixel( (x, y), pixel ) 28 29#SVVで表示させるバーをpng形式で保存 30im_clear.save("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png", quality=100) 31 32#---測定コード--- 33 34import tkinter as tk 35from PIL import Image, ImageTk 36 37 38#画面サイズの指定 39WIDTH = 1300 40HEIGHT = 800 41 42#新規ウィンドウを作成 43root = tk.Tk() 44canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="black") 45canvas.pack() 46 47#ウィンドウにSVV画像を貼り付け 48img = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png") 49img = img.rotate(0) 50tkimg = ImageTk.PhotoImage(img, width=WIDTH, height=HEIGHT) 51canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 52 53#回転角度を取得するためのリストを作成 54List = [] 55 56 57#イベントが発生したときの処理 58def press_L(event): 59 #左クリックで、画像を左回転させる 60 global img 61 global tkimg 62 img = img.rotate(10) 63 tkimg = ImageTk.PhotoImage(img) 64 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 65 66def press_R(event): 67 #右クリックで、画像を右回転させる 68 global img 69 global tkimg 70 img = img.rotate(-10) 71 tkimg = ImageTk.PhotoImage(img) 72 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 73 74def coordinate(event): 75 #Enterキーを押した時点の、回転角度を取得したい 76 for id in canvas.find_all(): 77 tag = canvas.itemcget(id, "tags") 78 if tag.startswith("img"): 79 List.append({tag:canvas.cords(id)}) 80 print(List) 81 82 83#左クリックで呼び出すイベント 84canvas.tag_bind("img", "<ButtonPress-1>", press_L) 85 86#右クリックで呼び出すイベント 87canvas.tag_bind("img", "<ButtonPress-3>", press_R) 88 89#Enterキーで呼び出すイベント 90canvas.key_bind("img", "<Return>", coordinate) 91 92 93#メインループ 94root.mainloop()

試したこと

上記のコードを実行したところ「'Canvas' object has no attribute 'key_bind'」のエラーメッセージが返ってきました。
key_bindに対応していないとのことなので、
ひとまず右クリックでcoordinateイベントを呼びだすコードを試したところ、
「'Canvas' object has no attribute 'cords'」というエラーメッセージが返ってきました。

補足情報(FW/ツールのバージョンなど)

AnacondaからPythonを使用しています。

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

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

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

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

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

meg_

2022/08/17 07:03

> 画面クリックで画像が回転するコードを作成しています。 「画面クリック」以外でも回転するのですか? しないのであればクリック回数を覚えておくとか現在の角度を都度記憶しておけば良いのではないでしょうか?
ppap

2022/08/17 07:13 編集

昨日に引き続き、本当にありがとうございます。 画面クリック以外では回転しません。 しかしながら、現在のコードではクリックごとに10degずつ画像を回転させているのに対し、最終的には0.0001deg刻みでの回転を行おうと計画しています。 小数点以下での実行を行うことで命令と実行の誤差が生じる可能性が高いと考えらえれるので、「実際に今何deg傾いているか」をアナログな方法ではなく、コードによって算出したいと考えています。
guest

回答1

0

ベストアンサー

画像の回転は、tkinterでなく、PILLOWで行なっていますよね。なので、tkinterのオブジェクトから回転角度は 取れません。
また、回転後の画像は、元の画像からの回転角度の情報は持っていません。
なので、基本的に回転済みの画像から何度傾けたか(=どれくらい回転操作をしたか)を取得することはできないと思います。

「小数点以下での実行を行うことで命令と実行の誤差が生じる」とありますが、回転角度そのものを変数として持つのではなく、「回転パラメータ1あたり、0.00001度」のような対応を付けることで、保持しているパラメータを正確に扱うことができます。

投稿2022/08/17 07:26

TakaiY

総合スコア12819

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

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

ppap

2022/08/17 07:58

可能な処理と不可能な処理を明確に教えていただき、ありがとうございます。 >「回転パラメータ1あたり、0.00001度」のような対応を付けることで、保持しているパラメータを正確に扱うことができます。 に関してですが、パラメータごとに画像を回転させるのは、どのような関数を用いることで可能になるのでしょうか? pillow以外の方法で細かい角度設定に対応させられる方法が分からないので、教えていただけると幸いです。 素人質問で大変恐縮ですが、どうぞよろしくお願いいたします。
TakaiY

2022/08/17 08:04

たとえば、「クリック回数」をc という変数に入れるとして、「1クリックあたり0.0003度傾ける」とすれば、傾ける角度は、 「c × 0.0003」度ということになりますよね。 クリックされる度に cを更新すればいいのではないかと。 また、このような変数を持つことで、別質問にあった「元の画像からの回転角度」を保持するようにできるので一石二鳥かと。
TakaiY

2022/08/17 08:06

自分であれば、 「クリック回数」という変数名ではなく、「回転角度」という変数名にしますね。 で、その変数1当たりの回転角度を別途定義しておく感じですかね。
ppap

2022/08/17 08:44

ありがとうございます。。! とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問