经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
详解python3 GUI刷屏器(附源码)
来源:jb51  时间:2021/2/18 14:48:59  对本文有异议

过年GUI博客二连发,本打算出去玩玩,奈何空气,天气实在差,遂使用tkinter开发一款GUI刷屏器,写此博客记录一下我的开发思路。

一.准备工作

本次使用除tkinter库之外还使用了pynput库,可以使用

  1. pip install pynput

安装

二.预览

在这里插入图片描述

在长文本框中输入要刷屏的内容,通过设置刷屏频率(单位:秒)即可实现刷屏。

三.设计流程

在这里插入图片描述

四.源代码

  1. import re
  2. import time
  3. import pyperclip
  4. from tkinter import *
  5. from tkinter import messagebox
  6. from tkinter import ttk
  7. from pynput.keyboard import Key, Controller
  8. import threading
  9. from PIL import Image ,ImageTk
  10.  
  11. '''
  12. 难点
  13. 按键复用
  14. '''
  15.  
  16. imgs=["./rely/logo.png",'./rely/favicon.ico']
  17. class App:
  18. def __init__(self):
  19. self.flag=True
  20. self.window = Tk()
  21. width = 230
  22. height = 260
  23. screenWidth = self.window.winfo_screenwidth() # 获取显示区域的宽度
  24. screenHeight = self.window.winfo_screenheight() # 获取显示区域的高度
  25. left = (screenWidth - width) / 2
  26. top = (screenHeight - height) / 2
  27. self.window.geometry("%dx%d+%d+%d" % (width, height, left, top))
  28. self.window.title('刷一刷-v1.0')
  29. self.window.iconbitmap(imgs[1])
  30. self.window.resizable(0, 0)
  31. self.create_widget()
  32. self.config_widget()
  33. self.place_widget()
  34. self.window.mainloop()
  35.  
  36. def create_widget(self):
  37. self.paned=PanedWindow(self.window)
  38. self.img=imgs
  39. photo = Image.open(self.img[0]) # 括号里为需要显示在图形化界面里的图片
  40. photo = photo.resize((150, 50)) # 规定图片大小
  41. self.paned.img = ImageTk.PhotoImage(photo)
  42. self.l0 = Label(self.window, image=self.paned.img, justify='center')
  43. self.l1 = ttk.Label(self.window, text='内容:')
  44. self.l1 = ttk.Label(self.window, text='频率:')
  45. self.t1 = Text(self.window)
  46. self.c1 = ttk.Combobox(self.window, width=13)
  47. self.l2=ttk.Label(self.window,text='秒/次')
  48. self.b1 = ttk.Button(self.window, text='开始', )
  49. self.b2 = ttk.Button(self.window, text='退出',)
  50. self.m=Menu(self.window)
  51. self.window['menu']=self.m
  52. self.s1=Menu(self.m,tearoff=False)
  53. self.s2=Menu(self.m,tearoff=False)
  54. self.s3=Menu(self.m,tearoff=False)
  55.  
  56. def place_widget(self):
  57. self.l0.pack()
  58. self.l1.place(x=20, y=90)
  59. self.t1.place(x=40, y=60, width=150, height=80)
  60. self.l1.place(x=20, y=162)
  61. self.c1.place(x=65, y=160,width=80)
  62. self.l2.place(x=160,y=160)
  63. self.b1.place(x=20, y=200)
  64. self.b2.place(x=125, y=200)
  65.  
  66. def config_widget(self):
  67. self.b1.config(command=lambda: self.thread_it(self.start))
  68. self.b2.config( command=self.window_quit)
  69. rate_list=['1','0.1','0.01']
  70. self.c1.config(value=rate_list)
  71. self.m.add_cascade(label='文件',menu=self.s1)
  72. self.s1.add_command(label='退出',command=self.window_quit)
  73. self.m.add_cascade(label='操作',menu=self.s2)
  74. self.m.add_cascade(label='关于',menu=self.s3)
  75. self.s2.add_command(label='开始 F9',command=lambda: self.thread_it(self.start))
  76. self.s2.add_command(label='停止 F10',command=lambda: self.thread_it(self.start))
  77. self.s3.add_command(label='说明',command=self.show_infos)
  78. #设置热键
  79. self.window.bind('<F9>',lambda: self.thread_it(self.pre_start))
  80. self.window.bind('<F10>',lambda: self.thread_it(self.pre_start))
  81. self.window.bind('<Escape>',self.escape)
  82. self.window.bind('<FocusIn>',self.clear_content)
  83. self.window.protocol('WM_DELETE_WINDOW',self.window_quit)
  84.  
  85. def clear_content(self,event):
  86. self.t1.delete(0.0,END)
  87.  
  88. def pre_start(self,event):
  89. self.start()
  90.  
  91. def start(self):
  92. if self.b1['text']=='开始':
  93. self.flag=True
  94. t1_content = self.t1.get(1.0, 'end').strip()
  95. if len(t1_content) != 0:
  96. gap = self.c1.get()
  97. try:
  98. if re.match('(^0|^1)\.{0,1}\d+$', gap) or int(gap) > 0:
  99. # 将t1内容复制到剪切板
  100. pyperclip.copy(t1_content)
  101. keyboard = Controller()
  102. self.b1.config(text='停止')
  103. self.t1.config(state='disable')
  104. while True:
  105. # 使用control+v组合键进行粘贴
  106. if self.flag:
  107. keyboard.press(Key.ctrl.value)
  108. keyboard.press('v')
  109. keyboard.release('v')
  110. keyboard.release(Key.ctrl.value)
  111. keyboard.press(Key.enter.value)
  112. keyboard.release(Key.enter.value)
  113. print(t1_content)
  114. time.sleep(float(gap))
  115. else:
  116. break
  117. else:
  118. messagebox.showerror('错误', '请输入正确的数值!')
  119. self.c1.delete(0, END)
  120. except ValueError:
  121. messagebox.showerror('错误', '请输入正确的数值!')
  122. self.c1.delete(0, END)
  123. else:
  124. messagebox.showerror('错误', '还没有输入内容')
  125. else:
  126. self.flag=False
  127. self.b1.config(text='开始')
  128.  
  129. def thread_it(self,func,*args):
  130. t=threading.Thread(target=func,args=args)
  131. t.setDaemon(True)#设置守护线程,即主线程结束,子线程也结束
  132. t.start()
  133.  
  134. def show_infos(self):
  135. messagebox.showinfo('说明','***本软件完全免费***\n\n1.输入刷屏内容\n2.选择(输入)刷屏频率\n3.开始(F9)刷屏\n4.停止(F10)刷屏')
  136.  
  137. def window_quit(self):
  138. ret=messagebox.askyesno('退出','是否要退出?')
  139. if ret:
  140. self.window.destroy()
  141.  
  142. def escape(self,event):
  143. self.window_quit()
  144.  
  145.  
  146. if __name__ == '__main__':
  147. a=App()

五.总结

本次使用tkinter写了一款刷屏器,能够实现短时间内相同文本的发送,继而实现刷屏的目的。在代码的撰写上,模拟键盘输入主要参考了:

python模拟鼠标点击和键盘输入的操作

实现了组合键Ctrl+V的操作。本篇技术含量不多,重点在代码逻辑思路上。

到此这篇关于python3 GUI刷屏器(附源码)的文章就介绍到这了,更多相关python刷屏器内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号