pyscreeps-arena 0.5.3.2__py3-none-any.whl → 0.5.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,9 +24,28 @@ def CMD_NewProject():
24
24
  extract_7z(os.path.join(this_path, 'project.7z'), project_path)
25
25
  print("Project created at", project_path)
26
26
 
27
+ def CMD_OpenUI():
28
+ """
29
+ cmd:
30
+ psaui
31
+
32
+ * 打开UI界面
33
+
34
+ Returns:
35
+
36
+ """
37
+ try:
38
+ from pyscreeps_arena.ui.project_ui import run_project_creator
39
+ run_project_creator()
40
+ except ImportError as e:
41
+ print(f"错误: 无法导入UI模块 - {e}")
42
+ print("请确保已安装PyQt6: pip install PyQt6")
43
+ except Exception as e:
44
+ print(f"错误: 打开UI界面失败 - {e}")
27
45
 
28
46
  def extract_7z(file_path, output_dir):
29
47
  with py7zr.SevenZipFile(file_path, mode='r') as archive:
30
48
  archive.extractall(path=output_dir)
31
49
 
32
-
50
+ if __name__ == '__main__':
51
+ CMD_OpenUI()
@@ -16,6 +16,27 @@ python_version_info = sys.version_info
16
16
  python_version_info = f"{python_version_info.major}.{python_version_info.minor}.{python_version_info.micro}"
17
17
 
18
18
 
19
+ def replace_src_prefix(file_list):
20
+ """
21
+ 将列表中以'./src.'开头的字符串替换为'./'
22
+
23
+ 参数:
24
+ file_list: 字符串列表
25
+
26
+ 返回:
27
+ 替换后的新列表
28
+ """
29
+ _ = []
30
+
31
+ for item in file_list:
32
+ if isinstance(item, str) and item.startswith('./src.'):
33
+ _new = item.replace('./src.', './', 1)
34
+ if _new in file_list:
35
+ continue
36
+ _.append(item)
37
+
38
+ return _
39
+
19
40
  # def InsertPragmaBefore(content:str) -> str:
20
41
  # """
21
42
  # 在content的开头插入__pragma__('noalias', 'undefined')等内容 |
@@ -85,7 +106,7 @@ export var loop = function () {
85
106
  }
86
107
  step (know);
87
108
  timeLine = get.cpu_us();
88
- sch.handle();
109
+ if (get._SCH_FLAG) sch.handle();
89
110
  stepCost = get.cpu_us() - timeLine;
90
111
  std.show_usage ();
91
112
  print("knowCost:", knowCost, "monitorCost:", monitorCost, "stepCost:", stepCost);
@@ -178,11 +199,6 @@ class GameConstructionBoost{{
178
199
  constructor(){{
179
200
  }}
180
201
  }};
