tkinter 自动贴边小程序

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值