Godot(4.X): 外接Python处理Excel数据: 账号管理系统实现
前言: 本文是Godot通过 外接Python脚本处理Excel数据 实现的账号管理系统,Godot 游戏内使用 AutoLoad 实现全局账号管理,对接外部Python脚本。
本文包括子文章,除了 Godot 实现的代码外,将会有较多篇幅解释Python处理Excel表格的代码。此外,在阅读本文章前,请了解 Godot全局AutoLoad。
这里给出 AutoLoad全局编辑器操作 的解释:
Godot(2D)架构细分4:编辑器全局设置解释-CSDN博客
注意: 由于解释文章过长,这里将会给出总篇章,同时将给出子文章作为补充解释,文章链接将会在文末给出。
本文中由于 Python 脚本已经对接Godot,规定了Python和Godot之间的传参格式,同时保留了Python中总调试开关,所以演示会同时演示Python和Godot两边的输出,且Godot中处理方式将会在后续文章中补充。
同时本文给出的 Python 代码中,除了对Excel的处理,还会带有未使用但是用于优化的Excel统一打开类,Excel转化Json供Godot获取玩家数据的处理函数
本文作为总文章,首先会给出开源地址以及实际演示效果,完整代码解析将会放于文末逐渐补全。
1. Godot外接Python数据处理Excel概述
1. 综合讨论与概述
Godot 实现外接 Python 处理 Excel 表格,是因为想要实现 可视化数据更改 提升存储数据容量 方便信息维护。从读取速度来讲,Godot原生支持的直接读写格式如 Resource二进制格式,JSON格式,CSV格式 等的文件读写速度远高于 Excel 文件,但是由于 Excel 表格数据的
操作方式较多,在合理数据量下一般不会造成严重卡顿 ,数据类型丰富且结构稳定,支持库多
而且对于人来讲信息清晰,容易读懂修改,所以用来存储大量 非即时 数据例如账号,大小较大的多人存档等信息而言,是一个不错的选择
Godot 原生库里并没有直接支持Excel读写的类或者功能,所以使用外接Python脚本的方式来处理Excel数据。这里通过使用Godot中OS类连接Python脚本,OS类是Godot中提供对常见操作系统访问功能的类,封装了与主机操作系统通信的最常见功能,这里就是使用了 Os.execute() 向操作系统申请一个新进程,然后使用这个进程运行Python脚本同时获得返回值
这种处理方式除了本文即将演示实现的Godot账号管理系统外,还可以处理玩家存档信息等其他类似的数据,本质来说,就是处理完后向Godot返回自己规定的返回值,比如是或否,用来实现逻辑判断,以及处理成Godot可以直接处理的文件格式比如Json来间接实现Excel存储
本操作系统为Windows10 22H2
2. 实际实现流程概述
1. 完成Python基本功能实现:Excel统一读取,Excel格式化为字典类型,新数据写入Excel,登录数据校验,注册数据校验等基本功能
2. 规定Godot与Python固定传参流程与内容,修改Python中已经完成的基本功能返回值
3. 临时完成Godot与Python传参测试,固定传参流程
4. 完成Godot中登录系统AutoLoad中的主要子管理器逻辑,完成并测试与Python的正式传输流程是否正确完成,完成并固定Python中与Godot交互的主脚本的逻辑函数
5. 完成Godot中主管理器的API开放,完成对子管理器的调控,检查并删除外置所有暴露的AutoLoad变量
完成以上流程后就是Godot内其他逻辑比如登录界面的具体实现的问题了,本文也会演示。
2. Godot外接Python处理Excel总体演示
本文Python处理Excel使用的库为 openpyxl 库
详细演示以及处理Excel流程将会在后续文章中演示,这里都先演示主程序。
这里先给出Python文件结构

