Python tk ウィジット上の座標を判断したい
実現したいこと
異なるCanvasウィジット間でドラッグアンドドロップを実現する。
やろうとしていること
マウスイベントを親ウィンドウでバインドし、その座標情報からCanvasウィジット上にある座標かを判断し、Canvasウィジット上の座標に変換して、各Canvas内のオブジェクトを操作する。
現在の問題点・試したこと
該当するCanvasウィジット内の有効な座標かどうかを判断したく、各Canvasウィジットのメソッドcanvasx,canvasyを取得して判断しようとしました。
eventで対象ウィジットの情報が得られたため、どのウィジットでのイベントかは判断できましたが、マウス移動、マウスリリース時では、その移動先のウィジットの情報が得られません。
Canvasウィジット自体の親ウィンドウ上の座標が分かれば、判断できると思うのですが、座標の取得方法が分かりません。
ご存知の方がいらっしゃればご教示お願い致します。
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk
class CreateScreen(object):
def __init__(self):
self.screen_w = 800
self.screen_h = 300
self.dlg_pos_x = 10
self.dlg_pos_y = 10
return super().__init__()
def createMainWindow(self):
self.MainWindow = ttk.tkinter.Tk()
geo_string = str(self.screen_w) + "x" + str(self.screen_h) + "+" + str(self.dlg_pos_x) + "+" + str(self.dlg_pos_y)
self.MainWindow.geometry(geo_string)
_InFrame_ = tk.Frame(
self.MainWindow,
width = 300,
height = 200,
)
self._Canvas_A_ = tk.Canvas(
_InFrame_,
bg = 'red'
)
self._Canvas_B_ = tk.Canvas(
_InFrame_,
bg = 'blue'
)
_InFrame_.pack()
self._Canvas_A_.pack(side = tk.LEFT)
self._Canvas_B_.pack(side = tk.LEFT)
self.MainWindow.bind('<Button-1>',self.MainWindow_left_click)
self.MainWindow.bind('<B1-Motion>',self.MainWindow_drag_mouse_move_on)
self.MainWindow.bind('<ButtonRelease-1>',self.MainWindow_mouse_release)
return self.MainWindow
def MainWindow_left_click(self,event):
if event.widget == self._Canvas_A_:
x = self._Canvas_A_.canvasx(event.x)
y = self._Canvas_A_.canvasx(event.y)
print('_Canvas_A_(Clicled):',x,y)
if event.widget == self._Canvas_B_:
x = self._Canvas_B_.canvasx(event.x)
y = self._Canvas_B_.canvasx(event.y)
print('_Canvas_B_(Clicled):',x,y)
return
def MainWindow_drag_mouse_move_on(self,event):
if event.widget == self._Canvas_A_:
x = self._Canvas_A_.canvasx(event.x)
y = self._Canvas_A_.canvasx(event.y)
print('_Canvas_A_(move):',x,y)
if event.widget == self._Canvas_B_:
x = self._Canvas_B_.canvasx(event.x)
y = self._Canvas_B_.canvasx(event.y)
print('_Canvas_B_(move):',x,y)
return
def MainWindow_mouse_release(self,event):
if event.widget == self._Canvas_A_:
x = self._Canvas_A_.canvasx(event.x)
y = self._Canvas_A_.canvasx(event.y)
print('_Canvas_A_(release):',x,y)
if event.widget == self._Canvas_B_:
x = self._Canvas_B_.canvasx(event.x)
y = self._Canvas_B_.canvasx(event.y)
print('_Canvas_B_(release):',x,y)
return
if __name__ == '__main__':
screen_obj = CreateScreen()
#testobj = tkTest.CreateScreen()
MainWindow_obj = screen_obj.createMainWindow()
#testobj._TemplateDialog(MainWindow_obj)
MainWindow_obj.mainloop()