当前位置: 首页 > 知识库问答 >
问题:

TypeError:参数1必须是pygame.Surface,而不是str[pygame使用按钮]

锺英彦
2023-03-14

你好,我正在创建一个游戏使用pyplay和我有一些问题。我创建了一些按钮(使用图像),并根据某些操作,此按钮的图像将发生变化。我将向您展示代码中存在错误的部分。抱歉,我是西班牙人,我的英语不好。这是代码:

import pygame
from pygame.locals import *
import time
pygame.init()

display_weight = 800
display_height = 600

gameDisplay = pygame.display.set_mode((display_weight, display_height), pygame.RESIZABLE)
pygame.display.set_caption("I NEED HELP :d")
clock = pygame.time.Clock()

#BUTTONS IMAGE
default_ap = pygame.image.load('button_menu_ap.png')
default_ip = pygame.image.load('button_menu_ip.png')
chewbacca_ip = pygame.image.load('button_select_GalaxyWars_chewbacca_ip.png')
chewbacca_ap = pygame.image.load('button_select_GalaxyWars_chewbacca_ap.png')

def button_img(x,y,w,h,ip,ap,action=None,especific1=None,especific2=None,especific3=None,especific4=None,especific5=None,especific6=None\
               ,especific7=None,especific8=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    if x+w > mouse[0] > x and y+h > mouse [1] > y:
        gameDisplay.blit(ap, (x,y))
        if click [0] == 1 and action != None:
            if especific1 != None:
                if especific2 != None:
                    if especific2 != None and especific3 != None and especific4 != None and especific5 != None and especific6 != None \
                       and especific7 != None and especific8 != None:
                        action(especific1, especific2, especific3, especific4, especific5, especific6, especific7, especific8)
                    else:
                        action(especific1, especific2)
                else:
                    action(especific1)
            else:
                action()
    else:
        gameDisplay.blit(ip, (x,y))

    pygame.display.update()

def select_p1(nombre):
    nombre_ip = (nombre + '_ip')
    nombre_ap = (nombre + '_ap')
    return button_img(display_weight/2-300,display_height/2-250,100,100,nombre_ip,nombre_ap,select_categoria,1,nombre)

    pygame.display.update()

def select_categoria(num):
    global gameDisplay, display_weight,display_height
    select_categoria = True
    gameDisplay.fill((255,255,255))
    while select_categoria:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                quit()
            # Este es el código que redimensiona la ventana
            if event.type == VIDEORESIZE:
                # Recrea la ventana con el nuevo tamaño
                display_weight = event.w
                display_height = event.h
                gameDisplay = pygame.display.set_mode((display_weight, display_height),
                                                  pygame.RESIZABLE)

        button_img(display_weight/2-125,display_weight/2-125,250,60,button_select_categoria_ip,button_select_categoria_ap, select_GalaxyWars, num)
        pygame.display.update()

        clock.tick(15)

    clock.tick(15)
select_p1 ('default')

那么错误就是那个:

Traceback (most recent call last):
  File "C:/Users/win/Desktop/MARCOS/PYTHON/PROYECTO HGA/HELP.py", line 73, 
in <module>
select_p1 ('default')
  File "C:/Users/win/Desktop/MARCOS/PYTHON/PROYECTO HGA/HELP.py", line 46, 
in select_p1
    return button_img(display_weight/2-300,display_height/2-
250,100,100,nombre_ip,nombre_ap,select_categoria,1,nombre)
  File "C:/Users/win/Desktop/MARCOS/PYTHON/PROYECTO HGA/HELP.py", line 39, 
in button_img
    gameDisplay.blit(ip, (x,y))
TypeError: argument 1 must be pygame.Surface, not str

例如,在代码的最后一行:

select_p1 ('default')

如果我把默认,图像是那些所谓的default_ap和default_ip,那些:

default_ap = pygame.image.load('button_menu_ap.png')
default_ip = pygame.image.load('button_menu_ip.png')

如果我把丘巴卡,图像将被称为chewbacca_ap和chewbacca_ip。

拜托,有人知道解决我问题的方法吗,请告诉我。

共有2个答案

桂高义
2023-03-14

我有一个字符字典:cheracters={'default':0,'chewbacca':1,'stormsolider':2}

首先,我认为这应该是一份清单。您存储的只是物品位置。

如果我明白你想做什么,你想要一本图像词典

例如

ap = {
    'default' : 'button_menu_ap.png', 
    'chewbacca' : 'button_select_GalaxyWars_chewbacca_ap.png'
} 

nombre = 'chewbacca'
chewbacca_ap = pygame.image.load(ap[nombre])
郑乐池
2023-03-14

错误是不言自明的:

    gameDisplay.blit(ip, (x,y))
TypeError: argument 1 must be pygame.Surface, not str

对象ip应该是一个pyplay。Surface,取而代之的是一个str。也许你想创建一个字典:

button_image_dict = {'default_ip': default_ip,
                     'default_ap': default_ap,
                     'chewbacca_ip': chewbacca_ip,
                     'chewbacca_ap': chewbacca_ap}

然后使用此字典从字符串中查找对象:

gameDisplay.blit(button_image_dict[ip], (x,y))
 类似资料:
  • 我有一个问题,我做了一个乒乓游戏,但我有一个问题,把分数打印到pyplay窗口。 我得到错误'TypeError:参数1必须是pygame.Surface,而不是str 我在文本中输入了blit,但出现了一个错误。我知道代码乱七八糟,我稍后会修复它

  • 我正在使用pygame创建一个游戏,但遇到了一个错误,我是pygame的新手。我正在使用python 3.8和pycharm社区版2020.1 这是我制作游戏的视频:https://www.youtube.com/watch?v=FfWpgLFMI7w这里是错误: 这是我的密码:

  • 我无法理解Stackoverflow中的其他问题。当圆圈向屏幕末端移动时,它会向相反方向移动。 发出错误消息而未执行。 screen.blit(圆圈,[x,y]) 类型错误:参数1必须是pygame.Surface,而不是pygame.Rect 有什么问题吗?

  • 我正在用python制作一个潜艇游戏,但当我试图运行它时,解释器给了我一个非常奇怪的错误:“TypeError:参数1必须是pygame.Surface,而不是type。”我试图在网上搜索我的答案,但这似乎不是很常见的错误。我也试着自己去发现错误,但我觉得一切都很好。下面是我认为错误所在的部分代码:

  • 我一直在遵循的python flappy鸟AI教程从techwith timm,我得到了这个错误; 我的代码是这样的 我读过其他文章也有同样的问题,我理解,但是不是像那样的列表。我不知道该怎么办。 我试着做来获取“列表”的第一个图像,但它说对象不是列表。为什么?