我有一个 python/pygame 程序,它从与该程序位于同一目录中的测试文件中读取数据。 在程序结束时,应该将文本写回测试文件。 这在 Python 环境中运行程序时有效,但在使用 Pygbag 编译并在浏览器中运行时无效。
程序(称为 main,py)是:
import asyncio
import os
import pygame
pygame.init()
main_dir = os.path.split(os.path.abspath(__file__))[0]
testTxt = os.path.join(main_dir,"test.txt")
print("Dir = ",main_dir," : test file = ",testTxt)
clock = pygame.time.Clock() # Set the clock timer
screen_posn = (1000,600)
screen = pygame.display.set_mode((screen_posn))
screen.fill("black")
running = True # Main loop control
async def main():
global screen,running
testText = "Data in test.txt - Press E to write back the inverse"
font = pygame.font.Font(None, 32)
txt = font.render(testText, False, "white")
txt_rect = txt.get_rect(topleft=(300,100))
screen.blit(txt,txt_rect)
writeBackText = "Data below should be written back to test.txt"
wbt = font.render(writeBackText,False,"black")
wbt_rect = wbt.get_rect(topleft=(300,250))
writeBack = False
with open(testTxt,"r") as tests:
test = tests.readline()
tst = font.render(test,False,"white")
tst_rect = tst.get_rect(topleft=(300,150))
inverse = test[::-1]
inv = font.render(inverse,False,"black")
inv_rect = inv.get_rect(topleft=(300,300))
while running:
screen.fill("black")
screen.blit(txt,txt_rect)
screen.blit(tst,tst_rect)
screen.blit(wbt,wbt_rect)
screen.blit(inv,inv_rect)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_END]:
running = False
elif keys[pygame.K_e]:
wbt = font.render(writeBackText,False,"white")
inv = font.render(inverse,False,"white")
writeBack = True
pygame.display.flip() # Display the screen
clock.tick(60)
await asyncio.sleep(0)
with open(testTxt,"w") as tests:
tests.write(inverse)
print(inverse," should have been written to ",testTxt)
asyncio.run(main())
程序从文件读取并显示一行文本“test.txt”与程序位于同一目录(主目录)中,必须称为“main.py”。 按下 E 键后,文本将反向显示。 按“END”键(据说)会将反转的文本写回 test.txt。 这在 python 环境中运行时有效,但在使用 Pygbag 编译时无效。 没有给出错误,但 test.txt 文件保持不变。
要使用 Pygbag(必须安装 pip)编译程序,首先移动到 /main.py 的父目录(cd ..)然后运行| ||(父目录)。 程序编译完成后,您可以在浏览器中查看该程序
pygbag <whatever>
,可以查看任何打印/调试消息。
http://localhost:8000#debug
我使用的是Python v3.12、pygame v2.6.0 和 pygbag v0.9.1| ||我的问题是 - 为什么我不能在程序的编译版本中写回,而在 python 环境中运行它时可以写回?
任何帮助/建议将不胜感激!
My question is - Why can I not write back in the compiled version of the program whereas I can when running it in a python environment?
Any help/suggestions would be gratefully received!
在 Pygbag 中遇到此问题的原因是,基于浏览器的环境(其中的 Python 代码由于 Pygbag 被转换为 JavaScript)通常对本地文件系统没有直接的读/写访问权限。 这是出于安全原因,以防止浏览器脚本修改的计算机。
虽然 Pygbag 非常出色,可以将 Pygame 应用程序转换为在网络上运行,但它无法完全模拟 Python 可以执行的所有文件系统操作。
可能的解决方案:
-
使用浏览器存储: 与其尝试直接写入文件,不如将数据存储在浏览器本地存储或会话存储中。 这些是专门为基于网络的应用程序设计的,用于在用户会话期间或之后保留数据的机制。 可以使用 JavaScript API(从的 Pygbag 应用程序内访问)来操作此存储。
-
本地存储: 数据在浏览器中持久保存,即使在浏览器关闭并重新打开后也是如此。
- 会话存储: 数据仅在当前浏览器选项卡或窗口打开时保留。
以下是如何在的 Pygbag 代码中使用它的粗略示例:
```python import pygame import json
# ... 其他代码 ...
def save_data(key, value): pygame.display.get_surface().eval(f"localStorage.setItem('{key}', '{json.dumps(value)}')")
def load_data(key): value = pygame.display.get_surface().eval(f"localStorage.getItem('{key}')") return json.loads(value) if value else None
# ... 在的游戏中 ... if writeBack: save_data("myGameData", inverse)
# 稍后加载 loaded_data = load_data("myGameData") ```
- 服务器端组件: 对于更持久、更复杂的存储或如果需要在不同用户或会话之间共享数据,请考虑设置服务器端组件(使用 Flask 或 Django 等)。 的 Pygbag 应用程序可以通过 HTTP 请求与服务器通信以发送和接收数据。 这需要更多设置,但这是一种更强大的方法来处理 Web 应用程序中的数据持久性。
重要注意事项:
- 安全: 如果选择服务器端选项,请注意处理敏感数据时的安全隐患。
- 用户体验: 如果的游戏非常依赖文件系统交互,则可能需要重新考虑某些游戏机制,以更好地适应基于 Web 的环境。
请记住,Web 应用程序中的文件处理与桌面应用程序中的文件处理根本不同。 通过理解并利用像浏览器存储这样的替代方案,可以创建即使在 Pygbag 编译中也能按预期运行的引人入胜的基于 Web 的游戏。
标签:python,pygame,pygbag From: 78831715