1. Python程序对接(主程序)
Python处理Excel,按照特定格式返回Godot,后面会解释如何在Godot和Python之间传输消息,这里先都先单独演示单独的脚本或者程序代码
Python与Godot对接主程序,将所有基础功能整合成 登录验证 与 注册验证,且返回值全部定为字符串类型的数字例如 "0", "1","2"。
这里规定: "0" : 验证通过,"1" : 校验信息问题(比如账号不存在,注册密码长度不够),"2" : 账号密码匹配问题(密码错误,已被注册)
主代码如下
#=================openpyxl库================#
# 本文用来处理Excel的python的库 #
#===========================================#
from openpyxl.worksheet.worksheet import Worksheet
# 以下为子Python脚本引入的处理函数(这里简要解释)
from ExcelProcessing import read_from_excel # 返回指定的Excel工作表
from ExcelProcessing import write_new_account # 向Excel写入新账号信息,返回 tuple[bool, int] 元组
from JsonProcessing import convert_excel_to_account # 将Excel中读取的数据转化为固定字典格式 {"ID": [password, name]}
from JsonProcessing import detect_login_information # 校验登录信息,返回 tuple[bool, int] 元组
# Optional 为类型注解标记,可以用于规定函数传参传限定类型内的参数如 Optional[int | str] 指参数可以传入 int,str,None类型的
from typing import Optional
# 这个是Python用来接收系统传参的类,其中 sys.argv 为收到的参数
import sys
import os
#=============默认存档名============#
default_save_exc_name = "GameDataExcel.xlsx" # 手动调用脚本时的Excel路径
default_exc_data_player = "PlayerData" # 默认取打开Excel中的工作表的名字为 PlayerData
default_json_out = "PlayerGameData.json" # 存档转化出的Json位置
#=============默认存档名============#
#=============指定参数==============# # 这里所有的位置都是Godot中传来参数中对应参数的索引
default_order_index: int = 2 # 这里是默认从godot获得的参数中取第2位为指令参数
default_excel_path_index: int = 1 # 默认Excel位置
default_order_name_index: int = 3 # 默认名字位置
default_order_pwd_index: int = 4 # 默认密码位置
default_godot_argv_len: int = 5 # 默认传参长度
#=============指定参数==============#
#=============指定命令==============#
godot_login: str = "0" # 指定Godot登录命令为 "0"
godot_register: str = "1" # 指定Godot注册命令为 "1"
#=============指定命令==============#
"""
以下所有函数面向Godot返回
此时Python中print的内容就是Godot接收到的返回值+-
全部使用print
"""
"""
返回值说明:
- 元组第1位:是否校验通过(True=通过,False=不通过)
- 元组第2位:状态码
- 0 : 账号验证通过
- 1 : 账户信息不存在
- 2 : 账号信息验证错误(信息不全/密码错误)
"""
# 登录验证器
def login_verify(input_login_info: Optional[list[str]]) -> None:
if input_login_info is None:
return None
try:
# 得到账户表格
read_sheet = read_from_excel(default_save_exc_name, default_exc_data_player)
stored_info_dict = convert_excel_to_account(read_sheet)
# 验证登录信息
verify_result: tuple = detect_login_information(stored_info_dict, input_login_info)
# 通过验证
print(str(verify_result[1]))
except Exception as e:
# 登录程序运行失败
print("-1")
"""
账户注册处理
返回-1: 程序运行出错
返回0 : 注册成功
返回1 : 账户注册出现问题(非法字符/账户密码问题)
返回2 : 账户已被注册
"""
# 注册验证器
def register_verify(input_register_info: Optional[list[str]]) -> None:
if input_register_info is None:
return None
try:
# 验证注册信息并写入
verify_result: tuple = write_new_account(default_exc_data_player,
default_save_exc_name,
input_register_info)
print(str(verify_result[1]))
except Exception as e:
# 注册程序运行失败
print("-1")
"""
返回 -1 为程序运行出错
返回 -2 为程序输入变量不足
"""
# 主函数进入
if __name__ == "__main__":
if len(sys.argv) >= default_godot_argv_len:
# 将Godot传参转至本地
receive_params: list[str] = sys.argv
godot_order = receive_params[default_order_index]
# 格式化传参内容
default_save_exc_name = receive_params[default_excel_path_index] # 获得收到的Excel地址
input_name = receive_params[default_order_name_index] # 获得收到的账号ID
input_pwd = receive_params[default_order_pwd_index] # 获得收到的密码
input_info: list[str] = [input_name, input_pwd]
# 登录注册验证请求
if (godot_order == godot_login):
login_verify(input_info)
if (godot_order == godot_register):
register_verify(input_info)
# 参数不够传 -2
else:
print("-2")
2. Godot对接主程序
先给出Godot本项目结构



