初版预览版编译发布

This commit is contained in:
shileiye 2021-12-28 04:10:48 +08:00
parent 2415730c0a
commit 2ba3c70991
8 changed files with 375 additions and 43 deletions

View File

@ -4,10 +4,10 @@ now_ip = 192.168.0.186
new_ip = 192.168.0.186
file_encoding = utf-8
dir = D:\LYserver\
server_path = ${GAME:dir}server\
web_path = ${GAME:dir}web\
client_path = ${GAME:dir}client\
tool_path = ${GAME:dir}tool\
server_path = ${dir}server\
web_path = ${dir}web\
client_path = ${dir}client\
tool_path = ${dir}tool\
[GAME_PATH]
path01 = ${GAME:server_path}Common\AMServer\x64\AMServer64_R.exe
@ -42,16 +42,17 @@ path12 = ${GAME:web_path}args_ios.php
path13 = ${GAME:web_path}api\notice.php
[GAME_DATA_SQL]
sql1 = sql
game_ip = UPDATE `gameback`.`bg_server` SET `server_ip` = '${GAME:now_ip}' WHERE `id` IN (1,2)
game_name = UPDATE `gameback`.`bg_server` SET `name` = REPLACE(`name`,'${GAME:game_name}','${GAME:game_name}_new') WHERE `name` LIKE '%${GAME:game_name}%';
[WEB]
domain_name = localhost
web_port = 82
gm_url = ${domain_name}:${web_port}/gm
gm_url = http://${domain_name}:${web_port}/gm
gm_code = 123456
gm_user = test
gm_pass = test
game_back = ${domain_name}:${web_port}/gameback
game_back = http://${domain_name}:${web_port}/gameback
game_code = 123456
game_user = test
game_pass = test
@ -92,15 +93,6 @@ heidisql_path = ${GAME:tool_path}HeidiSQL\heidisql.exe
notepad3_path = ${GAME:tool_path}Notepad3\Notepad3.exe
composer_path = ${GAME:tool_path}Composer\
[SERVER_PATH]
php_path = ${GAME:tool_path}php\php5.6.9nts\
php_spawner_path = ${GAME:tool_path}php-cgi-spawner\
php_cgi_port = 9001
nginx_path = ${GAME:tool_path}Nginx1.15.11\
mysql_path = ${GAME:tool_path}MySQL5.7.26\
game_path = ${GAME:server_path}Common\AMServer\x64\AMServer64_R.exe|${GAME:server_path}Common\LocalLogServer\x64\LocalLogServer64_R.exe|${GAME:server_path}Common\LoggerServer\x64\LoggerServer64_R.exe|${GAME:server_path}Common\SessionServer\x64\SessionServer64_R.exe|${GAME:server_path}Common\NameServer\x64\NameServer64_R.exe|${GAME:server_path}Common\BackStageServer\x64\BackStageServer64_R.exe,10|${GAME:server_path}Server\DBServer\x64\DBServer64_R.exe|${GAME:server_path}Server\GateServer\x64\GateServer64_R.exe|${GAME:server_path}Server\LogicServer\x64\LogicServerCQ64_R.exe|${GAME:server_path}Server2\DBServer\x64\DBServer64_R.exe|${GAME:server_path}Server2\GateServer\x64\GateServer64_R.exe|${GAME:server_path}Server2\LogicServer\x64\LogicServerCQ64_R.exe|${GAME:server_path}Server跨服\DBServer\x64\DBServer64_R.exe|${GAME:server_path}Server跨服\GateServer\x64\GateServer64_R.exe|${GAME:server_path}Server跨服\LogicServer\x64\LogicServerCQ64_R.exe
mod_file_path = ${GAME:dir}测试1.txt|${GAME:dir}测试2.txt|${CLIENT_PATH:android_path}assets\data\scripts\platform\platform_adapter.lua|${CLIENT_PATH:android_path}assets\data\scripts\platform\windows\platform_adapter.lua|${GAME:server_path}server\LogicServer\crossserver.txt|${GAME:server_path}server\DBServer\crossserver.txt|${GAME:server_path}server2\LogicServer\crossserver.txt|${GAME:server_path}server2\DBServer\crossserver.txt|${GAME:server_path}server跨服\LogicServer\crossserver.txt|${GAME:server_path}server跨服\DBServer\crossserver.txt|${GAME:web_path}args.php|${GAME:web_path}args_ios.php|${GAME:web_path}api\notice.php
[OTHER]
about = shileiye
email = shileiye@qq.com

