详解python3 GUI刷屏器(附源码)
作者:懷淰メ 发布时间:2022-02-02 12:34:15
标签:python,GUI,刷屏器
过年GUI博客二连发,本打算出去玩玩,奈何空气,天气实在差,遂使用tkinter开发一款GUI刷屏器,写此博客记录一下我的开发思路。
一.准备工作
本次使用除tkinter库之外还使用了pynput库,可以使用
pip install pynput
安装
二.预览
在长文本框中输入要刷屏的内容,通过设置刷屏频率(单位:秒)即可实现刷屏。
三.设计流程
四.源代码
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
0
投稿
猜你喜欢
- 目录实践步骤完整代码参考实践步骤1.寻找合适的Python库(安装是否麻烦、使用是否简便、执行会不会太久)moviepy 音视频库。分析需要
- 本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义,
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 日志文件一般是按天产生,则通过在程序中判断文件的产生日期与当前时间,更换监控的日志文件程序只是简单的示例一下,监控test1.log 10秒
- 本文实例讲述了Python实现螺旋矩阵的填充算法。分享给大家供大家参考,具体如下:afanty的分析:关于矩阵(二维数组)填充问题自己动手推
- 目录1. 最直观的相加2. 借助 itertools3. 使用 * 解包4. 使用 extend5. 使用列表推导式6. 使用 heapq7
- 如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一
- 1. 资料1) Protobuf 开发文档https://protobuf.dev/2) protobuf安装指南https://grpc.
- 用python SSH模块登录,并在远程机执行shell命令(在CentOS 7 环境试验成功, Redhat 系列应该是兼容的。)先安装必
- 一提起Google的产品,大多数人可能都会想到用一个词来形容,“简洁”。简单得来又实用,这就是Google的产品设计方针了。Jon Wile
- 1、集合相加a = {1,2,3}b = {3,4,5}print(type(a))print(a|b)2、queryset 符合条件的筛序
- 主旨在日常工作中,我们会经常且频繁的使用excel表格,那么我们是否可以通过python来操作excel表格,让其自动化的来代替我们的工作呢
- 本文实例讲述了Python3将jpg转为pdf文件的方法。分享给大家供大家参考,具体如下:#coding=utf-8#!/usr/bin/e
- 实现一个简单地httpServer上一篇文章对http库的基本使用做了说明,下面来实现一个简单地httpServerpackage main
- 在http规则中用404来表示某个页面不能访问,一般来说,网站的404错误页面都是IIS或APACHE默认的页面,千篇一律,非常单调。由于可
- 说明:原来安装的python为64位,故安装的pyinstaller和打包后的exe都为64位。而64位的exe文件在32位的win7操作系
- 如果你过分信任 Access 2000数据库的密码保护,你可能会因此而蒙受损失。这是因为Access 2000的数据库级密码并不安全,相反它
- 1. 条形图的绘制plt.bar 方法有以下常用参数:x :一个数组或者列表,代表需要绘制的条形图的x轴的坐标点。height :一个数组或
- pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称。这样内部数据抽取既可以用
- 条形图是用宽度相同的条形的高度或长短来表示数据多少的图形。用来绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差异。绘制一个简单的