详解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入门篇之文件
Oct 20 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
python3 kmp 字符串匹配的方法
Jul 07 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
Python 转换文本编码实现解析
Aug 27 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 Python
使用python实现飞机大战游戏
Mar 23 Python
django前端页面下拉选择框默认值设置方式
Aug 09 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
html静态页面调用php文件的方法
2014/11/13 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
jquery插件格式实例分析
2016/06/16 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
Vue的Options用法说明
2020/08/14 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
Windows下搭建python开发环境详细步骤
2020/07/20 Python
python用户管理系统的实例讲解
2017/12/23 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
自考毕业自我鉴定范文
2013/10/27 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
2014年学生工作总结
2014/11/20 职场文书
同学聚会通知短信
2015/04/20 职场文书
Redis性能监控的实现
2021/07/09 Redis