拖动Tkinter的窗口句柄?

时间:2011-09-17 14:46:18

标签: python drag-and-drop tkinter python-2.7

首先,这是我目前的代码,它的基本部分:

class WindowDraggable():        
    x = 1
    y = 1
    def __init__(self,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):
        deltaX = event.x - self.x
        deltaY = event.y - self.y
        self.x = root.winfo_x() + deltaX
        self.y = root.winfo_y() + deltaY
        root.geometry("+%sx+%s" % (self.x,self.y))

#root is my window:
root = Tk()

#This is how I assign the class to label
WindowDraggable(label)

#All imports
from Tkinter import *
from PIL import Image, ImageTk
import sys
import re

我想要完成的是;通过句柄使窗口可拖动,在本例中为label。我无法真正描述它现在的行为,但它确实会移动窗口,而不是跟随鼠标。

请耐心等待我,因为我是Python的新手。任何帮助都表示赞赏:)重写一堂课是可以的,我知道它写的很糟糕。

1 个答案:

答案 0 :(得分:2)

这是一个小例子:

from Tkinter import *
root = Tk()

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))

label = Label(root, text='drag me')
WindowDraggable(label)
label.pack()
root.mainloop()

你几乎没有,但你必须补偿标签本身的偏移量。请注意,我的示例不会补偿窗口边框。您将不得不使用特定工具来解决这个问题(所以这个示例在使用overrideredirect(1)时非常有效。

我的猜测是你来自另一种编程语言,所以当我在这里时,我会给你一些提示:

  • Python不会以;结束语句(虽然有效的语法,没有理由这样做)。
  • 方法名称应始终为look_like_thislookLikeThis
  • 不需要声明变量。如果你想在__init__中创建一个实例变量(除非你想要一个类变量,否则绝对不在方法之外)。