详解python3 GUI刷屏器(附源码)


Posted in Python onFebruary 18, 2021

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

一.准备工作

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

pip install pynput

安装

二.预览

详解python3 GUI刷屏器(附源码)

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

三.设计流程

详解python3 GUI刷屏器(附源码)

四.源代码

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写了一款刷屏器,能够实现短时间内相同文本的发送,继而实现刷屏的目的。在代码的撰写上,模拟键盘输入主要参考了:

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

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

Python 相关文章推荐
简单介绍Python中的几种数据类型
Jan 02 Python
解决python3在anaconda下安装caffe失败的问题
Jun 15 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
Jun 04 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
Python3.5面向对象编程图文与实例详解
Apr 24 Python
python是否适合网页编程详解
Oct 04 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
Python 读取位于包中的数据文件
Aug 07 Python
python一些性能分析的技巧
Aug 30 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 Python
Django实现聊天机器人
May 31 Python
Django + Taro 前后端分离项目实现企业微信登录功能
Apr 07 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 #Python
Python如何telnet到网络设备
Feb 18 #Python
Python运算符+与+=的方法实例
Feb 18 #Python
python 获取计算机的网卡信息
Feb 18 #Python
python中time tzset()函数实例用法
Feb 18 #Python
python中zip()函数遍历多个列表方法
Feb 18 #Python
python模块内置属性概念及实例
Feb 18 #Python
You might like
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
解析thinkphp基本配置 convention.php
2013/06/18 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
python去除字符串中的换行符
2017/10/11 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
使用python进行拆分大文件的方法
2018/12/10 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
优秀团员个人的自我评价
2013/10/02 职场文书
力学专业毕业生自荐信
2013/11/17 职场文书
单位在职证明范本
2014/01/09 职场文书
道路建设实施方案
2014/03/18 职场文书
出国英文推荐信
2014/05/10 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
2015元旦标语横幅
2014/12/09 职场文书
工作检讨书范文
2015/01/23 职场文书
消防宣传标语大全
2015/08/03 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers