当前位置: 首页 > news >正文

使用python编写工具:快速生成chrome插件相关文件结构

本文将详细分析一段用 wxPython 编写的 Python 应用程序代码。该程序允许用户创建一些特定文件并将它们保存在指定的文件夹中,同时也能够启动 Google Chrome 浏览器并打开扩展页面,自动执行一些操作。
C:\pythoncode\new\crxiterationtaburl.py

全部代码

import wx
import os
import json
import subprocess
import time
import pyautogui
import pyperclipclass MyApp(wx.App):def OnInit(self):self.frame = MyFrame()self.frame.Show()return Trueclass MyFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='File Creator', size=(850, 1600))panel = wx.Panel(self)# 创建四个文本框self.memo1 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER, size=(300, 250))self.memo2 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER, size=(300, 250))self.memo3 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER, size=(300, 250))self.memo4 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER, size=(300, 250))# Add labels with file nameslabel1 = wx.StaticText(panel, label='manifest.json:')label2 = wx.StaticText(panel, label='background.js:')label3 = wx.StaticText(panel, label='popup.html:')label4 = wx.StaticText(panel, label='popup.js:')# 创建按钮self.create_button = wx.Button(panel, label='创建')self.open_button = wx.Button(panel, label='打开')# 布局# Layoutvbox = wx.BoxSizer(wx.VERTICAL)vbox.Add(label1, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.memo1, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(label2, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.memo2, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(label3, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.memo3, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(label4, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.memo4, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.create_button, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.open_button, flag=wx.EXPAND | wx.ALL, border=10)panel.SetSizer(vbox)# 绑定事件self.create_button.Bind(wx.EVT_BUTTON, self.on_create)self.open_button.Bind(wx.EVT_BUTTON, self.on_open)self.target_folder = ''# 文件夹选择对话框with wx.DirDialog(self, "选择目标文件夹") as dlg:if dlg.ShowModal() == wx.ID_OK:self.target_folder = dlg.GetPath()def on_create(self, event):if not self.target_folder:wx.MessageBox("请先选择目标文件夹", "错误", wx.OK | wx.ICON_ERROR)return# 创建images文件夹images_folder = os.path.join(self.target_folder, "images")os.makedirs(images_folder, exist_ok=True)# 保存内容到文件with open(os.path.join(images_folder, "manifest.json"), 'w') as f:json.dump(self.memo1.GetValue(), f)with open(os.path.join(images_folder, "background.js"), 'w') as f:f.write(self.memo2.GetValue())with open(os.path.join(images_folder, "popup.html"), 'w') as f:f.write(self.memo3.GetValue())with open(os.path.join(images_folder, "popup.js"), 'w') as f:f.write(self.memo4.GetValue())wx.MessageBox("文件已保存", "成功", wx.OK | wx.ICON_INFORMATION)def on_open(self, event):url = "chrome://extensions/"# Copy the URL to the clipboardpyperclip.copy(url)chrome_path = "C:/Program Files/Google/Chrome/Application/chrome.exe"  # 请根据实际路径修改subprocess.Popen([chrome_path, "chrome://extensions/"])        time.sleep(2)  # 等待Chrome启动# 发送Ctrl+Shift+Ipyautogui.hotkey('ctrl', 'shift', 'i')if __name__ == '__main__':app = MyApp()app.MainLoop()
1. 程序结构概述

这段代码定义了一个 MyApp 类作为 wxPython 应用的入口,继承自 wx.App 类。MyFrame 类继承自 wx.Frame 类,用于创建界面。程序包括文本框、按钮、文件夹选择功能以及一些自动化操作。我们一一进行详细分析。

2. 导入所需模块
import wx
import os
import json
import subprocess
import time
import pyautogui
import pyperclip
  • wx:wxPython 是一个常用于创建图形用户界面(GUI)的库,本代码利用它创建应用程序窗口、按钮、文本框等控件。
  • os:用于与操作系统交互,如创建文件夹和路径操作。
  • json:用于读写 JSON 格式的文件。
  • subprocess:用于启动外部应用程序,这里用来启动 Chrome 浏览器。
  • time:用于延时操作。
  • pyautogui:一个自动化工具库,模拟键盘和鼠标事件,这里用来模拟快捷键操作。
  • pyperclip:用于剪贴板操作,本代码用来复制 Chrome 扩展页面 URL。
