Я получил ошибку «TypeError: аргумент 1 должен быть pygame.Surface», потому что я пытался разделить значение между двумя кодами Python, используя файл .txt

avatar
hellwraiz
9 мая 2021 в 10:55
69
1
0

print('Hello world!') Я пытаюсь управлять одним окном pygame, используя 2 разных файла python (fish_simulator.py и settings.py), поэтому следующим образом у меня есть fish_simuator.py в качестве основного файла, который будет выполнять settings.py, если что-то происходит, но я столкнулся с проблемой обмена данными между fish simulator.py и settings.py с использованием файла .txt с именем storage_file.txt, так что вот часть моей программы:

Это часть 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, 400), 10, 10))
pygame.display.update()
time.sleep(2)

В основном коде все в порядке, screen создается и затем сохраняется внутри storage_file.txt, а затем, когда fish simulator выполняется settings.py, settings.py извлекает screen как строку и когда я пытаюсь a string, для запуска pygame.draw.rect(screen, (255, 255, 255), (random.randint(1, 400), random.randint(1, 400), 10, 10)) выдает ошибку

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

поэтому вместо surface == <Surface(1234x123x12 SW)> я получил surface == "<Surface(1234x123x12 SW)>" из storage_file.txt. И хотя кому-то это может показаться глупым, но я был в таком отчаянии, что попробовал raw_input() и exec(), так как больше ничего не нашел по этой проблеме, и я тоже искал в этих местах, но это не то, что я нужно:

TypeError: аргумент 1 должен быть pygame.Surface, а не str Как исправить?

TypeError: аргумент 1 должен быть pygame.Surface, а не str [Pygame с использованием кнопок]

TypeError: аргумент 1 должен быть pygame.Surface, а не 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/

Источник
Rabbid76
9 мая 2021 в 10:58
0

Что вы подразумеваете под "из-за преобразования из .txt в .py"?

Rabbid76
9 мая 2021 в 11:00
0

Проблема очевидна. Вы используете переменную screen дважды. Что вы ожидаете от screen = storage_file.read()? sceen — это поверхность, связанная с дисплеем. Вы должны использовать другое имя для файла.

Rabbid76
9 мая 2021 в 11:05
0

Вы не можете сохранить screen Surface в виде текстового файла. Отображение Surface должно быть pygame.Surface, сгенерированным pygame.display.set_mode. Что вы ожидаете от storage_file.write(str(screen))?

hellwraiz
9 мая 2021 в 11:27
0

@Rabbid76 Я имел в виду, что когда я читаю содержимое из storage_file.txt внутри code.py, я технически преобразовываю данные из storage_file.txt в code.py, извините, если это вас смутило, я не знаю, как это объяснить должным образом

Rabbid76
9 мая 2021 в 11:52
0

"Технически я преобразовываю данные из storage_file.txt в code.py [...]" — Нет, вы не делаете ничего подобного. Все, что вы сделали, это сохранили строковое представление объекта Surface.

Rabbid76
9 мая 2021 в 11:53
0

Ваш вопрос все еще не ясен. Вы хотите сохранить снимок экрана или значения некоторых переменных? Это совершенно разные вещи.

hellwraiz
9 мая 2021 в 11:54
0

о... но могу ли я преобразовать строку обратно в поверхностный объект?

hellwraiz
9 мая 2021 в 11:56
0

Я хочу сохранить значение переменной screen внутри fish simulator.py и передать его в settings.py

Ответы (1)

avatar
marienbad
10 мая 2021 в 01:01
1

Если вы хотите сохранить экран в файл, вам нужно преобразовать его в числа:

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

Это считывает значения обратно и устанавливает их на поверхность.

hellwraiz
11 мая 2021 в 07:03
0

Вау, меня сейчас нет дома, но я обязательно попробую, хотя я немного запутался. Как именно я изменю процесс? Нужно ли мне использовать другую команду, такую ​​как surfarray, или я просто переношу значения из файла в переменную?

hellwraiz
11 мая 2021 в 12:15
0

Спасибо за редактирование! Как только я вернусь домой, я попробую, но не могли бы вы сказать мне, почему вы использовали self.surf вместо простого серфинга? Я ОЧЕНЬ новичок в классах, и мне очень трудно понять, как они работают.

marienbad
11 мая 2021 в 12:25
1

Извините, вам нужно только self, если серфинг является частью класса, в противном случае просто используйте серфинг. Я скопировал это из своего собственного кода и использовал класс. Двухминутное учебное пособие: old.reddit.com/r/learnpython/comments/mt4zdo/…