3

プログラムのユーザーがウィジェットから画像をドラッグして、最初の位置から画像を削除せずに別のウィジェットにドロップできるようにしようとしています。

これには a を使用することを考えましたTopLevel。クリック + ドラッグ イベントが発生するTopLevelと、同じ画像を含む が、クリックされた画像のすぐ上にポップアップ表示されevent.xますevent.y。次に、マウスと一緒にその位置を変更し、そのときにのみButtonRelease-1破壊TopLevelされます。

Button Release イベントが、他のウィジェット (この場合はキャンバス) に対応するマスターの x および y 座標でトリガーされた場合、およびcanvas.create_image()を使用してをトリガーします。event.xevent.y

私が直面している問題は次のとおりです。

  1. TopLevel一度に表示されるのは1 つだけですが、それを制限することに成功しませんでした。マウスをクリックしてドラッグすると、いくつかのウィンドウが重なります。

  2. Toplevel.geometryバインドされたイベントの x および y 位置を使用できません。

  3. 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
4

1 に答える 1