3. 创建应用程序框架
class MyApp(wx.App):def OnInit(self):self.frame = MyFrame()self.frame.Show()return True
  • MyApp 类继承自 wx.App,是整个应用程序的核心类。
  • OnInit 方法在应用初始化时被调用,创建并显示 MyFrame 窗口。
4. 创建主窗口 MyFrame
class MyFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='File Creator', size=(850, 1600))panel = wx.Panel(self)
  • MyFrame 类继承自 wx.Frame,代表了应用程序的主窗口。
  • super().__init__(parent=None, title='File Creator', size=(850, 1600)):初始化父类 wx.Frame,并设置窗口的标题和大小。
  • panel = wx.Panel(self):在窗口内添加一个面板,用来包含其他控件。
5. 添加控件
        self.memo1 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER, size=(300, 250))self.memo2 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER, size=(300, 250))self.memo3 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER, size=(300, 250))self.memo4 = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER, size=(300, 250))
  • 这四个 TextCtrl 控件分别用于输入四种类型的文本内容(JSON、JS、HTML)。
  • wx.TE_MULTILINE 使得文本框支持多行文本,wx.TE_PROCESS_ENTER 使得用户可以按 Enter 键处理输入。
        label1 = wx.StaticText(panel, label='manifest.json:')label2 = wx.StaticText(panel, label='background.js:')label3 = wx.StaticText(panel, label='popup.html:')label4 = wx.StaticText(panel, label='popup.js:')
  • 这些标签控件用于标识每个文本框的内容。
        self.create_button = wx.Button(panel, label='创建')self.open_button = wx.Button(panel, label='打开')
  • create_button 按钮用于创建文件,open_button 按钮用于打开 Chrome 扩展页面。
