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()
dragwindow.py
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()

浙公网安备 33010602011771号