首页 > 编程问答 >无法写入使用 pygbag 编译的 python/pygame 程序中的文本文件

无法写入使用 pygbag 编译的 python/pygame 程序中的文本文件

时间:2024-08-06 04:06:59浏览次数:10  
标签:python pygame pygbag

我有一个 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 可以执行的所有文件系统操作。

可能的解决方案:

  1. 使用浏览器存储: 与其尝试直接写入文件,不如将数据存储在浏览器本地存储或会话存储中。 这些是专门为基于网络的应用程序设计的,用于在用户会话期间或之后保留数据的机制。 可以使用 JavaScript API(从的 Pygbag 应用程序内访问)来操作此存储。

  2. 本地存储: 数据在浏览器中持久保存,即使在浏览器关闭并重新打开后也是如此。

  3. 会话存储: 数据仅在当前浏览器选项卡或窗口打开时保留。

以下是如何在的 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") ```

  1. 服务器端组件: 对于更持久、更复杂的存储或如果需要在不同用户或会话之间共享数据,请考虑设置服务器端组件(使用 Flask 或 Django 等)。 的 Pygbag 应用程序可以通过 HTTP 请求与服务器通信以发送和接收数据。 这需要更多设置,但这是一种更强大的方法来处理 Web 应用程序中的数据持久性。

重要注意事项:

  • 安全: 如果选择服务器端选项,请注意处理敏感数据时的安全隐患。
  • 用户体验: 如果的游戏非常依赖文件系统交互,则可能需要重新考虑某些游戏机制,以更好地适应基于 Web 的环境。

请记住,Web 应用程序中的文件处理与桌面应用程序中的文件处理根本不同。 通过理解并利用像浏览器存储这样的替代方案,可以创建即使在 Pygbag 编译中也能按预期运行的引人入胜的基于 Web 的游戏。

标签:python,pygame,pygbag
From: 78831715

相关文章

  • Python 中的克隆和明显的指针问题
    我在克隆列表时遇到了困难。我已经尝试了我所知道的一切,但我的代码似乎仍然将errGrid、slopes1、slopes2和lopes视为同一个对象。为什么?!errOrder=[[]foriinrange(6)]errMethod=[errOrder.copy()foriinrange(AM)]errGrid=[errMethod.copy()foriinrange(U......
  • 【香橙派系列教程】(七)香橙派下的Python3安装
    【七】香橙派下的Python3安装为接下来的Linux图像识别智能垃圾桶做准备。图像处理使用京东SDK只支持pyhton和Java接口,目的是引入C语言的Python调用,感受大厂做的算法bug此接口是人工智能接口,京东识别模型是通过训练后的模型,精准度取决于训练程度,人工智能范畴在常规嵌入式......
  • vnpy,一个不可思议的Python库!
    vn.py是一个开源的Python交易编程框架,旨在帮助程序员快速搭建属于自己的量化交易平台。该框架支持股票、期货、外汇等多种金融产品的交易,提供了从数据获取、策略开发到交易执行的全流程支持。如何安装vnpy首先,要使用vnpy,您需要通过Python的包管理工具pip来安装它。以下......
  • Python回溯算法
    回溯算法回溯算法是一种系统的搜索算法,用于解决诸如排列组合、子集生成、图的路径、棋盘问题等问题。其核心思想是通过递归尝试各种可能的解决方案,遇到不满足条件的解时则回退(回溯),继续尝试其他可能性,直到找到所有的解决方案或确认无解。主要步骤:选择路径:在当前步骤选择一个可......
  • [python]使用gunivorn部署fastapi服务
    前言Gunicorn是一种流行的WSGIHTTP服务器,常用于部署Django和Flask等PythonWeb框架程序。Gunicorn具有轻量级、高稳定性和高性能等特性,可以轻易提高PythonWSGIApp运行时的性能。基本原理Gunicorn采用了pre-fork模型,也就是一个工作进程和多个worker进程的工作模式。在这个模......
  • python十六进制编辑器
    源代码:importtkinterastkfromtkinterimportfiledialogimportstructimportbinasciiimportosclassHexEditor:def__init__(self,master):self.master=masterself.master.title("十六进制编辑器")self.master.configure(bg......
  • python项目学习 mediapipe手势识别 opencv可视化显示
    importcv2importmediapipeimportnumpydefget_angle(vector1,vector2):#角度计算angle=numpy.dot(vector1,vector2)/(numpy.sqrt(numpy.sum(vector1*vector1))*numpy.sqrt(numpy.sum(vector2*vector2)))#cos(angle)=向量的点乘/向量的模angle=nump......
  • 【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
    摘要气象数据分析在各行各业中扮演着重要的角色,尤其对于农业、航空、海洋、军事、资源环境等领域。在这些领域中,准确的气象数据可以对预测未来的自然环境变化和采取行动来减轻负面影响的决策起到至关重要的作用。本系统基于PythonFlask框架,通过对气象数据的分析和处理来提供......
  • Python-MNE全套教程(官网翻译)-入门01:概述篇
    目的以牺牲深度为代价进行入门学习,简易学习基本方法开始导入相关库:#License:BSD-3-Clause#CopyrighttheMNE-Pythoncontributors.importnumpyasnpimportmne加载数据MNE-Python数据结构式基于fif格式的,但是对于其他格式也有阅读方法,如https://mne.tools/s......
  • Python-MNE全套教程(官网翻译)-入门05:关于传感器位置
    本教程描述了如何读取和绘制传感器位置,以及MNE-Python如何处理传感器的物理位置。像往常一样,我们将从导入我们需要的模块开始:frompathlibimportPathimportmatplotlib.pyplotaspltimportnumpyasnpimportmne关于montage和layout(蒙太奇和传感器布局)montage......