99
dist/config.ini vendored Normal file
View File

@ -0,0 +1,99 @@
[GAME]
game_name = 幽冥传奇
now_ip = 192.168.0.186
new_ip = 192.168.0.186
file_encoding = utf-8
dir = D:\LYserver\
server_path = ${dir}server\
web_path = ${dir}web\
client_path = ${dir}client\
tool_path = ${dir}tool\
[GAME_PATH]
path01 = ${GAME:server_path}Common\AMServer\x64\AMServer64_R.exe
path02 = ${GAME:server_path}Common\LocalLogServer\x64\LocalLogServer64_R.exe
path03 = ${GAME:server_path}Common\LoggerServer\x64\LoggerServer64_R.exe
path04 = ${GAME:server_path}Common\SessionServer\x64\SessionServer64_R.exe
path05 = ${GAME:server_path}Common\NameServer\x64\NameServer64_R.exe
path06 = ${GAME:server_path}Common\BackStageServer\x64\BackStageServer64_R.exe,10
path07 = ${GAME:server_path}Server\DBServer\x64\DBServer64_R.exe
path08 = ${GAME:server_path}Server\GateServer\x64\GateServer64_R.exe
path09 = ${GAME:server_path}Server\LogicServer\x64\LogicServerCQ64_R.exe
path10 = ${GAME:server_path}Server2\DBServer\x64\DBServer64_R.exe
path11 = ${GAME:server_path}Server2\GateServer\x64\GateServer64_R.exe
path12 = ${GAME:server_path}Server2\LogicServer\x64\LogicServerCQ64_R.exe
path13 = ${GAME:server_path}Server跨服\DBServer\x64\DBServer64_R.exe
path14 = ${GAME:server_path}Server跨服\GateServer\x64\GateServer64_R.exe
path15 = ${GAME:server_path}Server跨服\LogicServer\x64\LogicServerCQ64_R.exe
[GAME_FILE_PATH]
path01 = ${GAME:dir}测试1.txt
path02 = ${GAME:dir}测试2.txt
path03 = ${ANDROID:android_name_file}assets\data\scripts\platform\platform_adapter.lua
path04 = ${ANDROID:android_name_file}assets\data\scripts\platform\windows\platform_adapter.lua
path05 = ${GAME:server_path}server\LogicServer\crossserver.txt
path06 = ${GAME:server_path}server\DBServer\crossserver.txt
path07 = ${GAME:server_path}server2\LogicServer\crossserver.txt
path08 = ${GAME:server_path}server2\DBServer\crossserver.txt
path09 = ${GAME:server_path}server跨服\LogicServer\crossserver.txt
path10 = ${GAME:server_path}server跨服\DBServer\crossserver.txt
path11 = ${GAME:web_path}args.php
path12 = ${GAME:web_path}args_ios.php
path13 = ${GAME:web_path}api\notice.php
[GAME_DATA_SQL]
game_ip = UPDATE `gameback`.`bg_server` SET `server_ip` = '${GAME:now_ip}' WHERE `id` IN (1,2)
game_name = UPDATE `gameback`.`bg_server` SET `name` = REPLACE(`name`,'${GAME:game_name}','${GAME:game_name}_new') WHERE `name` LIKE '%${GAME:game_name}%';
[WEB]
domain_name = localhost
web_port = 82
gm_url = http://${domain_name}:${web_port}/gm
gm_code = 123456
gm_user = test
gm_pass = test
game_back = http://${domain_name}:${web_port}/gameback
game_code = 123456
game_user = test
game_pass = test
[NGINX]
nginx_path = ${GAME:tool_path}Nginx1.15.11\
[PHP]
php_path = ${GAME:tool_path}php\php5.6.9nts\
php_spawner_path = ${GAME:tool_path}php-cgi-spawner\
php_cgi_port = 9001
[MYSQL]
mysql_path = ${GAME:tool_path}MySQL5.7.26\
mysql_host = 127.0.0.1
mysql_port = 3306
mysql_user = cq_dba
mysql_pass = 123456abc
[ANDROID]
android_path = ${GAME:client_path}apk\
android_name = ${android_path}game.apk
android_name_file = ${android_path}game\
tmp_android_name = ${android_path}game_tmp.apk
new_android_name = ${android_path}game_signed.apk
[pc]
pc_path = ${GAME:client_path}pc\
pc_name = ${pc_path}pc\bin.exe
[ios]
ios_path = ${GAME:client_path}ios\
ios_name = ${android_path}game.ipa
[TOOL_PATH]
apktool_path = ${GAME:tool_path}apktool\
heidisql_path = ${GAME:tool_path}HeidiSQL\heidisql.exe
notepad3_path = ${GAME:tool_path}Notepad3\Notepad3.exe
composer_path = ${GAME:tool_path}Composer\
[OTHER]
about = shileiye
email = shileiye@qq.com

