2014-11-20 104 views
0

這是我的類,它允許用戶拖動畫布。當我拖動它時,我的畫布正在改變位置

class WindowDraggable(): 

    def __init__(self, label): 
     self.label = label 
     label.bind('<ButtonPress-1>', self.StartMove) 
     label.bind('<ButtonRelease-1>', self.StopMove) 
     label.bind('<B1-Motion>', self.OnMotion) 

    def StartMove(self, event): 
     self.x = event.x 
     self.y = event.y 

    def StopMove(self, event): 
     self.x = None 
     self.y = None 

    def OnMotion(self, event): 
     x = (event.x_root - self.x - self.label.winfo_rootx() 
            + self.label.winfo_rootx()) 
     y = (event.y_root - self.y - self.label.winfo_rooty() 
            + self.label.winfo_rooty()) 
     root.geometry("+%s+%s" % (x, y)) 

然而,當我點擊並按住標籤,隨後的動作進行調整,以便將光標定位在畫布的左上方的畫布的位置。你可以看到光標在這個圖像中的位置。

enter image description here

我想到了使用建議手動設置光標位置這樣

def StartMove(self, event): 

    self.x = event.x + 100 
    self.y = event.y + 150 

來解決這個問題,但問題是標籤擴展到觸摸屏的兩側,所以出於美學原因,光標應該簡單地保持在其原始位置。我發現這個功能,認爲它有助於解決問題,但我在使用它方面有點失落。

#sets mouse-cursor position 
def click(x,y): 
    win32api.SetCursorPos((x,y)) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) 

這是我縮小的程序,只顯示與我的問題有關的基本部分。

from tkinter import * 
from PIL import ImageTk, Image 

#window creation 
root = Tk() 
root.overrideredirect(1) # eliminates frame around window 

#canvas creation 
canvas = Canvas(root, width=width, height=height, bd=-2) 
canvas.pack() 

#sets mouse-cursor position 
def click(x,y): 
    win32api.SetCursorPos((x,y)) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) 

#makes window draggable 
class WindowDraggable(): 

    def __init__(self, label): 
     self.label = label 
     label.bind('<ButtonPress-1>', self.StartMove) 
     label.bind('<ButtonRelease-1>', self.StopMove) 
     label.bind('<B1-Motion>', self.OnMotion) 

    def StartMove(self, event): 

     self.x = event.x + 100 
     self.y = event.y + 150 

    def StopMove(self, event): 
     self.x = None 
     self.y = None 

    def OnMotion(self, event): 
     x = (event.x_root - self.x - self.label.winfo_rootx() 
            + self.label.winfo_rootx()) 
     y = (event.y_root - self.y - self.label.winfo_rooty() 
            + self.label.winfo_rooty()) 
     root.geometry("+%s+%s" % (x, y)) 


#creates the draggable label 
label = Label(root, text='drag me') 
WindowDraggable(label) 
label.pack(fill=BOTH, expand=1) 

#end of program 
root.mainloop() 
+1

您的問題提到一個畫布,但您的代碼不顯示畫布。這只是一些代碼直接從另一個SO答案複製和粘貼。你能給我們一個完整的例子來說明你的問題嗎? – 2014-11-20 17:03:53

+0

@BryanOakley好的,這是整個代碼。我爲什麼被低估(再次)。 – user4261180 2014-11-20 17:06:56

+1

我低估了你原來的問題,因爲你提到一個問題而不顯示任何研究工作。您發佈的代碼不是您的代碼,而是從另一個帖子中剪切和粘貼的代碼。你的問題提到了一個畫布,但代碼沒有顯示畫布。所有這些都會造成質量問題。現在你有這個問題,你有太多的代碼。執行ping的代碼與移動窗口無關,爲什麼要包含它?你應該努力制定可能出現問題的最小程序。 – 2014-11-20 18:13:21

回答

1

聽起來像是你需要使它這樣,當你設置畫布的新位置,你需要採取遠離X畫布寬度的一半,並添加畫布高度的一半爲什麼:

def StartMove(self, event): 
    self.x = event.x - (width/2) 
    self.y = event.y + (height/2) 
+0

這幾乎解決了我的問題。任何想法,爲什麼我不能使用部門沒有得到一個錯誤?增加和減少似乎工作。 – user4261180 2014-11-20 19:09:25

+1

@ user4261180意識到我在答案中忘記了這個部門。你以這種方式擺脫了嗎?如果是這樣,錯誤是什麼? – 2014-11-20 23:01:11

+0

不,我沒有把它擺出來,雖然我認爲我試圖用括號。我確信它會按照你的方式工作,但現在我已經擴展了標籤,以便用戶有更大的表面區域來點擊和拖動,我寧願光標保持在同一位置而不是重新定位到中心位置的標籤(如果這是有道理的)。你可以在編輯的問題中看到我的意思...... – user4261180 2014-11-21 00:59:15

相關問題