print('Hello world!') Estoy tratando de controlar una ventana de Pygame usando 2 archivos de Python diferentes (fish_simulator.py y settings.py), así que de la siguiente manera, tengo fish_simuator.py como el archivo principal, que ejecutar settings.py si sucede algo, pero tuve un problema al compartir datos entre fish simulator.py y settings.py usando un archivo .txt llamado storage_file.txt, así que aquí está un poco de mi programa:

Esto es parte de fish simulator.py

pygame.init()
flags = RESIZABLE
size_of_monitor = pygame.display.Info()
width = size_of_monitor.current_w - 25
height = size_of_monitor.current_h - 50
screen = pygame.display.set_mode((width, height), flags)

#some code later

if result == 1:
    #open settings
    with open(r'files\storage_file.txt', 'w') as storage_file:
        storage_file.write(str(screen))
    exec(open(r'.\extra programs\settings.py').read())

Esto es parte de settings.py

#inside of the code that gets executed
import pygame, os, time, random, sys
from pygame.locals import *

pygame.init()

with open(r'files\storage_file.txt', 'r') as storage_file:
    screen = storage_file.read()

for event in pygame.event.get():
    if event.type == QUIT:
        pygame.quit()
        sys.exit()
pygame.draw.rect(screen, (255, 255, 255), (random.randint(1, 400), random.randint(1, 400), 10, 10))
pygame.display.update()
time.sleep(2)

En el código principal todo está bien, screen se crea y luego se guarda dentro de storage_file.txt y luego, cuando fish simulator ejecuta settings.py, settings.py extrae {{X5} } como una cadena, y cuando intento ejecutar pygame.draw.rect(screen, (255, 255, 255), (random.randint(1, 400), random.randint(1, 400), 10, 10)), me da un error que dice

TypeError: argument 1 must be pygame.Surface, not str

Así que en lugar de surface == <Surface(1234x123x12 SW)> obtuve surface == "<Surface(1234x123x12 SW)>" del storage_file.txt. Y aunque puede parecer tonto para algunos, estaba tan desesperado que probé raw_input () y exec (), ya que no pude encontrar nada más sobre este problema, y ​​también busqué en estos lugares, pero no es lo que necesitar:

TypeError: el argumento 1 debe ser pygame.Surface, no str ¿Cómo lo soluciono?

TypeError: el argumento 1 debe ser pygame.Surface, no str [Pygame usando botones]

TypeError: el argumento 1 debe ser pygame.Surface, no str

https://cmsdk.com/python/python-typeerror-argument-1-must-be-pygame-surface-not-pygame-rect.html

https://www.reddit.com/r/pygame/comments/hsl0z6/windowblit_typeerror_argument_1_must_be/

0
hellwraiz 9 may. 2021 a las 13:55

2 respuestas

La mejor respuesta

Si desea guardar la pantalla en un archivo, debe convertirlo en números:

Ancho es ancho de pantalla alto es alto de pantalla

screen_array = pygame.surfarray.array3d(screen)

you then save the r, g, b values
with open("test1", "w") as a_file:  
    for y in range(height):
        for x in range(width):
           a_file.write(str(screen_array[x][y][0])
           a_file.write(" ")
           a_file.write(str(screen_array[x][y][1])
           a_file.write(" ")
           a_file.write(str(screen_array[x][y][2])
           a_file.write("\n")       

Y para volver a escribirlo, invierte este proceso.

Surfarray requiere numpy. Es posible que tenga los índices de matriz al revés, por lo que es posible que tenga que jugar un poco con esto.

Para volver a leerlos en:

surf = pygame.Surface((width, height))
def load(self):
    x = y = 0
    
    with open("test1", "r") as a_file:
        for a_line in a_file:
            vals = a_line.split()
            r = int(vals[0])
            g = int(vals[1])
            b = int(vals[2])
            a = 255

            surf.set_at((x,y), (r,g,b,a))
            x += 1
            if x == self.width:
                y += 1
                x = 0
            

Esto volverá a leer los valores y los colocará en la superficie.

1
marienbad 11 may. 2021 a las 12:27

En lugar de usar un archivo para transferir la variable, simplemente ingrese import fish_simulator dentro de settings.py

0
hellwraiz 9 may. 2021 a las 14:39