Python Tkinter 实现桌面小挂件

import tkinter as tk

root = tk.Tk()

root.wm_attributes("-alpha", 0.4)        # 透明度(0.0~1.0)
root.wm_attributes("-toolwindow", True)  # 置为工具窗口(没有最大最小按钮)
root.wm_attributes("-topmost", True)     # 永远处于顶层

# 还可以调用如下方法去除窗口边框
# root.overrideredirect(True)
root.mainloop()

如果去除了窗口边框,则窗口无法响应鼠标拖动,这时候我们就得想办法自己监听并处理鼠标事件,来实现窗口跟随鼠标移动。关于拖动事件的处理,我已经做了一个简单封装DragWindow 源码地址

下载源码,使用如下

# 导入DragWindow类
root = DragWindow()
root.set_window_size(200, 200)
root.set_display_postion(500, 400)
tk.Button(root, text="Exit", command=root.quit).pack(side=tk.BOTTOM)

root.mainloop()
import tkinter as tk


class DragWindow(tk.Tk):
    root_x, root_y, abs_x, abs_y = 0, 0, 0, 0
    width, height = None, None

    def __init__(self, topmost=True, alpha=0.4, bg="gray", width=None, height=None):
        super().__init__()
        self["bg"] = bg
        self.width, self.height = width, height
        self.overrideredirect(True)
        self.wm_attributes("-alpha", alpha)      # 透明度
        self.wm_attributes("-toolwindow", True)  # 置为工具窗口
        self.wm_attributes("-topmost", topmost)  # 永远处于顶层
        self.bind('<B1-Motion>', self._on_move)
        self.bind('<ButtonPress-1>', self._on_tap)

    def set_display_postion(self, offset_x, offset_y):
        self.geometry("+%s+%s" % (offset_x, offset_y))

    def set_window_size(self, w, h):
        self.width, self.height = w, h
        self.geometry("%sx%s" % (w, h))

    def _on_move(self, event):
        offset_x = event.x_root - self.root_x
        offset_y = event.y_root - self.root_y

        if self.width and self.height:
            geo_str = "%sx%s+%s+%s" % (self.width, self.height,
                                       self.abs_x + offset_x, self.abs_y + offset_y)
        else:
            geo_str = "+%s+%s" % (self.abs_x + offset_x, self.abs_y + offset_y)
        self.geometry(geo_str)

    def _on_tap(self, event):
        self.root_x, self.root_y = event.x_root, event.y_root
        self.abs_x, self.abs_y = self.winfo_x(), self.winfo_y()
posted @ 2020-01-19 19:17  做梦者造梦  阅读(906)  评论(0)    收藏  举报