6. 布局管理
        vbox = wx.BoxSizer(wx.VERTICAL)vbox.Add(label1, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.memo1, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(label2, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.memo2, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(label3, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.memo3, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(label4, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.memo4, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.create_button, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.open_button, flag=wx.EXPAND | wx.ALL, border=10)
  • 使用 wx.BoxSizer 来管理布局,vbox 采用垂直排列方式(wx.VERTICAL)。
  • 每个控件之间加入适当的间距(border=10)。
7. 文件夹选择对话框
        self.target_folder = ''with wx.DirDialog(self, "选择目标文件夹") as dlg:if dlg.ShowModal() == wx.ID_OK:self.target_folder = dlg.GetPath()
  • 通过 wx.DirDialog 弹出文件夹选择对话框,允许用户选择一个目标文件夹。选择后的路径保存在 self.target_folder 中。
8. 文件创建操作
    def on_create(self, event):if not self.target_folder:wx.MessageBox("请先选择目标文件夹", "错误", wx.OK | wx.ICON_ERROR)return
  • on_create 方法会在用户点击“创建”按钮时被触发。首先检查是否选择了目标文件夹。
        images_folder = os.path.join(self.target_folder, "images")os.makedirs(images_folder, exist_ok=True)
  • 在目标文件夹下创建 images 文件夹(如果不存在的话)。
        with open(os.path.join(images_folder, "manifest.json"), 'w') as f:json.dump(self.memo1.GetValue(), f)with open(os.path.join(images_folder, "background.js"), 'w') as f:f.write(self.memo2.GetValue())with open(os.path.join(images_folder, "popup.html"), 'w') as f:f.write(self.memo3.GetValue())with open(os.path.join(images_folder, "popup.js"), 'w') as f:f.write(self.memo4.GetValue())
  • 将文本框中的内容保存为相应文件,分别保存为 manifest.jsonbackground.jspopup.htmlpopup.js
        wx.MessageBox("文件已保存", "成功", wx.OK | wx.ICON_INFORMATION)
  • 保存成功后弹出提示框。
9. 打开扩展页面并自动执行操作
    def on_open(self, event):url = "chrome://extensions/"pyperclip.copy(url)chrome_path = "C:/Program Files/Google/Chrome/Application/chrome.exe"subprocess.Popen([chrome_path, "chrome://extensions/"])        time.sleep(2)pyautogui.hotkey('ctrl', 'shift', 'i')
  • on_open 方法中,程序将打开 Chrome 浏览器的扩展页面,并模拟快捷键 Ctrl+Shift+I 打开开发者工具。这些操作通过 pyperclip(复制 URL)、subprocess(启动 Chrome)、pyautogui(模拟快捷键)完成。

运行结果

在这里插入图片描述

10. 总结

这段代码展示了如何使用 wxPython 创建一个简单的应用程序,完成以下功能:

  1. 创建指定格式的文件(如 manifest.jsonbackground.js)。
  2. 启动 Chrome 浏览器并打开扩展页面。
  3. 通过模拟键盘操作,自动化执行一些开发者工具的操作。

此应用程序展示了如何将文件操作、UI 设计和自动化脚本结合起来,构建一个具有实用功能的工具。如果你正在开发类似的应用程序,这段代码为你提供了一个很好的起点。

相关文章:

使用python编写工具:快速生成chrome插件相关文件结构

本文将详细分析一段用 wxPython 编写的 Python 应用程序代码。该程序允许用户创建一些特定文件并将它们保存在指定的文件夹中,同时也能够启动 Google Chrome 浏览器并打开扩展页面,自动执行一些操作。 C:\pythoncode\new\crxiterationtaburl.py 全部代码…...

内存、显存和GPU在Transformer架构中承担什么计算任务

目录 内存、显存和GPU在Transformer架构中承担什么计算任务 一、内存、显存和GPU的区别 二、在Transformer架构中的计算任务 内存、显存和GPU在Transformer架构中承担什么计算任务 是计算机系统中重要的组成部分,它们在Transformer架构中承担着不同的计算任务。以下是对这…...

【计算机网络】TCP协议特点3

心跳机制 什么是心跳机制 心跳机制是在计算机系统、网络通信和许多其他技术领域广泛应用的一种机制,用于检测两个实体之间的连接是否仍然活跃,或者设备是否还在正常运行。就是每隔一段时间发送一个固定的消息给服务端,服务端回复一个固定…...

移植LVGL8.2以及移植过程的理解

一、LVGL刷新显示(画点 OR 区域刷新颜色) 原来LCD的区域填充,由于没用到DMA就是普通的遍历区域块的坐标,需要传入的坐标就是显示区域的x轴起始与x轴尾部。y轴的起始与y轴的尾部。 怎么实现呢? SPI不加DMA实现区域填充…...

动态规划-背包问题——1049.最后一块石头的重量II

1.题目解析 题目来源 1049.最后一块石头的重量II——力扣 测试用例 2.算法原理 首先需要将该问题转化为0-1背包问题后再做分析 1.状态表示 根据数学中的知识我们知道将一个数字分为两个子数后求这两个子数的最小差值,那么就要求这两个子数尽可能接近于原数字的一…...

【C++学习(37)】并发性模式:如生产者-消费者、读写锁等。 架构模式:如MVC、MVVM等。属于23 种设计模式吗? RAII 的关系?

并发性模式(如生产者-消费者、读写锁等)和架构模式(如 MVC、MVVM 等)并不属于 Gang of Four(GoF) 提出的 23 种经典设计模式 中。这些模式是其他领域中的设计模式,虽然它们和 GoF 的设计模式有交集,尤其是在程序架构和资源管理方面,但并不直接包含在 GoF 的 23 种设计…...

[Mysql] Mysql的多表查询----多表关系(下)

4、操作 方式二&#xff1a;创建表之后设置外键约束 外键约束也可以在修改表时添加&#xff0c;但是添加外键约束的前提是&#xff1a;从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。 语法&#xff1a; alter table <从表名> add constr…...

命名空间(namespace)详解(一)

域 在学习命名空间之前&#xff0c;我们首先要了解几种常见的域 一、域的种类 1、类作用域 类作用域是指定义在类内部的成员&#xff08;包括数据成员和成员函数&#xff09;的可见性和访问权限的范围 代码示例&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1#include &…...

HarmonyOS ArkTs 解决流式传输编码问题

工作日志 日期&#xff1a;2024-11-15 标题&#xff1a;HarmonyOS ArkTs 解决流式传输编码问题 问题描述 问题&#xff1a;在处理流式数据的 HTTP 请求时&#xff0c;服务器返回的数据存在编码问题&#xff0c;导致数据无法正确地解码为字符串。部分数据在解码后出现了乱码…...

NPOI 实现Excel模板导出

记录一下使用NPOI实现定制的Excel导出模板&#xff0c;已下实现需求及主要逻辑 所需Json数据 对应参数 List<PurQuoteExportDataCrInput> listData [{"ItemName": "电缆VV3*162*10","Spec": "电缆VV3*162*10","Uom":…...

【OpenGL】OpenGL简介

文章目录 OpenGL概述OpenGL的本质OpenGL相关库核心库窗口管理glutfreeglutglfw 函数加载glewGLAD OpenGL概述 OpenGL(Open Graphics Library) 严格来说&#xff0c;本身并不是一个API&#xff0c;它是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了…...

shell命令笔记

一、shell基本基础知识 1. shell命令中捕获上一个命令执行是否成功&#xff0c;通过判断 $? 是否为0&#xff0c;为0则表示成功&#xff0c;其他错误码则表示执行失败。 2. sheel命令中&#xff0c;变量赋值时默认都是字符串类型。赋值时须注意单引号与双引号的区别&#xf…...

qml显示OpenCV mat图片

文章目录 方式一QQuickPaintedItem 类介绍主要特点使用方法示例代码在 QML 中使用主要方法和属性注意事项编写OpenCV mat显示代码方式二本篇博客介绍在Qt6.5.3 qml项目里介绍如何显示OpenCV mat图片。视频:https://edu.csdn.net/learn/40003/654043?spm=3001.4143 在qml里显示…...

类与对象(2)---类的6个默认成员函数

1.类的6个默认成员函数 任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为默认成员函数。 2.构造函数 2.1构造函数特性 构造函数的主要任务是初始化对象。 它有如下特…...

华为云租户网络-用的是隧道技术

1.验证租户网络是vxlan 2.验证用OVS 2.1控制节点VXLAN 本端ip&#xff08;local ip&#xff09;192.168.31.8 2.2计算节点VXLAN 本端ip&#xff08;local ip&#xff09;192.168.31.11 计算节点用的是bond0做隧道网络 2.3查看bond文件是否主备模式...

手搓神经网络(MLP)解决MNIST手写数字识别问题 | 数学推导+代码实现 | 仅用numpy,tensor和torch基本计算 | 含正反向传播数学推导

手写数字识别&#xff08;神经网络入门&#xff09; 文章目录 手写数字识别&#xff08;神经网络入门&#xff09;实验概述实验过程数据准备模型实现线性变换层前向传播反向传播更新参数整体实现 激活函数层&#xff08;ReLU&#xff09;前向传播反向传播整体实现 Softmax层&am…...

esp32c3安装micropython环境

esp32c3竟然支持micropython环境&#xff0c;真的太让人高兴了。主要是python开发比较友好&#xff0c;开发速度要快于C和C&#xff0c; 可以用来快速创意验证。 下载 首先到官网&#xff1a;MicroPython - Python for microcontrollers 点击“download”进入下载页面&#…...

ES6的Iterator 和 for...of 循环

写在前面 在JavaScript中&#xff0c;Iterator&#xff08;遍历器&#xff09;是一种接口&#xff0c;用于遍历数据结构&#xff08;如数组、对象等&#xff09;中的元素。它提供了一种统一的方式来访问集合中的每个项&#xff0c;包括值和位置。 默认 Iterator 接口 许多内…...

《C语言程序设计现代方法》note-4 基本类型 强制类型转换 类型定义

文章目录 助记提要7章 基本类型7.1 整数类型有符号整数和无符号整数整数类型的说明符整数类型的范围整型常量整数溢出读/写整数 7.2 浮点类型浮点数的范围浮点常量读/写浮点数 7.3 字符类型字符被当做整数来操作转义序列大小写转换scanf和printf读/写字符getchar和putchar读写字…...

MySQL(4)【数据类型 —— 数值类型】

阅读导航 引言一、数据类型分类二、数值类型取值范围三、tinyint 类型1. &#x1f4bb;数值越界测试⭕有符号案例⭕无符号案例 四、bit 类型1. 基本语法2. 使用示例✅创建表并插入数据✅使用 BIT 存储多个设置✅查询和格式化 BIT 数据✅更新 BIT 数据 五、小数类型1. float&…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...