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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

1回答

1696閲覧

tkinter:図形をマウスで動かしたい

erisawa

総合スコア12

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2020/08/31 06:27

実現したいこと
カメラから取り込んだ映像を常に表示させながら、映像上に赤い円を表示してマウスで円を自由に動かしたい。実行するとカメラから取り込んだ映像+赤い円は表示されるが、円をマウスで動かすことができない。
tkinter初心者です。ご回答よろしくお願い致します。

import tkinter as tk import cv2 from PIL import Image,ImageTk import numpy as np import tkinter.filedialog as fl import tkinter.messagebox as mb import matplotlib.pyplot as plt import tkinter.ttk as ttk root=tk.Tk() root.title("RGB Recorder") root.geometry("800x600") root.resizable(width=False, height=False) canvas=tk.Canvas(root, width=640, height=480, bg="white") canvas.pack() c = cv2.VideoCapture(0) w, h= c.get(cv2.CAP_PROP_FRAME_WIDTH), c.get(cv2.CAP_PROP_FRAME_HEIGHT)#プロパティの取得 #ここにイベントが発生した時の処理# pressed_x = pressed_y = 0 item_id=-1 def pressed(event): global pressed_x,pressed_y,item_id item_id=canvas.find_closet(event.x, event.y) tag=canvas.gettags(item_id[0])[0] item=canvas.type(tag) pressed_x=event.x pressed_y=event.y def dragged(event): global pressed_x,pressed_y,item_id item_id=canvas.find_closet(event.x, event.y) tag=canvas.gettags(item_id[0])[0] item=canvas.type(tag) delta_x = event.x - pressed_x delta_y = event.y - pressed_y if item == "rectangle": x0, y0, x1, y1 = canvas.coords(item_id) canvas.coords(item_id, x0+delta_x, y0+delta_y, x1+delta_x, y1+delta_y) else: x, y = canvas.coords(item_id) canvas.coords(item_id, x+delta_x, y+delta_y) pressed_x = event.x pressed_y = event.y def idou(event): global enn enn.delete(0,tk.END) enn=canvas.create_oval(10,10,300,300,outline="red",width=5) def update():#update global img, enn global c ret, frame =c.read() #TkInterで表示できる形式に変換する img=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))) canvas.create_image(w/2,h/2,image=img,tags="img") enn=canvas.create_oval(10,10,300,300,outline="red",width=5,tags="rect") root.after(1,update) #本関数を再帰的に呼び出す #Cameraの設定などは省略してます update() #クリックされたとき canvas.tag_bind("rect","<ButtonPress-1>",pressed) canvas.tag_bind("img","<ButtonPress-1>",pressed) #ドラッグされたとき canvas.tag_bind("rect","<B1-Motion>",dragged) canvas.tag_bind("img","<B1-Motion>",dragged) root.mainloop()

エラーコード

item_id=canvas.find_closet(event.x, event.y) AttributeError: 'Canvas' object has no attribute 'find_closet'

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

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

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

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

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

guest

回答1

0

カメラ環境は再現できないので、適当に画像取り込んで試しています。

まずエラーコードそのままですが、Canvasにはfind_closet関数という物はありません。
find_closest関数の間違いだと思います。

そしてdragged関数でitem == "rectangle"の判定をしていますが、
Canvas.typeで"rectangle"を返すのはcreate_rectangle関数で作った矩形ですが、
ソース内では宣言されていません。
代わりにcreate_ovalで作成された"oval"を返す円がこれで判定されていないためエラーになります。

現状この二点を修正すれば元の円が残ったりと怪しい部分は多いですが、
円のドラッグはできるようになります。

とりあえず一旦ここから引き続きご自分で作成を継続してみてください。

python

1def pressed(event): 2 global pressed_x,pressed_y,item_id 3 item_id=canvas.find_closest(event.x, event.y) 4 tag=canvas.gettags(item_id[0])[0] 5 item=canvas.type(tag) 6 pressed_x=event.x 7 pressed_y=event.y 8 9def dragged(event): 10 global pressed_x,pressed_y,item_id 11 item_id=canvas.find_closest(event.x, event.y) 12 tag=canvas.gettags(item_id[0])[0] 13 item=canvas.type(tag) 14 delta_x = event.x - pressed_x 15 delta_y = event.y - pressed_y 16 if item == "oval": 17 x0, y0, x1, y1 = canvas.coords(item_id) 18 canvas.coords(item_id, x0+delta_x, y0+delta_y, x1+delta_x, y1+delta_y) 19 else: 20 x, y = canvas.coords(item_id) 21 canvas.coords(item_id, x+delta_x, y+delta_y) 22 pressed_x = event.x 23 pressed_y = event.y

投稿2020/08/31 07:42

yureighost

総合スコア2183

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

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

erisawa

2020/08/31 23:34

回答頂いたコードに修正しましたが、エラーはでなくなりましたが、相変わらず円を動かすことが出来ません。
yureighost

2020/09/01 08:06

こちらでは円を動かせますのでそれだけだと対応のしようがないです。 円の縁部分をクリックしないとドラッグできないような操作感でしたが、 何度やってもだめでしょうか。
erisawa

2020/09/03 07:37

何度もやりましたが駄目でした。やはり動画と図形移動を同じキャンバス上では不可能なのですかね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問