181
- let GameFlag = GameStructureSpawn;
182
- import * as GAME_PROTO_MODULE from 'game/prototypes';
183
- if (GAME_PROTO_MODULE.Flag){{
184
- GameFlag = GAME_PROTO_MODULE.Flag;
185
- }}
186
202
  """,
187
203
  }
188
204
 
@@ -318,6 +334,102 @@ class Compiler_Utils(Compiler_Const):
318
334
 
319
335
  return '\n'.join(result) # 将处理后的所有代码行连接成一个字符串,并返回最终结果 | join all processed lines into a string and return
320
336
 
337
+ def expand_folder_imports(self, fpath: str, project_path: str = None):
338
+ """
339
+ 扩展文件夹导入语句:将 `from folder import *` 替换为 `from folder.module import *`
340
+ 仅在文件夹没有 __init__.py 时执行此操作
341
+
342
+ :param fpath: 要处理的文件路径
343
+ :param project_path: 项目根路径,用于解析相对导入,默认为 None(使用文件所在目录)
344
+ """
345
+ if not os.path.exists(fpath):
346
+ return
347
+
348
+ content = self.auto_read(fpath)
349
+ lines = content.split('\n')
350
+ new_lines = []
351
+ changed = False
352
+
353
+ for line in lines:
354
+ m = self.PY_IMPORT_PAT.match(line)
355
+ if not m:
356
+ new_lines.append(line)
357
+ continue
358
+
359
+ original_target = m.group(1)
360
+ target = original_target
361
+ target_path = project_path or os.path.dirname(fpath)
362
+
363
+ # 处理相对路径(向前定位)
364
+ if target.startswith('.'):
365
+ target_path = os.path.dirname(fpath)
366
+ count = 0
367
+ for c in target:
368
+ if c == '.':
369
+ count += 1
370
+ else:
371
+ break
372
+
373
+ # 向上移动目录
374
+ if count > 1:
375
+ for _ in range(count - 1):
376
+ target_path = os.path.dirname(target_path)
377
+
378
+ # 移除开头的点
379
+ target = target[count:]
380
+
381
+ # 如果 target 为空,跳过
382
+ if not target:
383
+ new_lines.append(line)
384
+ continue
385
+
386
+ # 向后定位,构建完整路径
387
+ temp_target = target
388
+ while (_idx := temp_target.find('.')) != -1:
389
+ part = temp_target[:_idx]
390
+ target_path = os.path.join(target_path, part)
391
+ temp_target = temp_target[_idx + 1:]
392
+
393
+ # 最终的文件夹路径
394
+ final_dir_path = os.path.join(target_path, temp_target) if temp_target else target_path
395
+
396
+ # 检查是否是文件夹且没有 __init__.py
397
+ if os.path.isdir(final_dir_path):
398
+ init_path = os.path.join(final_dir_path, '__init__.py')
399
+ if not os.path.exists(init_path):
400
+ # 找到所有 .py 文件(排除 __init__.py)| 如果包含子目录,产生一个警告
401
+ # try:
402
+ # py_files = [f for f in os.listdir(final_dir_path) if f.endswith('.py') and f != '__init__.py']
403
+ # except (FileNotFoundError, PermissionError):
404
+ py_files = []
405
+ for item in os.listdir(final_dir_path):
406
+ _path = os.path.join(final_dir_path, item)
407
+ if os.path.isfile(_path) and item.endswith('.py') and item != '__init__.py':
408
+ py_files.append(item)
409
+ elif os.path.isdir(_path):
410
+ rel = os.path.relpath(final_dir_path, project_path)
411
+ core.warn(f'Compiler.expand_folder_imports', core.lformat(LOC_DIR_UNDER_NONINIT_DIR, [item, rel]), end='', head='\n', ln=config.language )
412
+
413
+
414
+ # 为每个 .py 文件生成导入语句
415
+ if py_files:
416
+ for py_file in py_files:
417
+ module_name = py_file[:-3]
418
+ new_import = f"from {original_target}.{module_name} import *"
419
+ new_lines.append(new_import)
420
+ changed = True
421
+ continue
422
+
423
+ # 保留原行
424
+ new_lines.append(line)
425
+
426
+ # 如果文件有修改,写回
427
+ if changed:
428
+ new_content = '\n'.join(new_lines)
429
+ with open(fpath, 'w', encoding='utf-8') as f:
430
+ f.write(new_content)
431
+
432
+
321
433
  def find_chain_import(self, fpath: str, search_dirs: list[str], project_path: str = None, records: dict[str, None] = None) -> list[str]:
322
434
  r"""
323
435
  查找文件中的所有import语句,并返回所有import的文件路径 | find all import statements in a file and return the paths of all imported files
@@ -468,15 +580,63 @@ class Compiler_Utils(Compiler_Const):
468
580
  return jsimps
469
581
 
470
582
  # ---------- 自定义函数 ---------- #
583
+
471
584
  @staticmethod
472
- def stage_recursive_replace(content:str) -> str:
473
- r"""
474
- 替换'@recursive'为'@recursive(<fname>)', 其中<fname>为被装饰器标记的函数名 |
475
- Replace '@recursive' with '@recursive(<fname>)', where <fname> is the name of the decorated function.
585
+ def stage_recursive_replace(content: str) -> str:
586
+ """
587
+ 移除 '@recursive' 装饰器行,并在文末添加对应的 _recursiveLogin 调用。
476
588
 
