鱼C论坛

 找回密码
 立即注册
查看: 2549|回复: 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里边,原因是,截图时我是反着截图的,先选矩形的右下角,然后再选左上角,拖动的时候就会报错

  1. import pygame
  2. import sys

  3. class Cut:
  4.     mouse_button_left             = 1
  5.     mouse_button_mid             = 2
  6.     mouse_button_right           = 3
  7.     mouse_button_up               = 4
  8.     mouse_button_down          = 5

  9.     select = 0
  10.     draw = 0

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

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

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

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

  30.         self.color_img()

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

  33.     def cut(self):
  34.         while True:
  35.             for event in pygame.event.get():
  36.                 if event.type == pygame.QUIT:
  37.                     sys.exit()
  38.                     
  39.                 if event.type == pygame.MOUSEBUTTONDOWN:
  40.                     if event.button == self.mouse_button_left:
  41.                         #第一次选择,选择范围
  42.                         if self.select == 0 and self.draw == 0:
  43.                             self.select = 1
  44.                             self.pos_start = pygame.mouse.get_pos()
  45.                         #开始拖动,拖动中
  46.                         if self.select == 2 and self.draw == 0:
  47.                             self.draw = 1
  48.                             self.capture = self.screen.subsurface(self.select_rect).copy()
  49.                             self.cap_rect = self.capture.get_rect()
  50.                         if self.select == 2 and self.draw == 2:
  51.                             self.select = 1
  52.                             self.draw = 0
  53.                             self.pos_start = pygame.mouse.get_pos()
  54.                            
  55.                     #mouse右键取消选中
  56.                     if event.button == self.mouse_button_right:
  57.                         self.select = 0
  58.                         self.draw = 0
  59.                         
  60.                 if event.type == pygame.MOUSEBUTTONUP:
  61.                     if event.button == self.mouse_button_left:
  62.                         #第一次释放,选择完成
  63.                         if self.select == 1 and self.draw == 0:
  64.                             self.select = 2
  65.                             self.pos_stop = pygame.mouse.get_pos()
  66.                         #第二次释放,拖动完成
  67.                         if self.select == 2 and self.draw == 1:
  68.                             self.draw = 2
  69.                         if self.select == 0 and self.draw == 0:
  70.                             pass
  71.                     if event.button == self.mouse_button_right:
  72.                         pass

  73.             self.color_img()
  74.             #实时绘图
  75.             if self.select:
  76.                 mouse_pos = pygame.mouse.get_pos()
  77.                 self.select_rect.left, self.select_rect.top = self.pos_start
  78.                 if self.select == 1:
  79.                     self.select_rect.width, self.select_rect.height = mouse_pos
  80.                 else:
  81.                     self.select_rect.width, self.select_rect.height = self.pos_stop
  82.                 self.select_rect.width, self.select_rect.height = \
  83.                                         self.select_rect.width - self.pos_start[0], self.select_rect.height - self.pos_start[1]
  84.                 pygame.draw.rect(self.screen, (0, 255, 0), self.select_rect, 1)

  85.             #拖动裁剪的图像
  86.             if self.draw:
  87.                 mouse_pos = pygame.mouse.get_pos()
  88.                 if self.draw == 1:
  89.                     self.cap_rect.center = mouse_pos
  90.                 self.screen.blit(self.capture, self.cap_rect)
  91.             
  92.             #更新界面
  93.             pygame.display.update()

  94. if __name__ == '__main__':
  95.     """width = int(input('请输入window的width:'))
  96.     height = int(input('请输入window的height:'))"""
  97.     cut = Cut()
  98.     cut.cut()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-5-10 18:42:26 | 显示全部楼层
