Pythonで図形のドラッグ&ドロップ

Python->Tkinter->Canvasでオブジェクトをドラッグ&ドロップします。


下記のページを参考にしました。
http://www.shido.info/py/tkinter10.html

上記のページのtoy.pyのドラッグ&ドロップの機能だけを抜き出してシンプルにすると、こうなる。
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
import Tkinter
 
class CanvasOval:
canvas = None
 
def __init__(self, x0, y0, x1, y1, **key):
self.id = self.canvas.create_oval(x0, y0, x1, y1, **key)
self.canvas.tag_bind(self.id, '<1>', self.drag_start)
self.canvas.tag_bind(self.id, '<Button1-Motion>', self.dragging)
 
def drag_start(self, event):
self.x = event.x
self.y = event.y
 
def dragging(self, event):
self.canvas.move(self.id, event.x-self.x ,event.y-self.y)
self.x = event.x
self.y = event.y
 
class Frame(Tkinter.Frame):
 
def __init__(self, master=None):
Tkinter.Frame.__init__(self, master)
self.cvs = Tkinter.Canvas(self,width="200", height="200", bg="white")
self.cvs.grid(row=0, column=0)
 
CanvasOval.canvas=self.cvs
CanvasOval(40, 40, 50, 50, fill="red", width=0)
CanvasOval(130, 130, 170, 170, fill="red", width=0)
 
if __name__ == '__main__':
f = Frame()
f.pack()
f.mainloop()
 

up_20080819053815.jpg

オブジェクトの移動はCanvasのメソッドであるmoveを使います(16行目)。

moveで動かすオブジェクトの指定はid、またはtagによって判別します。idはオブジェクトを生成した時点で勝手に作られ、7行目のように取得します。tagは複数のオブジェクトを動かす時に使われ、オブジェクトを生成する時にオプションで指定します。

例えば
canvas.create_oval(x0, y0, x1, y1, tags="daen")
でdaenというタグ名がつけられ、
canvas.move("daen", x ,y)
でdaenタグのついたオブジェクト全部をmoveします。

マウスの当たり判定をtag_bindでつけます。指定したidまたはtagに対して設定されます。
バインディングについては以下を参考に。
http://d.hatena.ne.jp/Cassiopeia/20070821/1187701922

よくわかってないのは、27行目。インスタンス変数にぶち込んでるわけでもなく、クラスに直接ぶち込めるの?なんか違和感。いや、まぁ、便利だけど。

目次へ
関連記事

コメント

27行目について・・・

こんばんわ、最近やっとTkinterの勉強を始めた素人プログラマです。
わかりやすく説明されていて、大変助かりました。^ー^

ところで下記の文についてですが、大分前の記事なの
でもう分かっているかも知れませんが・・・そしたらすみません。><;
>よくわかってないのは、27行目。インスタンス変数にぶち
>込んでるわけでもなく、クラスに直接ぶち込めるの?なんか
>違和感。いや、まぁ、便利だけど。

これは、クラスの静的メンバ変数への代入なのでクラス名で
も大丈夫ということですね。
詳しくは下記のURLの”クラス変数”の項を読んでもらえると、良く分かると思います。
ttp://www.geocities.jp/m_hiroi/light/python05.html

No title

はじめましてー。
いやー、クラスの持つ変数にもアクセスできるっとわかった時点で、それ以上考えてなかったです。ご教授ありがとうございます。

Pythonの場合、そもそもクラスもオブジェクトとして扱われるので、クラス変数やメソッドを動的にぶち込めたりするので、その後は違和感はすっかりどこかに行ってしまいました^^;

>>わかりやすく説明されていて、大変助かりました。^ー^
半端なところでやめてしまっているので、ちょっと心痛いですねw
スクリプトが大きくなるにつれて、データをどのように保持していくかが、この時は分からなくて、途中でやめてしまっていたのですが、タイムリーなことに、今仕様を一変させて作り直してます。なので、近々復活するかもしれないので、良ければまた教えてください。それではー。

コメントの投稿

非公開コメント

このブログについて
□ ブログ内容
決まった趣旨はありません。
興味を持ったこと・日常で行ったことを何でも書きます。

3DCG・プログラミングなどが多めです。

□ 現在の活動
・ウェブサイト制作
 (http://tiblab.net)
・3Dゲーム制作
 (コックパニック)
検索フォーム
ユーザータグ

Blender キャプチャ blendファイル BGE Python GameEngine ムービー Android CG  Red5 Terragen C# C++ 

カテゴリー
プロフィール

TiBra

Author:TiBra
趣味でCG制作、プログラミング等を行っています。メイカーズに憧れています。

ネットを通じた交流を広げたく思っていますので、コメント・メールはお気軽にどぞー

戯言程度のことは、こちらのブログに投稿しています。基本戯言なので、実質移転しているようなものです。

Mail:tibraあっとlive.jp
HP:TibLabmemocode
動画:VimeoFC2動画ニコニコ
ファイル:SkyDrive
企画:3Dゲーム作業実況

Blogリンク
不都合がございましたらご連絡ください。
当ブログのリンクバナー
FC2 ID
FC2カウンター
RSSフィード+解析コード