个人需求
用python编写一个GUI程序,在电脑上运行,功能是输入一个apk文件,修改版本号之后输出给我。
就这么简单,我还没展开,展开就是:
选择apk文件 – 解析apk – 修改apktool.yml文件中的versionCode和versionName – 构建新的apk – 签名apk
因为个人并不熟悉python,所以这个需求我委托了ChatGPT兄弟帮我搞搞
实现功能
下面是一些对话:
这是完整代码,大家也可以试试:
python
import tkinter as tk
from tkinter import filedialog
import os
import shutil
import xml.etree.ElementTree as ET# 导入 APK 文件
def import_apk():global apk_pathapk_path = filedialog.askopenfilename()apk_label.config(text=apk_path)# 修改 APK 文件版本号
def modify_apk():# 获取输入和输出文件路径input_path = apk_pathoutput_path = os.path.splitext(input_path)[0] + '_modified.apk'# 使用 apktool 工具反编译 APK 文件os.system('apktool d -f "{}"'.format(input_path))# 修改版本号manifest_path = os.path.join(os.path.splitext(input_path)[0], 'AndroidManifest.xml')tree = ET.parse(manifest_path)root = tree.getroot()version_code = root.get('versionCode')version_name = root.get('versionName')version_code = int(version_code) + 1 # 将版本号 +1version_name = version_name + '.1' # 在版本名称后面添加 .1root.set('versionCode', str(version_code))root.set('versionName', version_name)tree.write(manifest_path)# 使用 apktool 工具重新打包 APK 文件os.system('apktool b -f "{0}" -o "{1}"'.format(os.path.splitext(input_path)[0], output_path))# 删除反编译文件夹shutil.rmtree(os.path.splitext(input_path)[0])# 更新输出文件标签output_label.config(text=output_path)# 创建主窗口
root = tk.Tk()
root.title('APK 版本号修改工具')# 创建 APK 文件选择按钮和标签
apk_button = tk.Button(root, text='选择 APK 文件', command=import_apk)
apk_button.pack(pady=10)
apk_label = tk.Label(root, text='请选择 APK 文件')
apk_label.pack()# 创建修改按钮和标签
modify_button = tk.Button(root, text='修改 APK 文件版本号', command=modify_apk)
modify_button.pack(pady=10)
output_label = tk.Label(root, text='输出文件路径')
output_label.pack()# 进入主循环
root.mainloop()
复制粘贴,启动!
还真的是有模有样,选择apk文件后点击“修改APK文件版本号”按钮,程序会去解析apk文件并且修改AndroidManifest.xml的版本号,使其版本号自动+1。
不出意外,就要出意外了,首先是解析apk后输出路径output_path的问题,是在当前python文件目录下,也就是说在修改AndroidManifest的时候,如果apk文件并不跟python文件在同一路径下,就会报错:
FileNotFoundError: [Errno 2] No such file or directory: 'F:/apk\\AndroidManifest.xml'
将路径改对后发现,apk解析后版本号并不能再AndroidManifest上查看,只有Android旧版本可以做到,现在新版本的Android apk兼容高版本的安卓代码(具体可以参考:Manifest中找不到versionCode? ),这个版本信息就不能再AndroidManifest.xml中获取了,更别说修改了。
搞反编译有经验的我马上就知道需要修改的文件是apktool.yml,马上嘟嘟嘟写好了。
上面的案例可以看出来,chatGPT帮我搭了个样板,编程的逻辑和思路都没错,只是可能有一些需要修改的,总而言之,目的达到了,这对之前对于python编程经验几乎为0的我来说很不错了,框架其实就已经写好了,后面只是在这个框架上修改东西,新增功能就好了。
另外,我还让他(chatGPT)帮我调节了样式,例如宽高尺寸,显示居中等…
有个很有意思的地方,我把提问里的“居中”写成“举重”了哈哈哈哈,然后这是他的回答:
代码在这,要看也可以看下:
python
import tkinter as tk# 创建主窗口
root = tk.Tk()
root.title('举重计算器')# 设置 GUI 界面大小为屏幕宽度和高度的三分之一
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
gui_width = screen_width // 3
gui_height = screen_height // 3
root.geometry('{}x{}'.format(gui_width, gui_height))# 定义默认的举重数值
default_weight = 50# 创建体重输入框和标签
weight_label = tk.Label(root, text='体重(kg):')
weight_label.pack()
weight_var = tk.StringVar(value=default_weight)
weight_entry = tk.Entry(root, textvariable=weight_var)
weight_entry.pack()# 创建重量输入框和标签
lift_label = tk.Label(root, text='举重(kg):')
lift_label.pack()
lift_var = tk.StringVar(value=default_weight)
lift_entry = tk.Entry(root, textvariable=lift_var)
lift_entry.pack()# 创建计算按钮和标签
calculate_button = tk.Button(root, text='计算')
calculate_button.pack(pady=10)
result_label = tk.Label(root, text='结果:')
result_label.pack()# 进入主循环
root.mainloop()
还蛮认真的咧~
还有一个事情也比较有趣,我在让他帮我设计一个Loading窗口时,出现了一个报错,我把报错贴出来问他,哈哈居然先跟我道歉了:
有些提供的修改方案有时候还是会有新的报错,持续抛给他让他解决,大概率是可以完成你的需求的。
使用总结
在使用ChatGPT编程过程中,有好的体验也有比较不好的体验,例如有个问题但是得不到好的回答,有些需求可能没那么容易实现,或者难以描述清楚具体的需求等…但!总得来说好的体验更多,ChatGPT给我的正反馈是很足的,让我这个刚接触py语言的人来说,节省了很多的学习成本。
效果展示
最后 这是我最终靠ChatGPT实现的一个python GUI程序: