微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python / Tkinter:鼠标拖动没有边框的窗口,例如. overridedirect(1)

关于如何创建允许用户鼠标拖动没有边框的窗口的事件绑定的任何建议,例如.用overridedirect(1)创建的窗口?

使用案例:我们想创建一个浮动的工具栏/调色板窗口(没有边框),我们的用户可以在他们的桌面上拖动它们.

这就是我的想法(伪代码):

1. window.bind( '<Button-1>', onm ouseDown ) to capture the initial position of the mouse.

2. window.bind( '<Motion-1>', onm ouseMove ) to track position of mouse once it starts to move.

3. Calculate how much mouse has moved and calculate newX, newY positions.

4. Use window.geometry( '+%d+%d'% ( newX, newY ) ) to move window.

Tkinter是否暴露了足够的功能以允许我实现手头的任务?或者是否有更容易/更高级别的方法来实现我想要做的事情?

解决方法:

是的,Tkinter公开了足够的功能来做到这一点,不,没有更容易/更高级的方法来实现你想做的事情.你几乎有正确的想法.

这是一个例子:

import Tkinter as tk
import tkFileDialog 

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.floater = FloatingWindow(self)

class FloatingWindow(tk.Toplevel):
    def __init__(self, *args, **kwargs):
        tk.Toplevel.__init__(self, *args, **kwargs)
        self.overrideredirect(True)

        self.label = tk.Label(self, text="Click on the grip to move")
        self.grip = tk.Label(self, bitmap="gray25")
        self.grip.pack(side="left", fill="y")
        self.label.pack(side="right", fill="both", expand=True)

        self.grip.bind("<ButtonPress-1>", self.StartMove)
        self.grip.bind("<ButtonRelease-1>", self.StopMove)
        self.grip.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
        x = self.winfo_x() + deltax
        y = self.winfo_y() + deltay
        self.geometry("+%s+%s" % (x, y))



app=App()
app.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