BIN
dist/main.exe vendored Normal file

Binary file not shown.

134
main.py
View File

@ -10,6 +10,7 @@ import time
from subprocess import Popen
import sys
import pymysql
from PyQt5.QtCore import pyqtSignal, QThread
from PyQt5.QtGui import QTextCursor
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
@ -43,6 +44,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.newIpInput.setText(config['GAME']['new_ip'])
self.nowGameLabel.setText(config['GAME']['game_name'])
self.newGameInput.setText(config['GAME']['game_name'])
# 设置按钮状态
if isinstance(checkprocess("nginx.exe"), int):
self.nginxButton.setText("关闭Nginx")
else:
@ -63,22 +66,47 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# print(key, values)
# print(config.items("GAME_FILE_PATH"))
# return
# for key, value in config.items('GAME_FILE_PATH'):
# print(key, value)
# return
message = QMessageBox.information(self, "提示信息", "确定要保存设置吗?", QMessageBox.Ok | QMessageBox.No, QMessageBox.No)
if message == QMessageBox.No:
return
# 取值
now_ip = config['GAME']['now_ip']
new_ip = self.newIpInput.text()
now_game = config['GAME']['game_name']
new_game = self.newGameInput.text()
compile_ip = re.compile('^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$')
# 验证IP地址格式
if (new_ip == "") or new_game == "" or not (compile_ip.match(new_ip)):
QMessageBox.information(self, "提示信息", "IP地址、游戏名称为空或有误请正确填写IPv4地址或游戏名称!")
return
dirname = config['GAME_FILE_PATH'].items()
# 处理SQL语句
sql_game_ip = config['GAME_DATA_SQL']['game_ip'].replace(now_ip, new_ip)
sql_game_name = config['GAME_DATA_SQL']['game_name'].replace(now_game + '_new', new_game)
sqls = [sql_game_ip, sql_game_name]
# 判断MYSQL是否启动
if isinstance(checkprocess("mysqld.exe"), int):
mysql_run(sqls)
else:
message = QMessageBox.information(self, "提示信息", "MYSQL尚未启动数据库相关脚本无法执行是否现在启动MYSQL", QMessageBox.Ok | QMessageBox.No, QMessageBox.Ok)
if message == QMessageBox.Ok:
self.mysql(self.mysqlButton) # 触发MYSQL启动按钮
sum = 0
# 以0.5秒的频次检测MYSQL是否启动超过20次则超时
while not isinstance(checkprocess("mysqld.exe"), int):
if sum > 20:
QMessageBox.information(self, "提示信息", "MYSQL启动失败请重新尝试")
return
time.sleep(0.5)
sum = sum + 1
mysql_run(sqls)
else:
return
# 配置文件处理
sum = 0
for key, value in config.items('GAME_FILE_PATH'):
print(key, value)
@ -111,14 +139,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
saveconfig = open(configFile, 'wt', encoding=config['GAME']['file_encoding'])
config.write(saveconfig) # 把要修改的节点的内容写到文件中
saveconfig.close()
# 设置界面显示
# 设置按钮文字变化
self.nowGameLabel.setText(new_game)
self.nowIpLabel.setText(new_ip)
# 成功提示
QMessageBox.information(self, "提示信息", "配置保存成功!重启游戏后生效!<br>游戏名称:" + new_game + "----游戏IP" + new_ip + "<br>共配置了" + str(sum) + "个文件")
print('修改完成:' + new_game + ':' + new_ip)
return
# TODO 待完成数据库配置修改
def nginx(self, event):
if self.nginxButton.text() == '启动Nginx':
@ -174,34 +202,47 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def game(self, event):
if self.gameButton.text() == '启动游戏':
# TODO 更改配置文件格式
game_path = config['GAME_PATH']['game_path'].split("|")
# 遍历字典列表
for f in game_path:
print(f)
# 执行文本替换
if len(f.split(",")) < 2:
# 读取游戏启动路径
for key, value in config.items('GAME_PATH'):
print(key, value)
# 处理启动时间
if len(value.split(",")) < 2:
sleeptime = 0
else:
sleeptime = float(f.split(",")[1])
game_file = f.split(",")[0]
sleeptime = float(value.split(",")[1])
game_file = value.split(",")[0]
try:
Popen('start ' + game_file,
shell=True,
# cwd=values,
# encoding='utf-8'
)
time.sleep(float(sleeptime)) # 延迟时间
time.sleep(float(sleeptime)) # 延迟启动时间
except:
QMessageBox.information(self, "提示信息", "启动“" + game_file + "”出错,可能文件不存在或配置不对!")
return
self.gameButton.setText("关闭游戏")
else:
Popen(
'taskkill /f /t /im LocalLogServer64_R.exe & taskkill /f /t /im LoggerServer64_R.exe & taskkill /f /t /im SessionServer64_R.exe & taskkill /f /t /im NameServer64_R.exe & taskkill /f /t /im LogicServerCQ64_R.exe & taskkill /f /t /im GateServer64_R.exe & taskkill /f /t /im DBCenterServer64_R.exe & taskkill /f /t /im DBServer64_R.exe & taskkill /f /t /im BackStageServer64_R.exe & taskkill /f /t /im AMServer64_R.exe',
shell=True,
# encoding='utf-8'
)
# 读取游戏启动路径
for key, value in config.items('GAME_PATH'):
print(key, value)
# 获取进程名称并结束进程
game_file = value.split(",")[0].split("\\")
game_file = game_file[len(game_file) - 1]
try:
Popen(
'taskkill /f /t /im ' + game_file,
shell=True,
# encoding='utf-8'
)
except:
QMessageBox.information(self, "提示信息", "关闭游戏进程:“" + game_file + "”出错!")
return
# Popen(
# 'taskkill /f /t /im LocalLogServer64_R.exe & taskkill /f /t /im LoggerServer64_R.exe & taskkill /f /t /im SessionServer64_R.exe & taskkill /f /t /im NameServer64_R.exe & taskkill /f /t /im LogicServerCQ64_R.exe & taskkill /f /t /im GateServer64_R.exe & taskkill /f /t /im DBCenterServer64_R.exe & taskkill /f /t /im DBServer64_R.exe & taskkill /f /t /im BackStageServer64_R.exe & taskkill /f /t /im AMServer64_R.exe',
# shell=True,
# # encoding='utf-8'
# )
self.gameButton.setText("启动游戏")
print('启动游戏,按钮被单击')
@ -238,6 +279,25 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.add_cmd_msg(cmd, cwd, title, obj, path, code)
print('APK签名,按钮被单击')
def heidisql(self, event):
cmd = 'start "" ' + config['TOOL_PATH']['heidisql_path']
Popen(cmd,
shell=True,
# cwd=config['MYSQL']['mysql_path'] + 'bin',
# encoding='utf-8'
)
print('heidisql,按钮被单击')
def gmurl(self, event):
cmd = 'start ' + config['WEB']['gm_url']
Popen(cmd,
shell=True,
# cwd=config['MYSQL']['mysql_path'] + 'bin',
# encoding='utf-8'
)
print('gmurl,按钮被单击')
#TODO 增加自动登录GM后台功能
# 利用新线程进行脚本执行回显
def add_cmd_msg(self, cmd, cwd="", title="", obj="", path="", code="utf8"):
obj.setEnabled(False)
@ -291,6 +351,34 @@ class Thread(QThread):
startfile(self.path)
# MYSQL操作函数
def mysql_run(sqls, table=""):
print(sqls)
# 打开数据库连接
db = pymysql.connect(host=config['MYSQL']['mysql_host'],
user=config['MYSQL']['mysql_user'],
password=config['MYSQL']['mysql_pass'],
database=table,
port=int(config['MYSQL']['mysql_port'])
)
# 使用cursor()方法获取操作游标
cursor = db.cursor()
for sql in sqls:
try:
# 执行SQL语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
print('更新成功')
except:
print('出错了')
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
db.close()
print('MySql执行完毕')
# 进程判断返回进程ID
def checkprocess(processname):
pl = psutil.pids()
@ -299,7 +387,7 @@ def checkprocess(processname):
return pid
# 打开文件或文件夹
# 打开文件或文件夹,并且选中文件
def startfile(filename):
try:
os.startfile(f'explorer /select, "{pathlib.Path(filename)}')

