过年GUI博客二连发,本打算出去玩玩,奈何空气,天气实在差,遂使用tkinter开发一款GUI刷屏器,写此博客记录一下我的开发思路。
一.准备工作
本次使用除tkinter库之外还使用了pynput库,可以使用
pip install pynput
安装
二.预览
在长文本框中输入要刷屏的内容,通过设置刷屏频率(单位:秒)即可实现刷屏。
三.设计流程
四.源代码
import re import time import pyperclip from tkinter import * from tkinter import messagebox from tkinter import ttk from pynput.keyboard import Key, Controller import threading from PIL import Image ,ImageTk ''' 难点 按键复用 ''' imgs=["./rely/logo.png",'./rely/favicon.ico'] class App: def __init__(self): self.flag=True self.window = Tk() width = 230 height = 260 screenWidth = self.window.winfo_screenwidth() # 获取显示区域的宽度 screenHeight = self.window.winfo_screenheight() # 获取显示区域的高度 left = (screenWidth - width) / 2 top = (screenHeight - height) / 2 self.window.geometry("%dx%d+%d+%d" % (width, height, left, top)) self.window.title('刷一刷-v1.0') self.window.iconbitmap(imgs[1]) self.window.resizable(0, 0) self.create_widget() self.config_widget() self.place_widget() self.window.mainloop() def create_widget(self): self.paned=PanedWindow(self.window) self.img=imgs photo = Image.open(self.img[0]) # 括号里为需要显示在图形化界面里的图片 photo = photo.resize((150, 50)) # 规定图片大小 self.paned.img = ImageTk.PhotoImage(photo) self.l0 = Label(self.window, image=self.paned.img, justify='center') self.l1 = ttk.Label(self.window, text='内容:') self.l1 = ttk.Label(self.window, text='频率:') self.t1 = Text(self.window) self.c1 = ttk.Combobox(self.window, width=13) self.l2=ttk.Label(self.window,text='秒/次') self.b1 = ttk.Button(self.window, text='开始', ) self.b2 = ttk.Button(self.window, text='退出',) self.m=Menu(self.window) self.window['menu']=self.m self.s1=Menu(self.m,tearoff=False) self.s2=Menu(self.m,tearoff=False) self.s3=Menu(self.m,tearoff=False) def place_widget(self): self.l0.pack() self.l1.place(x=20, y=90) self.t1.place(x=40, y=60, width=150, height=80) self.l1.place(x=20, y=162) self.c1.place(x=65, y=160,width=80) self.l2.place(x=160,y=160) self.b1.place(x=20, y=200) self.b2.place(x=125, y=200) def config_widget(self): self.b1.config(command=lambda: self.thread_it(self.start)) self.b2.config( command=self.window_quit) rate_list=['1','0.1','0.01'] self.c1.config(value=rate_list) self.m.add_cascade(label='文件',menu=self.s1) self.s1.add_command(label='退出',command=self.window_quit) self.m.add_cascade(label='操作',menu=self.s2) self.m.add_cascade(label='关于',menu=self.s3) self.s2.add_command(label='开始 F9',command=lambda: self.thread_it(self.start)) self.s2.add_command(label='停止 F10',command=lambda: self.thread_it(self.start)) self.s3.add_command(label='说明',command=self.show_infos) #设置热键 self.window.bind('<F9>',lambda: self.thread_it(self.pre_start)) self.window.bind('<F10>',lambda: self.thread_it(self.pre_start)) self.window.bind('<Escape>',self.escape) self.window.bind('<FocusIn>',self.clear_content) self.window.protocol('WM_DELETE_WINDOW',self.window_quit) def clear_content(self,event): self.t1.delete(0.0,END) def pre_start(self,event): self.start() def start(self): if self.b1['text']=='开始': self.flag=True t1_content = self.t1.get(1.0, 'end').strip() if len(t1_content) != 0: gap = self.c1.get() try: if re.match('(^0|^1)\.{0,1}\d+$', gap) or int(gap) > 0: # 将t1内容复制到剪切板 pyperclip.copy(t1_content) keyboard = Controller() self.b1.config(text='停止') self.t1.config(state='disable') while True: # 使用control+v组合键进行粘贴 if self.flag: keyboard.press(Key.ctrl.value) keyboard.press('v') keyboard.release('v') keyboard.release(Key.ctrl.value) keyboard.press(Key.enter.value) keyboard.release(Key.enter.value) print(t1_content) time.sleep(float(gap)) else: break else: messagebox.showerror('错误', '请输入正确的数值!') self.c1.delete(0, END) except ValueError: messagebox.showerror('错误', '请输入正确的数值!') self.c1.delete(0, END) else: messagebox.showerror('错误', '还没有输入内容') else: self.flag=False self.b1.config(text='开始') def thread_it(self,func,*args): t=threading.Thread(target=func,args=args) t.setDaemon(True)#设置守护线程,即主线程结束,子线程也结束 t.start() def show_infos(self): messagebox.showinfo('说明','***本软件完全免费***\n\n1.输入刷屏内容\n2.选择(输入)刷屏频率\n3.开始(F9)刷屏\n4.停止(F10)刷屏') def window_quit(self): ret=messagebox.askyesno('退出','是否要退出?') if ret: self.window.destroy() def escape(self,event): self.window_quit() if __name__ == '__main__': a=App()
五.总结
本次使用tkinter写了一款刷屏器,能够实现短时间内相同文本的发送,继而实现刷屏的目的。在代码的撰写上,模拟键盘输入主要参考了:
python模拟鼠标点击和键盘输入的操作
实现了组合键Ctrl+V的操作。本篇技术含量不多,重点在代码逻辑思路上。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月16日
2024年11月16日
- 第五街的士高《印度激情版》3CD [WAV+CUE][2.4G]
- 三国志8重制版哪个武将智力高 三国志8重制版智力武将排行一览
- 三国志8重制版哪个武将好 三国志8重制版武将排行一览
- 三国志8重制版武将图像怎么保存 三国志8重制版武将图像设置方法
- 何方.1990-我不是那种人【林杰唱片】【WAV+CUE】
- 张惠妹.1999-妹力新世纪2CD【丰华】【WAV+CUE】
- 邓丽欣.2006-FANTASY【金牌大风】【WAV+CUE】
- 饭制《黑神话》蜘蛛四妹手办
- 《燕云十六声》回应跑路:年内公测版本完成95%
- 网友发现国内版《双城之战》第二季有删减:亲亲环节没了!
- 邓丽君2024-《漫步人生路》头版限量编号MQA-UHQCD[WAV+CUE]
- SergeProkofievplaysProkofiev[Dutton][FLAC+CUE]
- 永恒英文金曲精选4《TheBestOfEverlastingFavouritesVol.4》[WAV+CUE]
- 群星《国风超有戏 第9期》[320K/MP3][13.63MB]
- 群星《国风超有戏 第9期》[FLAC/分轨][72.56MB]