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

作者:懷淰メ 时间:2022-02-02 12:34:15 

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

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

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

来源:https://blog.csdn.net/a1397852386/article/details/113806309

标签:python,GUI,刷屏器
0
投稿

猜你喜欢

  • dataframe 按条件替换某一列中的值方法

    2021-06-16 00:23:33
  • Keras之fit_generator与train_on_batch用法

    2021-07-10 18:19:31
  • asp base64加解密函数代码

    2011-03-31 11:02:00
  • flask框架自定义过滤器示例【markdown文件读取和展示功能】

    2023-03-07 19:22:27
  • MySQL中InnoDB的间隙锁问题

    2024-01-25 11:13:58
  • python+excel接口自动化获取token并作为请求参数进行传参操作

    2022-05-19 04:10:18
  • pycharm中显示CSS提示的知识点总结

    2023-11-02 02:56:00
  • vbScript on error resume next容错使用心得

    2010-06-26 19:28:00
  • PHP 获取远程网页内容的代码(fopen,curl已测)

    2024-05-05 09:17:59
  • web开发以HTML为中心

    2008-02-13 08:14:00
  • CentOS7.5 安装 Mysql8.0.19的教程图文详解

    2024-01-13 07:28:26
  • python 服务器批处理得到PSSM矩阵的问题

    2021-05-19 12:21:13
  • 浅谈Selenium+Webdriver 常用的元素定位方式

    2022-04-17 23:14:43
  • Mysql 原生语句中save or update 的写法汇总

    2024-01-13 15:08:52
  • Python3爬虫中识别图形验证码的实例讲解

    2022-10-17 17:11:20
  • 基于go-cqhttp与Flask搭建定制机器人项目实战示例

    2024-04-26 17:30:32
  • Python文件名的匹配之clob库

    2022-11-17 06:59:46
  • Pygame Font模块使用教程

    2021-06-17 15:23:44
  • ES6/JavaScript使用技巧分享

    2024-04-30 10:10:04
  • Python爬取三国演义的实现方法

    2022-12-11 20:07:37
  • asp之家 网络编程 m.aspxhome.com