Python: 实现鼠标点击tkinter窗口任意位置拖动

引子

近期在用python的tkinter库开发一个GUI,在开发接近尾声时候,同事发现一个问题:因GUI窗口较大,在他的笔记本上不能全部展示,而且只能通过点击顶部状态栏才能拖动,这样即使鼠标已经在屏幕最顶部,也无法看到窗口底部的控件。

一个解决方法就是:窗口及控件可以自适应改变。但时间紧迫,进而采用第二个方案:鼠标可以点击tkinter窗口任意位置进行拖动,这样就能通过拖动,看到窗口的任意位置了!

如下例:

import tkinter as tk
'''
鼠标点击tkinter窗口任意位置进行拖动
'''
class uGUIHandler():
    def __init__(self):
        self.window = tk.Tk()

        self.x, self.y = 0, 0
        self.window_size = '800x700'

        # 设置隐藏窗口标题栏和任务栏图标
        self.window.overrideredirect(True)
        # 设置窗口大小、位置 长x宽+距离屏幕左边距离x+距离屏幕上边距离y
        self.window.geometry(f"{self.window_size}+700+20")
        # 设定背景颜色
        self.window.configure(bg="LightCyan")

        # 窗口移动事件
        self.window.bind("<B1-Motion>", self.move)
        # 单击事件
        self.window.bind("<Button-1>", self.get_point)
        # 双击事件
        self.window.bind("<Double-Button-1>", self.close)

    def move(self, event):
        """窗口移动事件"""
        new_x = (event.x - self.x) + self.window.winfo_x()
        new_y = (event.y - self.y) + self.window.winfo_y()
        s = f"{self.window_size}+{new_x}+{new_y}"
        self.window.geometry(s)

    def get_point(self, event):
        """获取当前窗口位置并保存"""
        self.x, self.y = event.x, event.y

    def run(self):
        self.window.mainloop()

    def close(self, event):
        self.window.destroy()


if __name__ == "__main__":
    init_window = uGUIHandler()
    init_window.run()

至此问题得以解决。从这个例子里,还得到获取当前鼠标位置的方法。望读者代码中挖掘哦~

除此外,对tkinker窗口的鼠标相关的事件还有:

<Button-1>   鼠标左键
<Button-2>   鼠标中间键(滚轮)
<Button-3>   鼠标右键
<Double-Button-1>   双击鼠标左键
<Double-Button-3>   双击鼠标右键
<Triple-Button-1>   三击鼠标左键
<Triple-Button-3>   三击鼠标右键
<B1-Motion>   鼠标左键滑动
<B2-Motion>   鼠标滚轮移动
<B3-Motion>   鼠标右键滑动
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值