Перетащите ручку окна для Tkinter? - PullRequest
1 голос
/ 17 сентября 2011

Прежде всего, это мой текущий код, его основные части:

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 Ответ

2 голосов
/ 18 сентября 2011

Вот небольшой пример:

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_this или lookLikeThis.
  • Переменные не нужно объявлять. Если вы хотите создать переменную экземпляра, сделайте это в __init__ (и определенно не вне метода, если вы не хотите переменную класса).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...