40
main.spec Normal file
View File

@ -0,0 +1,40 @@
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['D:\\soft\\Python\\Python39\\Lib\\site-packages', 'D:\\soft\\Python\\Python39\\Lib', 'D:\\soft\\Python\\Python39\\Lib\\site-packages\\PyQt5\\Qt\\bin', 'D:\\Code\\python\\onekey\\venv\\Lib\\site-packages', ''],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )

View File

@ -16,6 +16,9 @@ class Ui_MainWindow(object):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(560, 530)
MainWindow.setMouseTracking(False)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/icon/src/icon/dengdai.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
@ -81,6 +84,12 @@ class Ui_MainWindow(object):
self.qianmingButton = QtWidgets.QPushButton(self.groupBox_3)
self.qianmingButton.setGeometry(QtCore.QRect(190, 20, 80, 45))
self.qianmingButton.setObjectName("qianmingButton")
self.heidisqlButton = QtWidgets.QPushButton(self.groupBox_3)
self.heidisqlButton.setGeometry(QtCore.QRect(280, 20, 80, 45))
self.heidisqlButton.setObjectName("heidisqlButton")
self.gmurlButton = QtWidgets.QPushButton(self.groupBox_3)
self.gmurlButton.setGeometry(QtCore.QRect(370, 20, 80, 45))
self.gmurlButton.setObjectName("gmurlButton")
self.CMDtextEdit = QtWidgets.QTextEdit(self.centralwidget)
self.CMDtextEdit.setGeometry(QtCore.QRect(20, 320, 521, 180))
self.CMDtextEdit.setStyleSheet("background-color: rgb(0, 0, 0);\n"
@ -99,13 +108,15 @@ class Ui_MainWindow(object):
self.mysqlButton.clicked.connect(MainWindow.mysql)
self.gameButton.clicked.connect(MainWindow.game)
self.fanbianyiButton.clicked.connect(MainWindow.fanbianyi)
self.heidisqlButton.clicked.connect(MainWindow.heidisql)
self.newIpInput.returnPressed.connect(self.saveSetButton.click)
self.newGameInput.returnPressed.connect(self.saveSetButton.click)
self.gmurlButton.clicked.connect(MainWindow.gmurl)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "通用游戏部署工具 v1.0 By:shileiye"))
MainWindow.setWindowTitle(_translate("MainWindow", "牛叉游戏部署工具 v1.0 By:shileiye"))
self.groupBox.setTitle(_translate("MainWindow", "基本设置"))
self.saveSetButton.setText(_translate("MainWindow", "保存"))
self.newGameInput.setPlaceholderText(_translate("MainWindow", "输入新名称"))
@ -124,6 +135,8 @@ class Ui_MainWindow(object):
self.fanbianyiButton.setText(_translate("MainWindow", "反编译APK"))
self.shengchengButton.setText(_translate("MainWindow", "生成APK"))
self.qianmingButton.setText(_translate("MainWindow", "APK签名"))
self.heidisqlButton.setText(_translate("MainWindow", "HeidiSQL"))
self.gmurlButton.setText(_translate("MainWindow", "GM后台"))
self.CMDtextEdit.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"

