python生成图形化exe程序

刚刚写了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实验课用到过)

  1. 先在软件中新建一个文件,选择模板为“文件和类->Qt->Qt设计师界面类”,随后设计界面
  2. cmd到ui目录下,pyuic5 -o destination.py source.ui,生成py文件
  3. 对此py添加一些必须的库文件(如from PyQt5 import QtCore, QtGui, QtWidgets),然后就不要动它了
  4. 打开一个新的.py文件作为主文件,并引用窗体py文件
  5. 在主文件中调用class MyDialog(QDialog, Ui_dialog)来实现一些窗体交互(文本输入,按键点击,窗口关闭,窗体显示名字设置……)
  6. 使用以下代码来完成窗口显示
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'

最后程序成功运行,我成了天使答题房霸主级存在(逃

文件下载地址(两个py+一个exe)

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注