鱼C论坛

 找回密码
 立即注册
查看: 2348|回复: 7

pygame.error: Out of memory

[复制链接]
发表于 2018-5-10 18:01:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 fuwaandhuluwa 于 2018-5-11 09:19 编辑

pygame_error.jpg

这是什么问题呀,82讲练习,可以正常运行,但是随便点几下后会出现内存溢出错误!why?

刚才查看了下,问题出在构建subSurface里边,原因是,截图时我是反着截图的,先选矩形的右下角,然后再选左上角,拖动的时候就会报错
import pygame
import sys

class Cut:
    mouse_button_left             = 1
    mouse_button_mid             = 2
    mouse_button_right           = 3
    mouse_button_up               = 4
    mouse_button_down          = 5

    select = 0
    draw = 0

    select_rect = pygame.Rect(0, 0, 0, 0)

    def color_img(self):
        #设置背景颜色
        bgcolor = (255, 255, 255)
        self.screen.fill(bgcolor)

        #填充背景图片
        self.img_bg = pygame.image.load('pig.jpg')
        self.screen.blit(self.img_bg, (int(self.width * 0.4), int(self.height * 0.4)))
        
    
    def __init__(self, width = 400, height = 500):
        #初始化pygame
        pygame.init()

        self.width =width
        self.height = height
        
        #初始化窗口大小和标题
        self.screen = pygame.display.set_mode((width, height))
        self.title = pygame.display.set_caption('Freedom Cut T_T')

        self.color_img()

        #更新界面
        pygame.display.update()

    def cut(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                    
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == self.mouse_button_left:
                        #第一次选择,选择范围
                        if self.select == 0 and self.draw == 0:
                            self.select = 1
                            self.pos_start = pygame.mouse.get_pos()
                        #开始拖动,拖动中
                        if self.select == 2 and self.draw == 0:
                            self.draw = 1
                            self.capture = self.screen.subsurface(self.select_rect).copy()
                            self.cap_rect = self.capture.get_rect()
                        if self.select == 2 and self.draw == 2:
                            self.select = 1
                            self.draw = 0
                            self.pos_start = pygame.mouse.get_pos()
                            
                    #mouse右键取消选中
                    if event.button == self.mouse_button_right:
                        self.select = 0
                        self.draw = 0
                        
                if event.type == pygame.MOUSEBUTTONUP:
                    if event.button == self.mouse_button_left:
                        #第一次释放,选择完成
                        if self.select == 1 and self.draw == 0:
                            self.select = 2
                            self.pos_stop = pygame.mouse.get_pos()
                        #第二次释放,拖动完成
                        if self.select == 2 and self.draw == 1:
                            self.draw = 2
                        if self.select == 0 and self.draw == 0:
                            pass
                    if event.button == self.mouse_button_right:
                        pass

            self.color_img()
            #实时绘图
            if self.select:
                mouse_pos = pygame.mouse.get_pos()
                self.select_rect.left, self.select_rect.top = self.pos_start
                if self.select == 1:
                    self.select_rect.width, self.select_rect.height = mouse_pos
                else:
                    self.select_rect.width, self.select_rect.height = self.pos_stop
                self.select_rect.width, self.select_rect.height = \
                                        self.select_rect.width - self.pos_start[0], self.select_rect.height - self.pos_start[1]
                pygame.draw.rect(self.screen, (0, 255, 0), self.select_rect, 1)

            #拖动裁剪的图像
            if self.draw:
                mouse_pos = pygame.mouse.get_pos()
                if self.draw == 1:
                    self.cap_rect.center = mouse_pos
                self.screen.blit(self.capture, self.cap_rect)
            
            #更新界面
            pygame.display.update() 

if __name__ == '__main__':
    """width = int(input('请输入window的width:'))
    height = int(input('请输入window的height:'))"""
    cut = Cut()
    cut.cut()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-10 18:42:26 | 显示全部楼层
没代码没真相,你比对下哪里敲错了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 19:14:45 | 显示全部楼层
请贴出代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-11 00:14:22 | 显示全部楼层
内存溢出啦 。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-11 09:10:07 | 显示全部楼层
import pygame
import sys

class Cut:
    mouse_button_left             = 1
    mouse_button_mid             = 2
    mouse_button_right           = 3
    mouse_button_up               = 4
    mouse_button_down          = 5

    select = 0
    draw = 0

    select_rect = pygame.Rect(0, 0, 0, 0)

    def color_img(self):
        #设置背景颜色
        bgcolor = (255, 255, 255)
        self.screen.fill(bgcolor)

        #填充背景图片
        self.img_bg = pygame.image.load('pig.jpg')
        self.screen.blit(self.img_bg, (int(self.width * 0.4), int(self.height * 0.4)))
        
    
    def __init__(self, width = 400, height = 500):
        #初始化pygame
        pygame.init()

        self.width =width
        self.height = height
        
        #初始化窗口大小和标题
        self.screen = pygame.display.set_mode((width, height))
        self.title = pygame.display.set_caption('Freedom Cut T_T')

        self.color_img()

        #更新界面
        pygame.display.update()

    def cut(self):
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                    
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == self.mouse_button_left:
                        #第一次选择,选择范围
                        if self.select == 0 and self.draw == 0:
                            self.select = 1
                            self.pos_start = pygame.mouse.get_pos()
                        #开始拖动,拖动中
                        if self.select == 2 and self.draw == 0:
                            self.draw = 1
                            self.capture = self.screen.subsurface(self.select_rect).copy()
                            self.cap_rect = self.capture.get_rect()
                        if self.select == 2 and self.draw == 2:
                            self.select = 1
                            self.draw = 0
                            self.pos_start = pygame.mouse.get_pos()
                            
                    #mouse右键取消选中
                    if event.button == self.mouse_button_right:
                        self.select = 0
                        self.draw = 0
                        
                if event.type == pygame.MOUSEBUTTONUP:
                    if event.button == self.mouse_button_left:
                        #第一次释放,选择完成
                        if self.select == 1 and self.draw == 0:
                            self.select = 2
                            self.pos_stop = pygame.mouse.get_pos()
                        #第二次释放,拖动完成
                        if self.select == 2 and self.draw == 1:
                            self.draw = 2
                        if self.select == 0 and self.draw == 0:
                            pass
                    if event.button == self.mouse_button_right:
                        pass

            self.color_img()
            #实时绘图
            if self.select:
                mouse_pos = pygame.mouse.get_pos()
                self.select_rect.left, self.select_rect.top = self.pos_start
                if self.select == 1:
                    self.select_rect.width, self.select_rect.height = mouse_pos
                else:
                    self.select_rect.width, self.select_rect.height = self.pos_stop
                self.select_rect.width, self.select_rect.height = \
                                        self.select_rect.width - self.pos_start[0], self.select_rect.height - self.pos_start[1]
                pygame.draw.rect(self.screen, (0, 255, 0), self.select_rect, 1)

            #拖动裁剪的图像
            if self.draw:
                mouse_pos = pygame.mouse.get_pos()
                if self.draw == 1:
                    self.cap_rect.center = mouse_pos
                self.screen.blit(self.capture, self.cap_rect)
            
            #更新界面
            pygame.display.update() 

if __name__ == '__main__':
    """width = int(input('请输入window的width:'))
    height = int(input('请输入window的height:'))"""
    cut = Cut()
    cut.cut()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-11 09:11:11 | 显示全部楼层
塔利班 发表于 2018-5-10 18:42
没代码没真相,你比对下哪里敲错了,

代码贴出来了,麻烦看下什么原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-11 09:34:11 | 显示全部楼层
谢谢各位,本人已解决,出错原因是:构建subSurface的时候,rect的width和height成了负值,所以出错了。
本人修改了实时绘图里边将width和height为负的情况考虑进去就没有错了
            #实时绘图
            if self.select:
                mouse_pos = pygame.mouse.get_pos()
                self.select_rect.left, self.select_rect.top = self.pos_start
                if self.select == 1:
                    self.select_rect.width, self.select_rect.height = mouse_pos
                else:
                    self.select_rect.width, self.select_rect.height = self.pos_stop
                self.select_rect.width, self.select_rect.height = \
                                        self.select_rect.width - self.pos_start[0], self.select_rect.height - self.pos_start[1]
                if self.select_rect.width < 0:
                    self.select_rect.left += self.select_rect.width
                    self.select_rect.width = abs(self.select_rect.width)
                if self.select_rect.height < 0:
                    self.select_rect.top += self.select_rect.height
                    self.select_rect.height = abs(self.select_rect.height)
                pygame.draw.rect(self.screen, (0, 255, 0), self.select_rect, 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-10-14 11:29:52 | 显示全部楼层

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-24 22:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表