View File

@ -14,7 +14,11 @@
<bool>false</bool>
</property>
<property name="windowTitle">
<string>通用游戏部署工具 v1.0 By:shileiye</string>
<string>牛叉游戏部署工具 v1.0 By:shileiye</string>
</property>
<property name="windowIcon">
<iconset resource="icon.qrc">
<normaloff>:/icon/src/icon/dengdai.svg</normaloff>:/icon/src/icon/dengdai.svg</iconset>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QGroupBox" name="groupBox">
@ -277,6 +281,32 @@
<string>APK签名</string>
</property>
</widget>
<widget class="QPushButton" name="heidisqlButton">
<property name="geometry">
<rect>
<x>280</x>
<y>20</y>
<width>80</width>
<height>45</height>
</rect>
</property>
<property name="text">
<string>HeidiSQL</string>
</property>
</widget>
<widget class="QPushButton" name="gmurlButton">
<property name="geometry">
<rect>
<x>370</x>
<y>20</y>
<width>80</width>
<height>45</height>
</rect>
</property>
<property name="text">
<string>GM后台</string>
</property>
</widget>
</widget>
<widget class="QTextEdit" name="CMDtextEdit">
<property name="geometry">
@ -418,5 +448,69 @@ p, li { white-space: pre-wrap; }
</hint>
</hints>
</connection>
<connection>
<sender>heidisqlButton</sender>
<signal>clicked()</signal>
<receiver>MainWindow</receiver>
<slot>lower()</slot>
<hints>
<hint type="sourcelabel">
<x>339</x>
<y>262</y>
</hint>
<hint type="destinationlabel">
<x>279</x>
<y>264</y>
</hint>
</hints>
</connection>
<connection>
<sender>newIpInput</sender>
<signal>returnPressed()</signal>
<receiver>saveSetButton</receiver>
<slot>click()</slot>
<hints>
<hint type="sourcelabel">
<x>349</x>
<y>89</y>
</hint>
<hint type="destinationlabel">
<x>477</x>
<y>75</y>
</hint>
</hints>
</connection>
<connection>
<sender>newGameInput</sender>
<signal>returnPressed()</signal>
<receiver>saveSetButton</receiver>
<slot>click()</slot>
<hints>
<hint type="sourcelabel">
<x>149</x>
<y>89</y>
</hint>
<hint type="destinationlabel">
<x>477</x>
<y>75</y>
</hint>
</hints>
</connection>
<connection>
<sender>gmurlButton</sender>
<signal>clicked()</signal>
<receiver>MainWindow</receiver>
<slot>lower()</slot>
<hints>
<hint type="sourcelabel">
<x>429</x>
<y>262</y>
</hint>
<hint type="destinationlabel">
<x>279</x>
<y>264</y>
</hint>
</hints>
</connection>
</connections>
</ui>

6
readme.md Normal file
View File

@ -0,0 +1,6 @@
## 牛叉游戏部署工具
### 打包命令
```python
pyinstaller -F -w -p D:\soft\Python\Python39\Lib\site-packages;D:\soft\Python\Python39\Lib;D:\soft\Python\Python39\Lib\site-packages\PyQt5\Qt\bin;D:\Code\python\onekey\venv\Lib\site-packages; main.py
```