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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

1343閲覧

tkinter テキストと図形をグループ化したい

piyokomaru

総合スコア3

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2022/08/05 01:59

前提

文字が書かれた図形をドラッグできる機能を作成しています。

実現したいこと

マウスで文字と図形をグループ化して、一緒にドラッグできるようにしたい

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

マウスでドラッグしようとすると、文字だけ、図形だけ別々に移動してしまいます。
初心者なので、テキストと図形をグループ化して処理を行う方法がわかりません。
お優しい方ご教授いただけますと幸いです。

該当のソースコード

import sys
import tkinter as tk1

'''図形のクリックイベント'''
def zukei_click(event):
global figure
global before_x, before_y
x = event.x
y = event.y
figure = c0.find_closest(x, y)
before_x = x
before_y = y

def zukei_drag(event):
global before_x, before_y
x = event.x
y = event.y
c0.move(figure,x - before_x, y - before_y)
before_x = x
before_y = y

def main():
global c0
global oval_id
global text_id
app = tk1.Tk()
app.title(u"Software Title")
c0 = tk1.Canvas(app, width = 500, height = 300,bg="white")
oval_id = c0.create_oval(10, 10, 140, 100, tags = 'o')
c0.itemconfigure(oval_id, fill = 'lightblue', outline = 'blue')
oval_pos = c0.coords(oval_id)
text_id = c0.create_text(10, 10, text='こんにちは')
text_size = c0.bbox(text_id)
oc_x = oval_pos[2] / 2
oc_y = oval_pos[3] / 2
tc_x = text_size[2] / 2
tc_y = text_size[3] / 2
c0.move(text_id, oc_x - ( oval_pos[0]/2 ), oc_y - tc_y)
c0.tag_bind(oval_id, "<ButtonPress-1>", zukei_click)
c0.tag_bind(oval_id, "<Button1-Motion>", zukei_drag)
c0.tag_bind(text_id, "<ButtonPress-1>", zukei_click)
c0.tag_bind(text_id, "<Button1-Motion>", zukei_drag)
c0.pack()
app.mainloop()

if name == "main":
main()

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

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

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

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

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

guest

回答1

0

ベストアンサー

Canvas内のアイテムにはタグをセットすることができ、アイテム類に同じタグをセットすることでそれらをグループとして扱うことができます。
具体的にはクリック時にfind_closestなアイテムからそのアイテムが属するタグを取得し、ドラッグ時にはタグ指定で移動させることができます。
なおbindもアイテム毎ではなくタグで一括指定することができます。

Python

1import tkinter as tk1 2 3'''図形のクリックイベント''' 4def zukei_click(event): 5 global before_x, before_y 6 global tag 7 x, y = event.x, event.y 8 ids = c0.find_closest(x, y) 9 tag = c0.gettags(ids[0])[0] 10 before_x, before_y = x, y 11 12def zukei_drag(event): 13 global before_x, before_y 14 global tag 15 x, y = event.x, event.y 16 c0.move(tag,x - before_x, y - before_y) 17 before_x, before_y = x, y 18 19def main(): 20 global c0 21 22 app = tk1.Tk() 23 app.title(u"Software Title") 24 c0 = tk1.Canvas(app, width = 500, height = 300,bg="white") 25 26 for i in range(3): 27 tag = f'block{i}' 28 id = c0.create_oval(10, 10+100*i, 140, 100+100*i, tags = tag) 29 c0.itemconfigure(id, fill = 'lightblue', outline = 'blue') 30 c0.create_text(50, 50+100*i, text='こんにちは', tags = tag) 31 c0.tag_bind(tag, "<ButtonPress-1>", zukei_click) 32 c0.tag_bind(tag, "<Button1-Motion>", zukei_drag) 33 34 c0.pack() 35 app.mainloop() 36 37if __name__ == "__main__": 38 main()

投稿2022/08/05 04:29

can110

総合スコア38233

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

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

piyokomaru

2022/08/06 16:10

ありがとうございます!おかげ様で実装はできたのですが、下の一行だけ理解できなくて...お時間あれば意味を教えていただけると嬉しいです>< tag = c0.gettags(ids[0])[0]
piyokomaru

2022/08/07 08:54

find_closestが返却するオブジェクトidsはタプル形式で、ids[0]はそのタプルの0番目を取得しているということであっていますか?そのカッコの後ろにある[0]も何をさしているのか理解ができません。。不勉強なものですみません泣
can110

2022/08/07 10:40

idsについてはそのとおりです。あとはgettags関数の戻り値について確認してみてください。 また、実際にコードを動かして、各関数の戻り値をprintして確かめてみるなどすると理解しやすいかと思います。
piyokomaru

2022/08/08 01:55

ご丁寧にありがとうございます!おかげさまで理解できました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問