Godot将Python处理完的结果接收,用于Godot脚本内处理,主AutoLoad代码将会给出主管理器的部分和登录子管理器来演示如何接收和发送Python信息
登录系统主管理器:
extends Node2D
# 登录和注册两个子管理器
@export var Login : Node2D
@export var Register : Node2D
# 主管理器提供统一 Excel 文件地址,这里使用绝对地址,当然也可以使用相对Godot的相对地址
# 主管理器同样要提供 Python脚本 的地址,下文会说明
var excel_path = "D:/GodotProject/Godot Excel Spreadsheet/godot-excel-spreadsheet/06_GameData/ServerData/GameDataExcel.xlsx"
var python_script = "res://06_GameData/ServerData/FileProcessingMain.py"
登录系统登录子管理器:
extends Node2D
"""
注意传输路径
Godot传出去的参数到Python接收,全部会被转化为字符串类型
这里给python传入的脚本格式为:
[python主脚本地址, str Excel请求路径, int 请求操作, 账户ID, 账户密码]
且传递内容全部统一为 str 类型
"""
## 登录信息验证(阻塞线程,运行的时候主程序会暂停)
## 这里的 input_info 传入的是[ID, Password]
func login_info_verify(input_info: Array[String]) -> String:
var receive_return: Array[String] = [] # 接收Python的返回值
var transmit_argv: Array = [] # Godot传给Python的参数
# 补全玩家输入的信息
while len(input_info) < 2:
input_info.append("None")
## 转化传输标准格式
## ProjectSettings.globalize_path()是将Godot的相对文件路径转化为系统路径
var python_path: String = ProjectSettings.globalize_path(LoginSystem.get_python_processing_path())
## 这里是先将传入的参数放进一个数组
## [Python程序路径, Excel文件路径, Godot人为规定的给Python指令, 账户ID, 账户密码]
transmit_argv = [python_path,
LoginSystem.excel_path,
str(0),
input_info[0],
input_info[1]]
## 向python传输基本信息
## 格式 OS.execute(程序运行编译环境(没有会从环境变量自动找),
## 传入参数(第一个是程序路径,给Godot找脚本同时也会被作为参数被传过去),
## 用于接收返回值的数组
## 决定是否接收没被Python收走的异常报错(try 模型收走报错所以不会被接收)
## 如果程序是命令终端类的,可以为True打开一个命令终端运行脚本,为False则后台静默运行
OS.execute("python",
transmit_argv,
receive_return,
true,
true)
## 由于接收为数组,需要使用 join 函数将数组拼起来转化为 string, 前面 "" 代表每一个元素之间连接为空字符串
## 由于Python返回值中包含转义符,使用strip_escapes()删除所有转义符
var result_output: String = "".join(receive_return).strip_escapes()
# 返回Python处理结果
return result_output
3. Python代码层运行测试
给出 Excel 已经存储结构:

然后我们对Python脚本直接运行:
#主程序末尾加一行
login_verify(["10000", "40"])

可以看到返回 0(-2是因为主程序传参不足的分支导致的)
将测试改为不全信息
#主程序末尾加一行
login_verify(["10000"])
运行结果:

可以看到符合上文返回值要求(账户信息不全)
4. Godot软件层运行测试
这里是已经写好的系统,直接用来演示
1. 登录

输入账户信息

登录得

右上角已经显示ID,同时提示登录,同时跳转到其他界面

在信息输入错误下

2. 注册
这里注册的时候不能打开Excel编辑,手动打开Excel会占用文件,导致注册失败
这里输入新信息

注册成功后也会自动跳转到其他界面,这里可以看到注册成功,跳转页面同上登录跳转

这里看Excel可以发现新增信息(这里格式正常的,看起来不正常是因为程序第一次放入的问题)

同时有非法字符判定(由python判定)


3. 开源以及补充
文章详细的实现文章如下:
1. Python脚本处理Excel: Godot(4.X): 外接Python处理Excel数据: Python部分-CSDN博客
2. Godot中登录系统AutoLoad以及其登录界面演示: Godot(4.X): 外接Python处理Excel数据: Godot全局登录管理器部分-CSDN博客
代码开源地址
looooiiui/Excel-login-system-made-with-Python-in-Godot: Excel login system made with Python in Godot
更多推荐
所有评论(0)