from tkinter import *
import sys
import _tkinter
class Rollpanel(Tk):
def __init__(self, title, w, h, distance, speed=6):
"""
title: 标题
w: 窗口宽度
h: 窗口高度
distance: 隐藏后漏出的像素数
speed: 值越大,动画色度越快(不应超过w-distance)
"""
super().__init__()
self.title(title)
self.w = w
self.h = h
self.distance = distance
self.moving = False
self.speed = speed
self.adds()
def adds(self):
window_w = self.winfo_screenwidth()
window_h = self.winfo_screenheight()
self.resizable(False, False)
self.overrideredirect(True)
self.geometry(
'{}x{}+{}+{}'.format(self.w, self.h, (window_w - self.w), (int((window_h - self.h) / 2))))
self.wm_attributes("-topmost", True)
self.config(bg='white')
btn = Button(self, text='x', relief='flat', command=self.destroy)
btn.place(x=5, y=5)
self.bind('<Enter>', lambda *args: self.enter_panel())
self.bind('<Leave>', lambda *args: self.leave_panel())
def enter_panel(self):
window_w = self.winfo_screenwidth()
win_x, win_y = self.winfo_x(), self.winfo_y()
if window_w - win_x <= self.distance + 1 and not self.moving:
self.moving = True
for i in range(self.w - self.distance):
self.geometry('+{}+{}'.format(win_x - i, win_y))
if i % self.speed == 0:
self.update()
self.update()
self.moving = False
def leave_panel(self):
window_w = self.winfo_screenwidth()
win_x, win_y = self.winfo_x(), self.winfo_y()
if self.w >= window_w - win_x > self.distance + 1 and not self.moving:
self.moving = True
for i in range(window_w - win_x - self.distance):
self.geometry('+{}+{}'.format(win_x + i, win_y))
if i % self.speed == 0:
self.update()
self.update()
self.moving = False
def mainloop(self, n=0):
try:
while True:
self.update()
except (RuntimeError, KeyboardInterrupt, _tkinter.TclError):
sys.exit(1)
if __name__ == '__main__':
app = Rollpanel("Test", 300, 200, 30)
app.mainloop()
tkinter 自动贴边小程序
最新推荐文章于 2024-05-09 09:06:11 发布