没代码没真相,你比对下哪里敲错了,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 19:14:45 | 显示全部楼层
请贴出代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-11 00:14:22 | 显示全部楼层
内存溢出啦 。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. class Cut:
  4.     mouse_button_left             = 1
  5.     mouse_button_mid             = 2
  6.     mouse_button_right           = 3
  7.     mouse_button_up               = 4
  8.     mouse_button_down          = 5

  9.     select = 0
  10.     draw = 0

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

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

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

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

  30.         self.color_img()

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

  33.     def cut(self):
  34.         while True:
  35.             for event in pygame.event.get():
  36.                 if event.type == pygame.QUIT:
  37.                     sys.exit()
  38.                     
  39.                 if event.type == pygame.MOUSEBUTTONDOWN:
  40.                     if event.button == self.mouse_button_left:
  41.                         #第一次选择,选择范围
  42.                         if self.select == 0 and self.draw == 0:
  43.                             self.select = 1
  44.                             self.pos_start = pygame.mouse.get_pos()
  45.                         #开始拖动,拖动中
  46.                         if self.select == 2 and self.draw == 0:
  47.                             self.draw = 1
  48.                             self.capture = self.screen.subsurface(self.select_rect).copy()
  49.                             self.cap_rect = self.capture.get_rect()
  50.                         if self.select == 2 and self.draw == 2:
  51.                             self.select = 1
  52.                             self.draw = 0
  53.                             self.pos_start = pygame.mouse.get_pos()
  54.                            
  55.                     #mouse右键取消选中
  56.                     if event.button == self.mouse_button_right:
  57.                         self.select = 0
  58.                         self.draw = 0
  59.                         
  60.                 if event.type == pygame.MOUSEBUTTONUP:
  61.                     if event.button == self.mouse_button_left:
  62.                         #第一次释放,选择完成
  63.                         if self.select == 1 and self.draw == 0:
  64.                             self.select = 2
  65.                             self.pos_stop = pygame.mouse.get_pos()
  66.                         #第二次释放,拖动完成
  67.                         if self.select == 2 and self.draw == 1:
  68.                             self.draw = 2
  69.                         if self.select == 0 and self.draw == 0:
  70.                             pass
  71.                     if event.button == self.mouse_button_right:
  72.                         pass

  73.             self.color_img()
  74.             #实时绘图
  75.             if self.select:
  76.                 mouse_pos = pygame.mouse.get_pos()
  77.                 self.select_rect.left, self.select_rect.top = self.pos_start
  78.                 if self.select == 1:
  79.                     self.select_rect.width, self.select_rect.height = mouse_pos
  80.                 else:
  81.                     self.select_rect.width, self.select_rect.height = self.pos_stop
  82.                 self.select_rect.width, self.select_rect.height = \
  83.                                         self.select_rect.width - self.pos_start[0], self.select_rect.height - self.pos_start[1]
  84.                 pygame.draw.rect(self.screen, (0, 255, 0), self.select_rect, 1)

  85.             #拖动裁剪的图像
  86.             if self.draw:
  87.                 mouse_pos = pygame.mouse.get_pos()
  88.                 if self.draw == 1:
  89.                     self.cap_rect.center = mouse_pos
  90.                 self.screen.blit(self.capture, self.cap_rect)
  91.             
  92.             #更新界面
  93.             pygame.display.update()

  94. if __name__ == '__main__':
  95.     """width = int(input('请输入window的width:'))
  96.     height = int(input('请输入window的height:'))"""
  97.     cut = Cut()
  98.     cut.cut()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

代码贴出来了,麻烦看下什么原因
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-11 09:34:11 | 显示全部楼层
谢谢各位,本人已解决,出错原因是:构建subSurface的时候,rect的width和height成了负值,所以出错了。
本人修改了实时绘图里边将width和height为负的情况考虑进去就没有错了
  1.             #实时绘图
  2.             if self.select:
  3.                 mouse_pos = pygame.mouse.get_pos()
  4.                 self.select_rect.left, self.select_rect.top = self.pos_start
  5.                 if self.select == 1:
  6.                     self.select_rect.width, self.select_rect.height = mouse_pos
  7.                 else:
  8.                     self.select_rect.width, self.select_rect.height = self.pos_stop
  9.                 self.select_rect.width, self.select_rect.height = \
  10.                                         self.select_rect.width - self.pos_start[0], self.select_rect.height - self.pos_start[1]
  11.                 if self.select_rect.width < 0:
  12.                     self.select_rect.left += self.select_rect.width
  13.                     self.select_rect.width = abs(self.select_rect.width)
  14.                 if self.select_rect.height < 0:
  15.                     self.select_rect.top += self.select_rect.height
  16.                     self.select_rect.height = abs(self.select_rect.height)
  17.                 pygame.draw.rect(self.screen, (0, 255, 0), self.select_rect, 1)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 12:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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