对tkinter简单封装了窗口拖动和点击获取鼠标位置的方法

Posted Jason_WangYing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对tkinter简单封装了窗口拖动和点击获取鼠标位置的方法相关的知识,希望对你有一定的参考价值。

from tkinter import Tk
from tkinter import *

class PfTk(Tk):
    """
    Tk的扩展
    增加了对鼠标左键拖动的支持
    封装了部分功能方法
    """

    def __init__(self, title='PfTk', width=600, height=300, bg='red'):
        """
        初始化Tk
        :param title: str: 窗口标签(默认: PfTk)
        :param width: int: 宽度(默认: 300)
        :param height: height: 高度(默认: 300)
        :param bg: str: 背景色(默认: white)
        """
        # 调用父类构造方法
        super().__init__()
        # 设置窗口大小与居中
        self.geometry(f'widthxheight+'
                      f'int((self.winfo_screenwidth() - width) / 2)+'
                      f'int((self.winfo_screenheight() - height) / 2)')
        # 标题
        self.title(title)
        # 背景色
        self.config(bg=bg)
        # 鼠标拖动
        self.__motion = False
        # 鼠标点击坐标
        self.__clickX, self.__clickY = 0, 0
        # 绑定鼠标点击事件
        self.bind("<Button-1>", self.__onClick)
        # 绑定鼠标拖动事件
        self.bind('<B1-Motion>', self.__onMotion)
        self.initWidgets()

    def initWidgets(self):
        self.button_sync = Button(self.master, text='测试按钮', command=self.sync_file)
        self.button_sync.pack()
    def sync_file(self):
        print("sync_file")

    def bd(self, tf):
        """
        设置窗口边框
        :param tf: bool: 是否带有边框(默认: True)
        :return:
        """
        self.overrideredirect(not tf)

    def topmost(self, tf):
        """
        设置窗口置顶
        :param tf: bool: 是否置顶(默认: False)
        :return:
        """
        self.wm_attributes("-topmost", tf)

    def alpha(self, f):
        """
        设置窗口透明度
        :param f: float: 透明度(默认: 1.0)
        :return:
        """
        self.attributes('-alpha', f)

    def colorAlpha(self, color):
        """
        设置窗口某一颜色完全透明
        :param color: str: 颜色
        :return:
        """
        self.attributes('-transparentcolor', color)

    def move(self, tf):
        """
        设置窗口拖动
        :param tf: bool: 是否可以拖动(默认: False)
        :return:
        """
        self.__motion = tf

    def disable(self, tf):
        """
        设置窗口功能
        :param tf: bool: 是否具备功能(默认: True)
        :return:
        """
        self.attributes("-disabled", tf)

    def show(self, tf):
        """
        设置窗口显示
        :param tf: 是否显示(默认: True)
        :return:
        """
        if tf:
            self.deiconify()
        else:
            self.withdraw()

    def __onClick(self, event):
        """
        窗口鼠标左键点击事件
        :param event: obj: 鼠标左键点击事件
        :return:
        """
        print("记录鼠标左键点击坐标")
        print(event)
        # 记录鼠标左键点击坐标
        self.__clickX = event.x
        self.__clickY = event.y

    def __onMotion(self, event):
        """
        窗口鼠标拖动事件
        :param event: obj: 鼠标拖动事件
        :return:
        """
        print(event)
        if self.__motion:
            self.geometry(f'self.winfo_width()xself.winfo_height()+'
                          f'int(self.winfo_x() + event.x - self.__clickX)+'
                          f'int(self.winfo_y() + event.y - self.__clickY)')



# root = Tk()
PfTk().mainloop()

# root.mainloop()

以上是关于对tkinter简单封装了窗口拖动和点击获取鼠标位置的方法的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter:鼠标拖动一个没有边框的窗口,例如。覆盖直接(1)

在 Python 中获取 Tkinter 窗口之外的鼠标事件

在用鼠标拖动窗口时有阴影怎么办

js中sortable怎么获取拖动的东西

VC:如何实现窗口和窗口内容在鼠标拖动下改变大小

如何使点击事件通过tkinter窗口?