微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我收到错误“类型错误:参数 1 必须是 pygame.Surface”,因为我尝试使用 .txt 文件在 2 个 python 代码之间共享一个值

如何解决我收到错误“类型错误:参数 1 必须是 pygame.Surface”,因为我尝试使用 .txt 文件在 2 个 python 代码之间共享一个值

print('Hello World!') 我正在尝试使用 2 个不同的 python 文件fish_simulator.pysettings.py)来控制一个 pygame 窗口,如下所示,我将 fish_simuator.py 作为主文件,如果发生某些事情,它将执行 settings.py,但我遇到了使用名为 storage_file.txt 的 .txt 文件fish simulator.pysettings.py 之间共享数据的问题,所以这里是一个我的程序:

这是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())

这是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,10,10))
pygame.display.update()
time.sleep(2)

在主代码中一切正常,screen 被创建,然后保存在 storage_file.txt 中,然后当 fish simulator 执行 settings.py 时,settings.py 提取 { {1}} 作为字符串,当我尝试运行 screen 时,它给了我一个错误提示

pygame.draw.rect(screen,10))

所以我从 TypeError: argument 1 must be pygame.Surface,not str 得到了 surface == <Surface(1234x123x12 SW)> 而不是 surface == "<Surface(1234x123x12 SW)>"。虽然对某些人来说这似乎很愚蠢,但我非常绝望,以至于我尝试了 raw_input() 和 exec(),因为我找不到关于这个问题的任何其他内容,而且我也查看了这些地方,但它不是我想要的需要:

TypeError: argument 1 must be pygame.Surface,not str How do I fix?

TypeError: argument 1 must be pygame.Surface,not str [Pygame using buttons]

TypeError: argument 1 must be pygame.Surface,not 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/

解决方法

如果要将屏幕保存为文件,则需要将其转换为数字:

width 是屏幕宽度 高度是屏幕高度

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")       

然后将其写回,您可以颠倒这个过程。

Surfarray 需要 numpy。我可能有错误的数组索引,所以你可能需要稍微尝试一下。

将它们读回:

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,b,a))
            x += 1
            if x == self.width:
                y += 1
                x = 0
            

这将读回值并将它们设置在表面上。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。