#!/usr/bin/python3 from tkinter import * import base64 import time import _thread import queue class Application(Frame): """右键菜单item点击事件 点击后开启多线程启动倒计时 Args: self: time:倒计时时间 Returns:None """ def say_hi(self,time): timetext = "" timemax = time if timemax%60<10: if timemax/60<10: timetext = "0"+str(int(timemax/60))+":0"+str(timemax%60) else: timetext = str(int(timemax/60))+":0"+str(timemax%60) else: if timemax/60<10: timetext = "0"+str(int(timemax/60))+":"+str(timemax%60) else: timetext = str(int(timemax/60))+":"+str(timemax%60) self.timeon.set(timetext) self.timenum.set(time) #self.var.set(120)#设置变量 #self.label.configure(font=('Arial',self.var.get()))#重新设置label配置font参数 #如果有线程在执行,则退出线程,执行下一个 if self.threadstart: self.threadstop = True #while循环,保证上个线程内的循环一定结束了 while self.threadstart: continue # 开启多线程执行倒计时 _thread.start_new_thread(self.duetime,("Thread-1", 0, )) """创建控件 Args: self: Returns:None """ def createWidgets(self): #创建一个label用于显示文本,textvariable用于根据设置的变量功态改变文本内容 self.label = Label(self,bd=20,width=300,height=150,font=('Arial', 50),pady=10,textvariable=self.timeon) self.label.pack() #创建一个button #self.btn = Button(self,text="变大",command=self.say_hi) #self.btn.pack() #创建右键菜单 self.menu = Menu(self,tearoff=False)#tearoff=False关闭顶部线条 # self.menu_item = Menu(self.menu,tearoff=False) #添加子菜单 # for item in ["子菜单1", "子菜单2", "子菜单3", "子菜单4", "子菜单5"]: # self.menu_item.add_command(label=item) #self.menu.add_cascade(label="总菜单",menu=self.menu_item) #添加菜单,使用 command=lambda:fuc(args)来给方法传参 self.menu.add_command(label="开始1:00倒计时", command=lambda:self.say_hi(60)) # self.menu.add_separator()#添加分割线 self.menu.add_command(label="开始1:30倒计时", command=lambda:self.say_hi(90)) self.menu.add_command(label="开始2:00倒计时", command=lambda:self.say_hi(120)) self.menu.add_command(label="开始2:30倒计时", command=lambda:self.say_hi(150)) # self.menu.add_separator() self.menu.add_command(label="开始3:00倒计时", command=lambda:self.say_hi(180)) self.menu.add_command(label="开始4:00倒计时", command=lambda:self.say_hi(240)) self.menu.add_command(label="开始5:00倒计时", command=lambda:self.say_hi(300)) self.menu.add_command(label="开始6:00倒计时", command=lambda:self.say_hi(360)) self.menu.add_command(label="开始7:00倒计时", command=lambda:self.say_hi(420)) self.menu.add_command(label="开始8:00倒计时", command=lambda:self.say_hi(480)) self.menu.add_command(label="开始9:00倒计时", command=lambda:self.say_hi(540)) self.menu.add_command(label="开始10:00倒计时", command=lambda:self.say_hi(600)) self.menu.add_command(label="开始15:00倒计时", command=lambda:self.say_hi(900)) self.menu.add_command(label="开始20:00倒计时", command=lambda:self.say_hi(1200)) self.menu.add_command(label="开始25:00倒计时", command=lambda:self.say_hi(1500)) self.menu.add_command(label="开始30:00倒计时", command=lambda:self.say_hi(1800)) self.menu.add_command(label="开始60:00倒计时", command=lambda:self.say_hi(3600)) self.menu.add_command(label="退出", command=self.master.quit) """倒计时,改变label文本 监听窗口变化,动态改变label文本 Args: self: threadName: delay: Returns:None """ def duetime(self,delay,name): self.threadstart = True timemax = self.timenum.get() print(timemax) while timemax>0: time.sleep(1) timemax = timemax -1 if self.threadstop: self.threadstart = False self.threadstop = False break if timemax%60<10: if timemax/60<10: timetext = "0"+str(int(timemax/60))+":0"+str(timemax%60) else: timetext = str(int(timemax/60))+":0"+str(timemax%60) else: if timemax/60<10: timetext = "0"+str(int(timemax/60))+":"+str(timemax%60) else: timetext = str(int(timemax/60))+":"+str(timemax%60) print("设置文本时间:"+timetext) self.timeon.set(timetext) """打开右键菜单 Args: self: event Returns:None """ def xShowMenu(self,event): print("点击右键了") self.menu.post(event.x_root, event.y_root)#设置右键菜单的初始显示坐标,为鼠标坐标 """窗口变化事件 监听窗口变化,动态改变label文本大小 Args: self: event Returns:None """ def window_resize(self,event): print("窗口变化了") self.update() print(event) if event.width>200: scale_x = event.width/200 scale_y = event.height/150 font_size = 60 if scale_x > scale_y: print(scale_x) font_size = font_size*scale_y else: print(scale_y) font_size = font_size*scale_x print(font_size) self.var.set(font_size) self.label.configure(font=('Arial',self.var.get())) elif event.width<200: scale_x = event.width/200 scale_y = event.height/150 font_size = 60 if scale_x > scale_y: print(scale_x) font_size = font_size*scale_y else: print(scale_y) font_size = font_size*scale_x print(font_size) self.var.set(font_size) self.label.configure(font=('Arial',self.var.get())) else : self.var.set(60) self.label.configure(font=('Arial', self.var.get())) """鼠标左键按下事件 监听鼠标左键点击,设置窗口当前位置和鼠标当前位置 """ def StartMove(self, event): print("开始拖动") print(event) self.x = event.x self.y = event.y self.win_point_x = self.master.winfo_x() self.win_point_y = self.master.winfo_y() """鼠标左键松开事件 松开鼠标左键设置窗口位置 """ def StopMove(self, event): print("停止拖动") print(event) self.master.geometry("+%s+%s" % (event.x-self.x+self.win_point_x, event.y-self.y+self.win_point_y)) self.x = None self.y = None """ 鼠标左键拖动事件 """ def OnMotion(self, event): self.master.geometry("+%s+%s" % (event.x-self.x+self.win_point_x, event.y-self.y+self.win_point_y)) def __init__(self, master=None): Frame.__init__(self, master,width="200",height="100") self.var=IntVar()#定义一个字符串变量 self.var.set(60) self.timeon = StringVar()#定义倒计时文本 self.timeon.set("00:00")#定义倒计时文本 self.timenum = IntVar()#定义倒计时文本 self.timenum.set(0)#定义倒计时文本 master.bind('<Configure>', self.window_resize)#监听窗口变化事件 master.bind("<ButtonPress-1>", self.StartMove)#鼠标左键按下 master.bind("<ButtonRelease-1>", self.StopMove)#鼠标左键松开 master.bind("<B1-Motion>", self.OnMotion)#鼠标左键移动 master.bind("<Button-3>", self.xShowMenu)#监听鼠标右键事件 self.master = master self.pack() self.createWidgets() self.threadstart = False#判断是否有线程已经执行 self.threadstop = False#定义退出线程循环变量 #开始倒计时 #self.duetime()#开始倒计时 root = Tk() root.wm_attributes('-topmost',1)#窗口置顶 # root.overrideredirect(1)#隐藏标题栏 # root.wm_attributes('-fullscreen','true') root.title("运总倒计时工具") root.geometry("200x150+0+0") root.iconbitmap("H:\work\yz\img\logo.ico") app = Application(master=root) app.mainloop()
- THE END -
最后修改:2022年1月19日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.95app.top/python-tkinter%e5%ae%9e%e7%8e%b0%e5%80%92%e8%ae%a1%e6%97%b6/