PyHook+tkinter实现置顶浮窗,动态显示文本



  • #-*- coding:utf-8 -*-
    import Tkinter
    import threading
    import time
    from libs import util
    from libs.db import reds
    from libs.widnows import cW
    
    
    class Title():
    
        def __init__(self,amount,msg):
            '''像素单元'''
            self.relWidthUnit = 400 / float(1920)
            self.relHeightUnit =200 / float(1080)
            self.relTextUnit =100 / float(1920*1080)
            self.relText2Unit =50 / float(1920*1080)
            self.top = Tkinter.Tk()
            self.top.title('xlife')
            '''禁止最大化'''
            self.top.resizable(False, False)
            '''置顶'''
            self.top.wm_attributes('-topmost', 1)
            '''获取系统分辨率'''
            self.w=self.top.winfo_screenwidth()
            self.h=self.top.winfo_screenheight()
            self.top.bind('<Button-1>',self.callback)
            self.top.geometry('{}x{}+{}+2'.format(int(self.relWidthUnit*self.w),int(self.relHeightUnit*int(self.h)),int(self.w-self.relWidthUnit*self.w)))  #初始化窗口大小
            self.top.attributes("-alpha", 0.6)#窗口透明度60 %
            self.label = Tkinter.Label(self.top, text=amount, font='Helvetica -{} bold'.format(int(self.relTextUnit*self.h*self.w)))  # 创建标签
            self.label2 = Tkinter.Label(self.top, text=msg, font='Helvetica -{} bold'.format(int(self.relTextUnit*self.h*self.w)),bg='WhiteSmoke')  # 创建标签
            self.label.pack(fill=Tkinter.Y, expand=1)  # 填充到界面
            self.label2.pack(fill=Tkinter.Y, expand=1)  # 填充到界面
    
        def callback(self,event):
            cW.swh_window()
    
        def display(self):
            # 进入消息循环
            self.top.mainloop()
    
        def wait(self):
    
            while True:
                try:
                    task = reds.blpop(util.get_mac_address())
                    if str(task[1]).find(',') > -1:
                        task = list(str(task[1]).split(','))
                        self.label.config(text='%.2f'%(float(task[0])))
                        t2 = threading.Thread(target=self.default)
                        t2.setName('titleDefault')
                        t2.setDaemon(True)
                        print '1.线程{}状态:{};{}'.format(t2.getName(), t2.isAlive(), t2.isDaemon())
                        if task[2]=='1':
                            self.label2.config(text=task[1],bg='green')
                            t2.start()
                        elif task[2]=='0':
                            self.label2.config(text=task[1],bg='yellow')
                        elif task[2]=='-1':
                            self.label2.config(text=task[1], bg='red')
                            t2.start()
                        elif task[2]=='-2':
                            self.label2.config(text=task[1],bg='yellow')
                            t2.start()
                        else:
                            self.label2.config(text=task[1])
                        print '2.线程{}状态:{};{}'.format(t2.getName(), t2.isAlive(), t2.isDaemon())
                    else:
                        print util.get_time()+'   received window ping .'
                except Exception:
                    continue
    
        def default(self):
            time.sleep(3)
            self.label.config(text='%.2f' % (0.00))
            self.label2.config(text='AI小助手',bg='WhiteSmoke')
    
    if __name__ == '__main__':
        Title('10.00','正在支付...').display()
    

    注意:wait函数需要多线程触发,因为tkinter的display()属于消息循环,消息的显示需要外部触发,我这里用的是redis的消息队列,实时获取pyhook传递过来的内容。


Log in to reply