python3GUI--刷屏器(附源码)


过年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的操作。本篇技术含量不多,重点在代码逻辑思路上。
思路、代码方面有什么不足欢迎各位大佬指正、批评!在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/a1397852386/article/details/113806309
今日推荐