2013-03-17 70 views
2

我正在研究一個拖放功能,可以讓我在canvas上移動項目。我讓它工作(種類),但我只移動一點,但是線條在屏幕上射擊(並最終關閉畫布的可見部分,所以我不能得到它,我不知道在哪裏何去何從下面是拖放我創建至今代碼:。Tkinter拖放

def onPressToMove(self, event): #get initial location of object to be moved 
    winX = event.x - self.workspace.canvasx(0) 
    winY = event.y - self.workspace.canvasy(0) 
    self.dragInfo["Widget"] = self.workspace.find_closest(event.x, event.y, halo = 5)[0] 
    self.dragInfo["xCoord"] = winX 
    self.dragInfo["yCoord"] = winY 

def onReleaseToMove(self, event): #reset data on release 
    self.dragInfo["Widget"] = None 
    self.dragInfo["xCoord"] = 0 
    self.dragInfo["yCoord"] = 0   

def onMovement(self, event): 
    winX = event.x - self.workspace.canvasx(0) 
    winY = event.y - self.workspace.canvasy(0) 
    newX = winX - self.dragInfo["xCoord"] 
    newY = winY - self.dragInfo["yCoord"] 
    self.workspace.move(self.dragInfo["Widget"], newX, newY) 

dragInfo是我使用的存儲數據的字典。原本我以爲翻譯畫布座標到窗口座標會有所幫助,但它的作用與沒有的東西。

回答

3

This answer問題「板移動橢圓的代碼」顯示瞭如何在畫布上拖動一個對象。

在你的情況,當你移動的物體你不重置增量的基礎。如果鼠標向右移動一個像素,則使用move將鼠標向右移動一個像素。

現在,讓我們假設你將它向右移動一個像素。這一次,您的計算表明,即使您實際上只是將鼠標移動了一個像素,增量仍然是從起點開始的2。下一次移動一個像素時,計算的增量爲3,依此類推。

解決方案很簡單:在移動時重置dragInfo["xCoord"]dragInfo["yCoord"],因爲您只需要將增量計算爲其前一個位置,而不是原始起始位置。

def onPressToMove(self, event): #get initial location of object to be moved 
    winX = event.x - self.canvas.canvasx(0) 
    winY = event.y - self.canvas.canvasy(0) 
    self.dragInfo["Widget"] = self.canvas.find_closest(event.x, event.y, halo = 5)[0] 

    # reset the starting point for the next move 
    self.dragInfo["xCoord"] = winX 
    self.dragInfo["yCoord"] = winY 
+0

,我讀了,但是這並沒有真正回答我的問題。我的問題是,它是如此迅速地移動的原因。如果有任何東西比最輕微的運動使它在畫布上射擊並且看不見,那麼拖動它是沒有用的。 – user2148990 2013-03-17 22:08:01

+0

@ user2148990:您是否打印出了在「移動」調用中使用的值,看看它們是否您期望它們是? – 2013-03-17 22:17:49

+0

它總是容易忽略的簡單事情。重置起點現在已經很完美了。謝謝! – user2148990 2013-03-17 22:43:05