lzb1001 发表于 2022-7-8 21:36:51

为何返回错误提示?

本帖最后由 lzb1001 于 2022-7-9 06:22 编辑

# 设置透明度

import pygame
import sys
from pygame.locals import *


pygame.init()


size = width, height = 640, 480
bg = (0, 0, 0)


clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
pygame.display.set_caption('FishC Demo')


turtle = pygame.image.load(r'd:\\work\tortoise.png').convert_alpha()
background = pygame.image.load(r'd:\\work\\grass.jpg').convert()
position = turtle.get_rect()
position.center = width // 2, height // 2
print(position, '\n上:', position.top, '\n下:', position.bottom, '\n左:', position.left, '\n右:', position.right, '\n宽度:', position.width, '\n高度:', position.height, '\n中心点:', position.center)




def blit_alpha(
      target: pygame.Surface,
      source: pygame.Surface,
      location: tuple,
      opacity: int
) -> None:


    x, y = location, location

   
    temp = pygame.Surface((source.get_width(), source.get_height())).convert()

   
    temp.blit(target, (-x, -y))
   
    temp.blit(source, (0, 0))

   
    temp.set_alpha(opacity)

   
    target.blit(temp, location)
   
   


while True:
   
    for event in pygame.event.get():
      if event.type == QUIT:
            sys.exit()


   
    screen.blit(background, (0, 0))
   

   
    blit_alpha(target=screen, source=turtle, opacity=200, location=position)
   

    pygame.display.flip()

    clock.tick(30)

------------------------------------------
Windows 10 专业版 | Python 3.7.6
------------------------------------------

【我的问题】以上代码

---在IDLE中执行后返回错误提示如下:

Traceback (most recent call last):
File "D:\work\p16_5_pg_3_turtle.py", line 51, in <module>
    location: tuple,
TypeError: 'type' object is not subscriptable

---尝试在pycharm中执行,返回错误提示如下:

Traceback (most recent call last):
File "D:/work/p16_5_pg_3_turtle.py", line 51, in <module>
    location: tuple,
TypeError: 'type' object is not subscriptable
libpng warning: iCCP: known incorrect sRGB profile

两个结果相比,后者多了最后一行

但仍不知道哪里错了?是不是因为python版本的问题?

******************************

感谢大神不吝赐教,为新手解疑释惑。

赠人玫瑰,手有余香,好人一生平安!

hrpzcf 发表于 2022-7-8 21:51:13

本帖最后由 hrpzcf 于 2022-7-8 21:58 编辑

报错说第51行,对type类型的数据使用下标取值了。

它这行数提示好像有点不准。
有可能是调用blit_alpha函数传参给location参数的实参类型不对。

lzb1001 发表于 2022-7-9 06:22:30

hrpzcf 发表于 2022-7-8 21:51
报错说第51行,对type类型的数据使用下标取值了。

它这行数提示好像有点不准。


尝试在pycharm中执行,返回错误提示如下:

Traceback (most recent call last):
File "D:/work/p16_5_pg_3_turtle.py", line 51, in <module>
    location: tuple,
TypeError: 'type' object is not subscriptable
libpng warning: iCCP: known incorrect sRGB profile

注意最后一行的提示。

wp231957 发表于 2022-7-9 06:56:47

lzb1001 发表于 2022-7-9 06:22
尝试在pycharm中执行,返回错误提示如下:

Traceback (most recent call last):


百度一下,有解决方案的

lzb1001 发表于 2022-7-9 08:43:33

wp231957 发表于 2022-7-9 06:56
百度一下,有解决方案的

libpng warning: iCCP: known incorrect sRGB profile

---已百度找到解决方案

TypeError: 'type' object is not subscriptable

---找不到解决方案

Brick_Porter 发表于 2022-7-9 09:57:50

这个问题严格来说不是TypeError而是版本问题。之前的回答中已经告诉你了,我使用了类型注释,类型注释从Python 3.2就已经引入了,之后也一直在不断变化。使用类型注释最大的好处是可以直接看清楚参数的类型,降低阅读代码难度,省去了猜测参数类型的麻烦。Python的类型注释这个特性非常好的一点是类型注释不是强制的,不是侵入式的,简单来说就是有它没它都可以运行。
解决问题最简单的办法就是删除报错的部分tuple,注意location后面的冒号也要删除。
如果还想保留这个类型注释就要做一些简单的修改,首先在代码开头写上from typing import Tuple(typing是负责类型标注的标准库,不用下载),然后把出错的部分tuple改成Tuple

ba21 发表于 2022-7-9 10:16:43

location: tuple, 这句你是要实现什么功能?代码是复制来的还是你写的?

指定数据类型可以:
location: (int, int),
location: ,
location: tuple(),

hrpzcf 发表于 2022-7-9 10:51:11

lzb1001 发表于 2022-7-9 06:22
尝试在pycharm中执行,返回错误提示如下:

Traceback (most recent call last):


参考6楼,
from typing import Tuple
下面改成location: Tuple

Brick_Porter 发表于 2022-7-9 10:56:32

ba21 发表于 2022-7-9 10:16
location: tuple, 这句你是要实现什么功能?代码是复制来的还是你写的?

指定数据类型可以:


location: tuple这种写法叫做类型注释,用于说明参数的类型。具体来说就是location接受由两个整数组成的元组作为参数,例如(1, 2)可以,但是("a", "b")不可以。

ba21 发表于 2022-7-9 11:28:14

Brick_Porter 发表于 2022-7-9 10:56
location: tuple这种写法叫做类型注释,用于说明参数的类型。具体来说就是location接受由两个整数组成的 ...

是的,我也是这么觉得他要实现(例如(1, 2)可以,但是("a", "b")不可以。),或是指示该参数为一个tuple类型。
事实上 函数注释:它的作用仅仅是为了函数进行注释来用,并不能指定参数类型。,所以 location:"是一个字符串说明",当然你放个类型到这里也不会有问题 如:
location:"是一个字符串说明" == location:str

代码验证:
def test(t: int):
    print('内:',id(t))
    print(t)


a = 'b'
print('外:',id(a))

test('af')

def test(
      t: (int, int),
) -> None:
    print('内:',id(t))
    print(t, t)


a = ('a','1')
print('外:',id(a))

test(a)


from typing import Tuple


def test(
      t: Tuple,
) -> None:
    print('内:',id(t))
    print(t, t)


a = ('a','1')
print('外:',id(a))

test(a)

Brick_Porter 发表于 2022-7-9 12:13:32

ba21 发表于 2022-7-9 11:28
是的,我也是这么觉得他要实现(例如(1, 2)可以,但是("a", "b")不可以。),或是指示该参数为一个tupl ...

你的解释是对的,只有使用第三方库mypy这种才会进行静态类型检查,否则就仅作注释使用。
至于说代码验证部分,Python 3.9以后的版本中可以直接用list、tuple、dict等内置数据类型做类型注释,之前的版本还是得按照你的写法from typing import List, Tuple, Dict等等
Python 3.11还在typing中新增了Self,解决了没法注释返回值是自身同类型的情况
另外Python官方也有意在未来废弃typeing.Dict, typing.List, typing.Tuple这种写法,转而直接使用内置类型进行标注
页: [1]
查看完整版本: 为何返回错误提示?