プログラムのユーザーがウィジェットから画像をドラッグして、最初の位置から画像を削除せずに別のウィジェットにドロップできるようにしようとしています。
これには a を使用することを考えましたTopLevel
。クリック + ドラッグ イベントが発生するTopLevel
と、同じ画像を含む が、クリックされた画像のすぐ上にポップアップ表示されevent.x
ますevent.y
。次に、マウスと一緒にその位置を変更し、そのときにのみButtonRelease-1
破壊TopLevel
されます。
Button Release イベントが、他のウィジェット (この場合はキャンバス) に対応するマスターの x および y 座標でトリガーされた場合、およびcanvas.create_image()
を使用してをトリガーします。event.x
event.y
私が直面している問題は次のとおりです。
TopLevel
一度に表示されるのは1 つだけですが、それを制限することに成功しませんでした。マウスをクリックしてドラッグすると、いくつかのウィンドウが重なります。Toplevel.geometry
バインドされたイベントの x および y 位置を使用できません。Toplevel
マジックナンバーや変数なしで、ユーザーがクリックしたのと同じ画像を表示する方法は?
これまでの私のコードは次のとおりです。
class animalImgList():
def __init__(self, a):
#Constructor
initX = 75
initY = 40
animalList = ['pig2.jpg', 'pig3.jpg', 'pig4.jpg']
for a in animalList:
vars(self)[a+'img'] = PIL.Image.open(a)
vars(self)[a+'tkimg'] = PIL.ImageTk.PhotoImage(vars(self)[a+'img'])
vars(self)[a+'labelName'] = Label(anmlCanvas, image=vars(self)[a+'tkimg'])
vars(self)[a+'canvasImg'] = anmlCanvas.create_image(initX, initY,image=(vars(self)[a+'tkimg']))
initY = initY + 70
anmlImgList = []
anmlImgList.append(vars(self)[a+'canvasImg'])
imgTags = anmlCanvas.addtag_all("img")
anmlCanvas.tag_bind("img", "<Button-1>", self.createImg)
def createImg(self, event):
newImg = Toplevel(root)
newImg.geometry("50x40"+"+"+ x+"+"+y)
newImgMsg = Message(newImg, text="This is supposed to be an image")
newImgMsg.pack()
newImg.update_idletasks()
newImg.overrideredirect(True)
createImgOpen = True
if createImgOpen == True:
pass