详解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 相关文章推荐
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
Python时间模块datetime、time、calendar的使用方法
Jan 13 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
python基于json文件实现的gearman任务自动重启代码实例
Aug 13 Python
python 并发编程 阻塞IO模型原理解析
Aug 20 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
python matplotlib折线图样式实现过程
Nov 04 Python
python的等深分箱实例
Nov 22 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 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 class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
PHP多维数组排序array详解
2017/11/21 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
动态调用CSS文件的JS代码
2010/07/29 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
Python绘制3D图形
2018/05/03 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
解决Python一行输出不显示的问题
2018/12/03 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
彻底理解Python中的yield关键字
2019/04/01 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
什么是规则表达式
2012/05/03 面试题
简单叙述一下MYSQL的优化
2016/05/09 面试题
旅游管理本科生求职信
2013/10/14 职场文书
高三家长寄语
2014/04/03 职场文书
父亲去世追悼词
2015/06/23 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android