477
- @\s*recursive\s+def\s+([^\s\(]+)
589
+ 对于类方法: _recursiveLogin("ClassName", "method_name")
590
+ 对于普通函数: _recursiveLogin("", "function_name")
478
591
  """
479
- return re.sub(r'@\s*recursive(\s+def\s+)([^\s\(]+)', r'@recursive("\2")\1\2', content)
592
+ calls_to_add = []
593
+ deletions = []
594
+
595
+ # 1. 收集所有类定义的位置和缩进
596
+ class_pattern = re.compile(r'^(\s*)class\s+(\w+)', re.MULTILINE)
597
+ classes = [(m.start(), len(m.group(1)), m.group(2))
598
+ for m in class_pattern.finditer(content)]
599
+
600
+ # 2. 查找所有 @recursive 装饰器
601
+ decorator_pattern = re.compile(r'^\s*@\s*recursive\s*$\n?', re.MULTILINE)
602
+
603
+ for dec_match in decorator_pattern.finditer(content):
604
+ dec_end = dec_match.end()
605
+
606
+ # 查找接下来的函数定义(跳过可能的空行)
607
+ after_decorator = content[dec_end:]
608
+ func_match = re.search(r'^(\s*)def\s+([^\s\(]+)', after_decorator, re.MULTILINE)
609
+
610
+ if not func_match:
611
+ continue
612
+
613
+ func_indent_len = len(func_match.group(1))
614
+ func_name = func_match.group(2)
615
+
616
+ # 3. 确定类名:查找装饰器前最近的、缩进小于函数缩进的类
617
+ class_name = ""
618
+ for cls_pos, cls_indent_len, cls_name in reversed(classes):
619
+ if cls_pos < dec_match.start() and func_indent_len > cls_indent_len:
620
+ class_name = cls_name
621
+ break
622
+
623
+ # 4. 记录删除位置和调用信息
624
+ deletions.append((dec_match.start(), dec_end))
625
+ calls_to_add.append(f'_recursiveLogin("{class_name}", "{func_name}")')
626
+
627
+ # 5. 应用删除(倒序避免位置偏移)
628
+ if not deletions:
629
+ return content
630
+
631
+ result = content
632
+ for start, end in sorted(deletions, key=lambda x: x[0], reverse=True):
633
+ result = result[:start] + result[end:]
634
+
635
+ # 6. 在文末添加调用
636
+ if calls_to_add:
637
+ result = '\n'.join(calls_to_add) + '\n' + result
638
+
639
+ return result
480
640
 
481
641
  @staticmethod
482
642
  def process_mate_code(code):
@@ -626,6 +786,8 @@ class Compiler(CompilerBase):
626
786
  if m and (not m.group(2) or m.group(2)[0] != '*'):
627
787
  core.error('Compiler.pre_compile', core.lformat(LOC_IMPORT_STAR2_ERROR, [m.group(1), m.group(2), m.group(1)]), head='\n', ln=config.language)
628
788
 
789
+ self.expand_folder_imports(fpath, self.build_dir)
790
+
629
791
  # -------------------------------- EXPAND IMPORT * -------------------------------- #
630
792
  _imports = self.find_chain_import(self.target_py, [os.path.dirname(self.src_dir), self.src_dir])
631
793
  _js_imports = self.relist_pyimports_to_jsimports(self.build_dir, _imports)
@@ -978,7 +1140,7 @@ class Compiler(CompilerBase):
978
1140
  self.transcrypt_cmd()
979
1141
  imports, modules = self.analyze_rebuild_main_js(defs, jimps)
980
1142
  self.find_add_pure_js_files(sorts, modules)
981
- total_js = imports + "\n" + self.generate_total_js(modules, imps, sorts, self.FILE_STRONG_REPLACE, reps)
1143
+ total_js = imports + "\n" + self.generate_total_js(replace_src_prefix(modules), imps, sorts, self.FILE_STRONG_REPLACE, reps)
982
1144
 
983
1145
  core.lprint(WAIT, LOC_EXPORTING_TOTAL_MAIN_JS, end="", ln=config.language)
984
1146
 
@@ -9,7 +9,7 @@
9
9
  #
10
10
  import re
11
11
 
12
- VERSION = "0.5.3.2"
12
+ VERSION = "0.5.4.0"
13
13
  AUTHOR = "●ω<🤍♪"
14
14
  STEAM_ID = "1029562896"
15
15
  GITHUB_NAME = "EagleBaby"
@@ -135,6 +135,12 @@ LOC_NOT_SUPPORT_PYFILE_INIT = {
135
135
  'cn': '不支持 __init__.py!请删除它(初始化文件)并使用 from directory.xxx import xxxx 代替之。',
136
136
  }
137
137
 
138
+ # V0.5.4
139
+ LOC_DIR_UNDER_NONINIT_DIR = {
140
+ 'en': "Directory [{}] is located under [{}] without __init__.py, therefore it is ignored.",
141
+ 'cn': "目录 [{}] 位于 `无__init__.py`的目录[{}]下,因此被忽略。",
142
+ }
143
+
138
144
  if __name__ == '__main__':
139
145
  lprint(TEMPLATE)
140
146
 
Binary file
@@ -0,0 +1,108 @@
1
+ # png_to_py.py - 将PNG图片转换为Python模块(最终验证版)
2
+ import base64
3
+ import sys
4
+ from pathlib import Path
5
+ import re
6
+
7
+
8
+ def png_to_py(png_path, py_path=None, var_name=None):
9
+ """
10
+ 将PNG图片转换为Python模块文件
11
+
12
+ :param png_path: PNG图片路径
13
+ :param py_path: 输出的.py文件路径(默认为图片同名.py)
14
+ :param var_name: 变量名(默认为文件名的大写形式)
15
+ """
16
+ png_file = Path(png_path)
17
+
18
+ if not png_file.exists():
19
+ raise FileNotFoundError(f"文件 '{png_path}' 不存在")
20
+
21
+ if png_file.suffix.lower() != '.png':
22
+ print(f"[警告] 文件 '{png_path}' 不是PNG格式")
23
+ return False
24
+
25
+ # 自动生成输出路径
26
+ if py_path is None:
27
+ py_path = png_file.with_suffix('.py')
28
+ else:
29
+ py_path = Path(py_path)
30
+
31
+ # 自动生成变量名
32
+ if var_name is None:
33
+ base_name = png_file.stem.replace('-', '_').replace(' ', '_')
34
+ base_name = re.sub(r'[^0-9a-zA-Z_]', '', base_name)
35
+ if base_name and base_name[0].isdigit():
36
+ base_name = f'ICON_{base_name}'
37
+ var_name = base_name.upper()
38
+
39
+ try:
40
+ # 读取PNG文件并转换为base64
41
+ with open(png_file, 'rb') as f:
42
+ png_data = f.read()
43
+ base64_data = base64.b64encode(png_data).decode('utf-8')
44
+
45
+ print(f"[DEBUG] 读取PNG文件: {len(png_data)} 字节")
46
+ print(f"[DEBUG] Base64编码长度: {len(base64_data)} 字符")
47
+
48
+ # 生成Python代码(关键修复:使用 len({var_name}))
49
+ py_content = f'''# -*- coding: utf-8 -*-
50
+ """
51
+ PyQt6资源模块: {png_file.name}
52
+ 由 png_to_py.py 自动生成
53
+ """
54
+
55
+ # Base64编码的PNG数据(单行,无换行符)
56
+ {var_name} = b"{base64_data}"
57
+
58
+ def get_pixmap():
59
+ \"\"\"返回QPixmap对象\"\"\"
60
+ from PyQt6.QtGui import QPixmap
61
+ from PyQt6.QtCore import QByteArray
62
+
63
+ byte_array = QByteArray.fromBase64({var_name})
64
+ pixmap = QPixmap()
65
+ pixmap.loadFromData(byte_array)
66
+ return pixmap
67
+
68
+ def get_icon():
69
+ \"\"\"返回QIcon对象\"\"\"
70
+ from PyQt6.QtGui import QIcon
71
+ return QIcon(get_pixmap())
72
+
73
+ if __name__ == '__main__':
74
+ import sys
75
+ from PyQt6.QtWidgets import QApplication
76
+
77
+ app = QApplication.instance() or QApplication(sys.argv)
78
+
79
+ print(f"资源模块 {var_name} 已加载")
80
+ print(f"字节数据长度: {{len({var_name})}} 字节") # ✅ 修复:使用 {var_name}
81
+
82
+ # 验证能否正确加载
83
+ pixmap = get_pixmap()
84
+ print(f"QPixmap加载成功: 尺寸 {{pixmap.width()}}x{{pixmap.height()}}")
85
+ '''
86
+
87
+ # 写入Python文件
88
+ with open(py_path, 'w', encoding='utf-8') as f:
89
+ f.write(py_content)
90
+
91
+ print(f"✓ 成功: {png_path} -> {py_path}")
92
+ print(f" 变量名: {var_name}")
93
+ return True
94
+
95
+ except Exception as e:
96
+ print(f"错误: 转换失败 - {e}")
97
+ import traceback
98
+ traceback.print_exc()
99
+ return False
100
+
101
+
102
+ if __name__ == '__main__':
103
+ if len(sys.argv) > 1:
104
+ target = sys.argv[1]
105
+ else:
106
+ target = "icon.png"
107
+
108
+ png_to_py(target, "rs_icon.py")
@@ -0,0 +1,10 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ PyScreeps Arena UI模块
4
+ """
5
+
6
+ from .rs_icon import get_icon, get_pixmap
7
+ from .project_ui import ProjectCreatorUI, run_project_creator
8
+ from .P2PY import png_to_py
9
+
10
+ __all__ = ['get_icon', 'get_pixmap', 'ProjectCreatorUI', 'run_project_creator', 'png_to_py']
@@ -0,0 +1,214 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ 项目创建UI界面
4
+ """
5
+ import sys
6
+ import os
7
+ from pathlib import Path
8
+ from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
9
+ QHBoxLayout, QLabel, QLineEdit, QPushButton,
10
+ QFileDialog, QMessageBox)
11
+ from PyQt6.QtCore import Qt
12
+ from PyQt6.QtGui import QFont
13
+ from PyQt6.QtGui import QIcon
14
+ from pyscreeps_arena.core import const
15
+ from pyscreeps_arena.ui.rs_icon import get_pixmap
16
+
17
+
18
+ class ProjectCreatorUI(QMainWindow):
19
+ def __init__(self):
20
+ super().__init__()
21
+ self._proj_name = ""
22
+ self._proj_path = ""
23
+ self._init_ui()
24
+
25
+ def _init_ui(self):
26
+ """初始化UI界面"""
27
+ self.setWindowTitle("PyScreeps Arena - 项目创建器")
28
+ self.setWindowIcon(QIcon(get_pixmap()))
29
+ self.setFixedSize(500, 350)
30
+
31
+ # 主窗口部件
32
+ central_widget = QWidget()
33
+ self.setCentralWidget(central_widget)
34
+ layout = QVBoxLayout(central_widget)
35
+ layout.setSpacing(15)
36
+ layout.setContentsMargins(30, 30, 30, 30)
37
+
38
+ # 标题
39
+ title = QLabel("PyScreeps Arena")
40
+ title.setAlignment(Qt.AlignmentFlag.AlignCenter)
41
+ title_font = QFont()
42
+ title_font.setPointSize(18)
43
+ title_font.setBold(True)
44
+ title.setFont(title_font)
45
+ layout.addWidget(title)
46
+
47
+ # 项目信息
48
+ info_widget = QWidget()
49
+ info_layout = QVBoxLayout(info_widget)
50
+ info_layout.setSpacing(8)
51
+
52
+ # 版本信息
53
+ version_label = QLabel(f"版本: {const.VERSION}")
54
+ version_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
55
+ info_layout.addWidget(version_label)
56
+
57
+ # 作者信息
58
+ author_label = QLabel(f"作者: {const.AUTHOR}")
59
+ author_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
60
+ info_layout.addWidget(author_label)
61
+
62
+ # GitHub信息
63
+ github_label = QLabel(f"GitHub: {const.GITHUB_NAME}")
64
+ github_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
65
+ info_layout.addWidget(github_label)
66
+
67
+ layout.addWidget(info_widget)
68
+
69
+ # 分隔线
70
+ separator = QLabel("─" * 50)
71
+ separator.setAlignment(Qt.AlignmentFlag.AlignCenter)
72
+ separator.setStyleSheet("color: #ccc;")
73
+ layout.addWidget(separator)
74
+
75
+ # 项目输入区域
76
+ input_widget = QWidget()
77
+ input_layout = QVBoxLayout(input_widget)
78
+ input_layout.setSpacing(12)
79
+
80
+ # 项目名称输入
81
+ name_layout = QHBoxLayout()
82
+ name_label = QLabel("项目名称:")
83
+ name_label.setFixedWidth(80)
84
+ self._name_input = QLineEdit()
85
+ self._name_input.setPlaceholderText("输入项目名称...")
86
+ self._name_input.textChanged.connect(self._on_name_changed)
87
+ name_layout.addWidget(name_label)
88
+ name_layout.addWidget(self._name_input)
89
+ input_layout.addLayout(name_layout)
90
+
91
+ # 项目路径输入
92
+ path_layout = QHBoxLayout()
93
+ path_label = QLabel("保存位置:")
94
+ path_label.setFixedWidth(80)
95
+ self._path_input = QLineEdit()
96
+ self._path_input.setPlaceholderText("选择项目保存位置...")
97
+ self._path_input.setReadOnly(True)
98
+ # 默认桌面路径
99
+ desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
100
+ if os.path.exists(desktop_path):
101
+ self._path_input.setText(desktop_path)
102
+ self._proj_path = desktop_path
103
+ path_layout.addWidget(path_label)
104
+ path_layout.addWidget(self._path_input)
105
+
106
+ # 浏览按钮
107
+ browse_btn = QPushButton("浏览...")
108
+ browse_btn.setFixedWidth(60)
109
+ browse_btn.clicked.connect(self._browse_path)
110
+ path_layout.addWidget(browse_btn)
111
+
112
+ input_layout.addLayout(path_layout)
113
+ layout.addWidget(input_widget)
114
+
115
+ # 按钮区域
116
+ button_layout = QHBoxLayout()
117
+ button_layout.addStretch()
118
+
119
+ # 创建按钮
120
+ self._create_btn = QPushButton("创建项目")
121
+ self._create_btn.setFixedSize(100, 35)
122
+ self._create_btn.clicked.connect(self._create_project)
123
+ self._create_btn.setEnabled(False)
124
+ button_layout.addWidget(self._create_btn)
125
+
126
+ # 取消按钮
127
+ cancel_btn = QPushButton("取消")
128
+ cancel_btn.setFixedSize(80, 35)
129
+ cancel_btn.clicked.connect(self.close)
130
+ button_layout.addWidget(cancel_btn)
131
+
132
+ layout.addLayout(button_layout)
133
+ layout.addStretch()
134
+
135
+ def _on_name_changed(self, text):
136
+ """项目名称改变时的处理"""
137
+ self._proj_name = text.strip()
138
+ self._create_btn.setEnabled(bool(self._proj_name and self._proj_path))
139
+
140
+ def _browse_path(self):
141
+ """浏览选择路径"""
142
+ current_path = self._path_input.text() or os.path.expanduser("~")
143
+ path = QFileDialog.getExistingDirectory(
144
+ self, "选择项目保存位置", current_path
145
+ )
146
+ if path:
147
+ self._path_input.setText(path)
148
+ self._proj_path = path
149
+ self._create_btn.setEnabled(bool(self._proj_name and self._proj_path))
150
+
151
+ def _create_project(self):
152
+ """创建项目"""
153
+ if not self._proj_name or not self._proj_path:
154
+ return
155
+
156
+ # 构建完整路径
157
+ full_path = os.path.join(self._proj_path, self._proj_name)
158
+
159
+ # 检查路径是否已存在
160
+ if os.path.exists(full_path):
161
+ reply = QMessageBox.question(
162
+ self, "路径已存在",
163
+ f"路径 '{full_path}' 已存在。\n是否继续?",
164
+ QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
165
+ )
166
+ if reply != QMessageBox.StandardButton.Yes:
167
+ return
168
+
169
+ try:
170
+ # 创建项目
171
+ self._extract_project_template(full_path)
172
+
173
+ QMessageBox.information(
174
+ self, "成功",
175
+ f"项目 '{self._proj_name}' 创建成功!\n路径: {full_path}"
176
+ )
177
+ self.close()
178
+
179
+ except Exception as e:
180
+ QMessageBox.critical(
181
+ self, "错误",
182
+ f"项目创建失败:\n{str(e)}"
183
+ )
184
+
185
+ def _extract_project_template(self, target_path):
186
+ """提取项目模板"""
187
+ # 获取当前包路径
188
+ this_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
189
+ project_7z_path = os.path.join(this_path, 'project.7z')
190
+
191
+ if not os.path.exists(project_7z_path):
192
+ raise FileNotFoundError(f"项目模板文件不存在: {project_7z_path}")
193
+
194
+ # 创建目标目录
195
+ os.makedirs(target_path, exist_ok=True)
196
+
197
+ # 解压项目模板
198
+ import py7zr
199
+ with py7zr.SevenZipFile(project_7z_path, mode='r') as archive:
200
+ archive.extractall(path=target_path)
201
+
202
+ print(f"[DEBUG] 项目模板已解压到: {target_path}") # 调试输出
203
+
204
+
205
+ def run_project_creator():
206
+ """运行项目创建器UI"""
207
+ app = QApplication(sys.argv)
208
+ window = ProjectCreatorUI()
209
+ window.show()
210
+ sys.exit(app.exec())
211
+
212
+
213
+ if __name__ == '__main__':
214
+ run_project_creator()
@@ -0,0 +1,43 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ PyQt6资源模块: icon.png
4
+ 由 png_to_py.py 自动生成
5
+ """
6
+
7
+ # Base64编码的PNG数据(单行,无换行符)
8
+ ICON = b"iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAA57GlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMjUtMTEtMjFUMjM6MDE6MjUrMDg6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDI1LTExLTIxVDIzOjAxOjI1KzA4OjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAyNS0xMS0yMVQyMzowMToyNSswODowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NTJmOTM2Y2QtOTY1MC01YjQ0LTgzMjMtYjBjMjgwZDM0MGI3PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6ZWQzNTEwMjMtYzZlYS0xMWYwLTk2YjktZmM2NTg2ZGU4Mzc1PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6MGU2N2I1ZTItOTllOS1jMTQyLWIxYjYtMWUwNWY4MzAyYjdiPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjBlNjdiNWUyLTk5ZTktYzE0Mi1iMWI2LTFlMDVmODMwMmI3Yjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAyNS0xMS0yMVQyMzowMToyNSswODowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo1MmY5MzZjZC05NjUwLTViNDQtODMyMy1iMGMyODBkMzQwYjc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMjUtMTEtMjFUMjM6MDE6MjUrMDg6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MjA8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/Pud2StQAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAABA5JREFUeNpklE2IntUVx3/n3Hufed+Zd74yZjLR+DUxfqXFYkIaiC0iLa22W923IAi6UFy4DbhxqQiiCF2Jq27daWlRoU2VptVSqE1CwaSTxGTCzLwfz3PvPaeLZ8SF564unPPnnv/985Mnf/X01c8/O7cemoSZISIYBg4iAiKAAaAGASHXChGEiLujqtQu+4mTpy7J+qG7fW44pMtdL5YLTZwjW0ZjwEpFXTEJaDS8GOaGSINbi6ZetEkN7XTaqaZIO5sBgDuaIsUMV6hUNKX9V1bMKh4KISlQ0RTBHYB2NkNjbBQgNQ0AVg3LBY8gZkiXwQtVHQkVq457gxn9PRes9nakpgEBBcht2/vljsYAVlkIyuaB21hURcQBZThcZ7R4D9gC7tL3uiMi5LbtfXYcjRE8kCRgWhCMO0cbvHlmgxVSP+RCl4Y8cuZ1RmsP4aa4VTTO4RQkCeAotWFQoMiEEg26JY6PVvn9zze5d2mZLEO8dNQyI6YJw+U1Hn3qdVbXjoILQQrUitRF3EEdY9xMmK8jyANOH668+7NjLM9X3jl/iWvjbSQlUlQmO9e58Nn7LISDHH/8bVY2TjMrhRhWcL0FAmFltHTWo5EL3H9wyLs//SF3xBGv/uUib1z8hqWlJZoDPybOH8Xr1+z974/kXFk79guOHDzD5e1P6cZbSBVUh4SF5dWznhc4dajhncce5sj8gNe++A+/+9dlsMrwwGkee+It1h/4Nd9c/JhJ2eXG9fPE2YTVo7/knkNPcP3aF3TtFdwykf1yviszQxAkCDl3eB9RVApmjjD4Nn7fK7lj414vTYe1DQ8cHPHe48c5rENe+8cl3rjwNcvNEF3+EZQhs/Ffkb0b3PWDF7jr9MuEW1f406e/pb3+FVodjfOE4eL6WdeWoS9wbWz8/cZVfnLnCk9tLuGTMecu7zGZXsKn/2Zqxuax53nwzPO0u1f42yevsLN1nrmwiMkMF0cFZaGbZxL2IM04dzXw7IdfcXNXeO7R+zi8dABKIefEcHQ7myd/w7jb5cs/vMitrT8ziJFSbyG2Ag5K6JhFiD5PLArNDl/ubfPMRxf4794u5DGSGkIIlJxpd67y+QcvcXP7nyBO9Qgh4GEXEZCNI0fdckFTxHLpCSMwXyu3L6+yPZtys+1AlSatkQbLjHe3QHYQ36fRt7Mp9oJBA6UWvFr/nSmiGF4yhAgSESpWAVUwQ6NjnYMIEpQYItUqEYfcdUhQNGjf4IIBnhqSJmpXcIQQwTwDipeApj5PTq+hMaBWis8NBvsh6gEbKuj+ybMZggCKSkSq4iZAwnLZZyXMDQb92idOnrrcTqeuqj3OUyRHo9aKmyGDOUooEDO1tsQQUBXQ72itqrTTKSdOntr6/wB5xwkK8omfuAAAAABJRU5ErkJggg=="
9
+
10
+ def get_pixmap():
11
+ """返回QPixmap对象"""
12
+ from PyQt6.QtGui import QPixmap
13
+ from PyQt6.QtCore import QByteArray
14
+
15
+ byte_array = QByteArray.fromBase64(ICON)
16
+ pixmap = QPixmap()
17
+ pixmap.loadFromData(byte_array)
18
+ return pixmap
19
+
20
+ def get_icon():
21
+ """返回QIcon对象"""
22
+ from PyQt6.QtGui import QIcon
23
+ return QIcon(get_pixmap())
24
+
25
+ if __name__ == '__main__':
26
+ import sys
27
+ from PyQt6.QtWidgets import QApplication, QMainWindow
28
+
29
+ app = QApplication.instance() or QApplication(sys.argv)
30
+
31
+ print(f"资源模块 ICON 已加载")
32
+ print(f"字节数据长度: {len(ICON)} 字节") # ✅ 修复:使用 ICON
33
+
34
+ # 验证能否正确加载
35
+ pixmap = get_pixmap()
36
+ print(f"QPixmap加载成功: 尺寸 {pixmap.width()}x{pixmap.height()}")
37
+
38
+ win = QMainWindow()
39
+ win.setWindowIcon(get_icon())
40
+ win.setGeometry(100, 100, 300, 200)
41
+ win.setWindowTitle("测试图标")
42
+ win.show()
43
+ sys.exit(app.exec())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscreeps-arena
3
- Version: 0.5.3.2
3
+ Version: 0.5.4.0
4
4
  Summary: Python api|interface to play game: Screeps: Arena.
5
5
  Author-email: 2229066748@qq.com
6
6
  Maintainer: Eagle'sBaby
@@ -16,6 +16,7 @@ Requires-Dist: colorama
16
16
  Requires-Dist: py7zr
17
17
  Requires-Dist: chardet
18
18
  Requires-Dist: Transcrypt==3.9.1
19
+ Requires-Dist: PyQt6
19
20
  Requires-Dist: mkdocs
20
21
  Requires-Dist: mkdocstrings[python]
21
22
  Requires-Dist: mkdocs-material
@@ -0,0 +1,21 @@
1
+ pyscreeps_arena/__init__.py,sha256=xCj4Oy7VYpNNbxBHyVxCT4ZhJS2G4Mo_JKJS5sIXDpE,1349
2
+ pyscreeps_arena/build.py,sha256=DQeGLnID2FjpsWTbnqwt2cOp28olWK68U67bfbFJSOU,177
3
+ pyscreeps_arena/compiler.py,sha256=4Mo69T2EfAS9YOtd9p2zRSAun7uPihzdQMUipsLvbv0,57401
4
+ pyscreeps_arena/localization.py,sha256=5GYoegky1y63Ae7Z4YjHLeQp6L87ek73MndERuFC3M4,5886
5
+ pyscreeps_arena/project.7z,sha256=eHZuv31R4PnUSDlh5qwW2bL82he94vHV1E_q61sa9Xo,291806
6
+ pyscreeps_arena/core/__init__.py,sha256=qoP_rx1TpbDLJoTm5via4XPwEPaV1FXr1SYvoVoHGms,41
7
+ pyscreeps_arena/core/basic.py,sha256=DFvyDTsTXf2bQtnS9s254TrkshvRwajaHcvTyVvJyqw,2790
8
+ pyscreeps_arena/core/config.py,sha256=x_JhVHlVZqB3qA7UyACVnwZjg2gZU-BIs49UxZzwCoE,637
9
+ pyscreeps_arena/core/const.py,sha256=It1ROduI6euyKiiiSyt9gsv6fY1yhHf6pC24bbRjYC8,590
10
+ pyscreeps_arena/core/core.py,sha256=3Nty8eLKPNgwnYk_sVNBPrWuKxBXI2od8nfEezsEAZQ,5157
11
+ pyscreeps_arena/core/main.py,sha256=-FNSOEjksNlDfCbUqsjtPSUW8vT3qxEdfzXqT5Tdsik,170
12
+ pyscreeps_arena/core/utils.py,sha256=N9OOkORvrqnJakayaFp9qyS0apWhB9lBK4xyyYkhFdo,215
13
+ pyscreeps_arena/ui/P2PY.py,sha256=c_zLFkp_M83bSJRnQggt_yQL_2xSPtKWp4kh-TuqM2k,3220
14
+ pyscreeps_arena/ui/__init__.py,sha256=9iW-DFRkBWm-2VtOrFqYyp1nuyt4apX0DJxFxjyKCOM,283
15
+ pyscreeps_arena/ui/project_ui.py,sha256=1C0Liz4OeApuxanI0Vvrgh_r7f8JpLTDDTpYj0b1GI4,7667
16
+ pyscreeps_arena/ui/rs_icon.py,sha256=5v8YdTv2dds4iAp9x3MXpqB_5XIOYd0uPqaq83ZNySM,22496
17
+ pyscreeps_arena-0.5.4.0.dist-info/METADATA,sha256=b86psaIF11WN1lpzKRYUjWunu2E_mIyooPb3mP7Yx6A,2356
18
+ pyscreeps_arena-0.5.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
19
+ pyscreeps_arena-0.5.4.0.dist-info/entry_points.txt,sha256=pnpuPPadwQsxQPaR1rXzUo0fUvhOcC7HTHlf7TYXr7M,141
20
+ pyscreeps_arena-0.5.4.0.dist-info/top_level.txt,sha256=l4uLyMR2NOy41ngBMh795jOHTFk3tgYKy64-9cgjVng,16
21
+ pyscreeps_arena-0.5.4.0.dist-info/RECORD,,
@@ -1,3 +1,4 @@
1
1
  [console_scripts]
2
2
  arena = pyscreeps_arena:CMD_NewProject
3
+ psaui = pyscreeps_arena:CMD_OpenUI
3
4
  pyscreeps-arena = pyscreeps_arena:CMD_NewProject
@@ -1,17 +0,0 @@
1
- pyscreeps_arena/__init__.py,sha256=aQvVULggzXzf3INx0Rrlozdk8Aoxe01lU7b5xytK678,862
2
- pyscreeps_arena/build.py,sha256=DQeGLnID2FjpsWTbnqwt2cOp28olWK68U67bfbFJSOU,177
3
- pyscreeps_arena/compiler.py,sha256=4K3bSV6Ej8orOmtmTAOlpFE0AtJvoIuNdeWNvsSD7A0,51145
4
- pyscreeps_arena/localization.py,sha256=gBbrNybIJAHlkzeD6maF-ie6RKSwPBbnCNzg_1ge8-c,5656
5
- pyscreeps_arena/project.7z,sha256=X5F7fjFQi9Umsm4UxetrjaAXgWAIfWLXFX_PR0mj9LE,288280
6
- pyscreeps_arena/core/__init__.py,sha256=qoP_rx1TpbDLJoTm5via4XPwEPaV1FXr1SYvoVoHGms,41
7
- pyscreeps_arena/core/basic.py,sha256=DFvyDTsTXf2bQtnS9s254TrkshvRwajaHcvTyVvJyqw,2790
8
- pyscreeps_arena/core/config.py,sha256=x_JhVHlVZqB3qA7UyACVnwZjg2gZU-BIs49UxZzwCoE,637
9
- pyscreeps_arena/core/const.py,sha256=2DgDkT9qvjCAbaGJbh7qEK8asXdwl1Um-6l8mZfooek,590
10
- pyscreeps_arena/core/core.py,sha256=3Nty8eLKPNgwnYk_sVNBPrWuKxBXI2od8nfEezsEAZQ,5157
11
- pyscreeps_arena/core/main.py,sha256=-FNSOEjksNlDfCbUqsjtPSUW8vT3qxEdfzXqT5Tdsik,170
12
- pyscreeps_arena/core/utils.py,sha256=N9OOkORvrqnJakayaFp9qyS0apWhB9lBK4xyyYkhFdo,215
13
- pyscreeps_arena-0.5.3.2.dist-info/METADATA,sha256=GVIGZNgCHR0m0UjI0v6Ca0O8t_dnYomuhetWKNmQ4PQ,2334
14
- pyscreeps_arena-0.5.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
15
- pyscreeps_arena-0.5.3.2.dist-info/entry_points.txt,sha256=mLTkJAsgPBEmFkrxNoo3dvb0_dAzSn9jf4Wh09PjdVU,106
16
- pyscreeps_arena-0.5.3.2.dist-info/top_level.txt,sha256=l4uLyMR2NOy41ngBMh795jOHTFk3tgYKy64-9cgjVng,16
17
- pyscreeps_arena-0.5.3.2.dist-info/RECORD,,