刚刚写了python调用c文件,干脆就再补一篇前几天忘写了(打游戏没空写)的如何生成exe吧
事件起因:某晚与小贱鸡在ow自定义房间中酣战时,找到一个天使答题房,在房中屡战屡败,一气之下拖出地图工坊代码,在编辑器中打开搜索题目并寻找答案,格式大概是这样的:
创建HUD文本(所有玩家(所有队伍), 自定义字符串("漫威现在进行到第几阶段了?", 无, 无, 无), 无, 无, 顶部, 0, 黄色, 黄色, 黄色, 可见和字符串, 默认可见度);
创建地图文本(所有玩家(所有队伍), 自定义字符串("第三阶段", 无, 无, 无), 数组中的值(全局变量(I), 1), 2, 不要截取, 可见,位置和字符串, 白色, 默认可见度);
创建地图文本(所有玩家(所有队伍), 自定义字符串("第四阶段", 无, 无, 无), 数组中的值(全局变量(I), 2), 2, 不要截取, 可见,位置和字符串, 白色, 默认可见度);
创建地图文本(所有玩家(所有队伍), 自定义字符串("第五阶段", 无, 无, 无), 数组中的值(全局变量(I), 3), 2, 不要截取, 可见,位置和字符串, 白色, 默认可见度);
创建地图文本(所有玩家(所有队伍), 自定义字符串("第二阶段", 无, 无, 无), 数组中的值(全局变量(I), 4), 2, 不要截取, 可见,位置和字符串, 白色, 默认可见度);
设置全局变量(O, 数组中的值(全局变量(I), 2));
中止;
最后的那个2,代表第二行中选项是正确的(即为第四阶段)
但很快,我发现一个问题,这个答题时间只有15s,而我搜索之后再寻找答案的过程就要花掉一半以上的时间,再算上切屏或者打错字,根本来不及操控游戏角色走到正确答案的框内,于是心生一计:用python去找
查找逻辑很简单,代码先贴下:
def search(words): try: tk = open(path, 'r', encoding='UTF-8') except FileNotFoundError: return '找不到文件\n'+path work_list = tk.readlines() tk.close() result_list = [] result_str = '' for i, l in enumerate(work_list): result = re.findall(words, l) check = re.findall('HUD', l) #如果答案中有此关键字会崩溃,防一下 if result and check: try: correct_index = int(work_list[i+5][-5]) except ValueError: return '这个关键字好像在非问题中出现了呢\n差点导致程序崩溃\n还好我早就料到了,防止了程序崩溃' result_list.append(pattern.findall(work_list[i+correct_index])[0]) if len(result_list) == 0: return '找不到此关键词' else: for item in result_list: result_str += item + '\n' return result_str
那么,怎么做出exe窗体呢?这时候要用到qt creator(正好上学期上linux实验课用到过)
- 先在软件中新建一个文件,选择模板为“文件和类->Qt->Qt设计师界面类”,随后设计界面
- cmd到ui目录下,
pyuic5 -o destination.py source.ui
,生成py文件 - 对此py添加一些必须的库文件(如
from PyQt5 import QtCore, QtGui, QtWidgets
),然后就不要动它了 - 打开一个新的.py文件作为主文件,并引用窗体py文件
- 在主文件中调用class MyDialog(QDialog, Ui_dialog)来实现一些窗体交互(文本输入,按键点击,窗口关闭,窗体显示名字设置……)
- 使用以下代码来完成窗口显示
def dialog_show(): app = QApplication(sys.argv) main = MyDialog() main.show() sys.exit(app.exec_())
我的这个程序逻辑即为:打开同文件夹下的tk.txt文件并读取内容,随后接收输入的关键字并进行搜索,将搜索结果返回到窗体中。经vscode内试验无误后开始打包为exe文件
在打包时,使用了pyinstaller,需先进行安装,然后pyinstaller -F -w main.py
,其中-F表示打包成一个exe文件(否则会出现一个exe文件和一个文件夹,文件夹内存放了大量需要调用的dll文件,但运行速度会比单exe快);-w表示不需要命令行窗口;若想改变exe图标,可加入-i参数
打包成功后本机测试通过,将exe发送到另一台(打游戏专用)电脑上,运行发现点击查询后闪退。然后这个坑浪费了我数小时,中间各种试图修复艰辛之路按下不表,讲讲最终找到的原因
在vscode中运行程序时,打开文件路径为'tk.txt'时,python会读取当前路径,找到同级目录下的tk.txt文件,但当它打包时,就变得不一样了:这个相对路径是相对于打包时py所处的文件路径,而非程序运行时所处的exe路径!
解决方案:path = os.path.dirname(os.path.realpath(sys.executable)).replace('\\', '/')+'/tk.txt'
最后程序成功运行,我成了天使答题房霸主级存在(逃