用python的pygame,但每次程序一运行,pygame window窗口能出现,但是下图这种状态。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用python的pygame,但每次程序一运行,pygame window窗口能出现,但是下图这种状态。相关的知识,希望对你有一定的参考价值。
有达人能告诉我这是什么原因以及解决方法么?我的python版本是2.7.3,pygame版本1.9.1
可能我说的不太清楚。就是pygame window不会被黑色填充,直接没有响应,然后窗口里没有内容,上图是它复制了背景的内容。就像快死机了一样。
event英文翻译是事件 get 获取 type是样式,类型的意思,所以他这个都是有规律的,但是有顺序事件在前,后面跟属性
同时也有父子(层级)关系
event.get() 获取到的事件
event.type() 事件类型
event.key() 按键事件
一般都是写在while里面,因为这是个不断循环的过程,不然,只执行一便达不到实际要求,这是Pygame里面设定好的
这是贪吃蛇游戏的一段代码(一部分):
txt = font.render('GAME OVER', True, (255, 0, 0))screen.blit(txt, (size[0]/6, size[1]*2/5-20)) # (0, 0) (size[0]/6, size[1]*2/5)100号字中心位置
direction = 'right' # 初始方向,向右
changeDirection = direction # 定义一个改变方向的变量,按键
running = True
while Trunning:
for event in pygame.event.get(): # 从队列中获取事件
if event.type == QUIT: # 判断事件类型是否为退出事件
# pygame.quit()
sys.exit()
elif event.type == KEYDOWN: # 如果按键被按下(事件)
if event.key == K_RIGHT or event.key == K_d: # 如果是右键头或者是d,蛇向右移动
changeDirection = 'right'
if event.key == K_LEFT or event.key == K_a: # 如果是左键头或者是a,蛇向左移动
changeDirection = 'left'
if event.key == K_UP or event.key == K_w:
changeDirection = 'up'
if event.key == K_DOWN or event.key == K_s:
changeDirection = 'down'
#这下面一行可以忽略,
if event.key == K_ESCAPE: # 对应键盘上的Esc键,表示退出
pygame.event.post(pygame.event.Event(QUIT))
# 绘制文本,刷新显示
screen.blit(txt, (20, 10))
screen.fill(blackColor) #放在for语句一列,属于while的(子)层级,循环不断的刷新 参考技术A
import pygame,sys
from pygame.locals import *
pygame.init()
WINDOWWIDTH=480
WINDOWHEIGHT=700
caption_name='Hello Woad'
DISPLAYSURF=pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))
pygame.display.set_caption(caption_name)
while True:
DISPLAYSURF.fill((255,255,255))#初始化屏幕 白色
for event in pygame.event.get():
if event.type == QUIT:#退出检测
pygame.quit()
sys.exit()
pygame.display.update()#更新
def run(self):
self.screen.fill((255,255,255))
whileTrue:
# max fps limit
self.clock.tick(30)
for event in pygame.event.get():
if event.type== QUIT:
return
elif event.type== KEYDOWN:
pass
elif event.type== MOUSEBUTTONDOWN:
pass
elif event.type== MOUSEMOTION:
pass
elif event.type== MOUSEBUTTONUP:
pass
pygame.display.update()
对于消息处理,在pass那里,改成自己想要的函数就可以实现对应的功能了。
还有,你可以看看eyehere.net 上面的pygame教程。追问
您能帮我看看这段么?我是初学者,正在看和孩子一起学python,下面是书上的例子。
import pygame,sys
pygame.init()
screen = pygame.display.set_mode([640,480])
screen.fill([255,255,255])
pygame.draw.circle(screen,[255,0,0],[100,100],30,0)
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
你的程序我这里运行没有问题,你的pygame有和你的python版本对应么。
本回答被提问者采纳 参考技术C while True:for event in pygame.event.get():
if event.type = = pygame.QUIT:
pygame.quit()
quit()
# 屏幕填充在while循环下,而不在for循环下
screen.fill((0, 0, 0))
# 反转屏幕以展示最近一次的绘制,非常重要!
pygame.display.flip() 参考技术D 你的while True没有处理,也没有main loop
进入了死循环,当然没有响应了
为啥 PyGame 中根本没有绘制任何内容?
【中文标题】为啥 PyGame 中根本没有绘制任何内容?【英文标题】:Why is nothing drawn in PyGame at all?为什么 PyGame 中根本没有绘制任何内容? 【发布时间】:2021-03-14 18:14:00 【问题描述】:我已经使用 pygame 在 python 中启动了一个新项目,对于背景,我希望下半部分用灰色填充,上半部分为黑色。我以前在项目中使用过矩形绘图,但由于某种原因它似乎坏了?我不知道我做错了什么。最奇怪的是每次运行程序的结果都不一样。有时只有黑屏,有时灰色矩形会覆盖部分屏幕,但不会覆盖一半屏幕。
import pygame, sys
from pygame.locals import *
pygame.init()
DISPLAY=pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
【问题讨论】:
在哪里更新显示? (pygame.display.update()
或 pygame.display.flip()
)
使用这个:pygame.display.update()
【参考方案1】:
您需要更新显示。
您实际上是在 Surface
对象上绘图。如果您在与 PyGame 显示关联的 Surface 上绘图,则它不会立即在显示中可见。当使用pygame.display.update()
或pygame.display.flip()
更新显示时,这些更改变为可见。
见pygame.display.flip()
:
这将更新整个显示的内容。
pygame.display.flip()
将更新整个显示的内容,pygame.display.update()
只允许更新屏幕的一部分,而不是整个区域。 pygame.display.update()
是 pygame.display.flip()
的优化版本,适用于软件显示,但不适用于硬件加速显示。
典型的 PyGame 应用程序循环必须:
通过调用pygame.event.pump()
或pygame.event.get()
来处理事件。
根据输入事件和时间(分别为帧)更新游戏状态和对象位置
清空整个显示或绘制背景
绘制整个场景(绘制所有对象)
通过调用pygame.display.update()
或pygame.display.flip()
更新显示
使用pygame.time.Clock.tick
限制每秒帧数以限制 CPU 使用率
import pygame
from pygame.locals import *
pygame.init()
DISPLAY = pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
clock = pygame.time.Clock()
run = True
while run:
# handle events
for event in pygame.event.get():
if event.type == QUIT:
run = False
# clear display
DISPLAY.fill(0)
# draw scene
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))
# update display
pygame.display.flip()
# limit frames per second
clock.tick(60)
pygame.quit()
exit()
repl.it/@Rabbid76/PyGame-MinimalApplicationLoop 另见Event and application loop
【讨论】:
@MinerBat 这似乎是与您的系统缺乏清除和刷新显示有关的副作用。这没有合乎逻辑的理由。与系统的内部交互也与事件处理有关。见pygame.event.pump()
。【参考方案2】:
只需将代码更改为:
import pygame, sys
from pygame.locals import *
pygame.init()
DISPLAY=pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))
pygame.display.flip() #Refreshing screen
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
应该有帮助
【讨论】:
以上是关于用python的pygame,但每次程序一运行,pygame window窗口能出现,但是下图这种状态。的主要内容,如果未能解决你的问题,请参考以下文章
用Python3 的pygame模块实现塔防小游戏,女神看了都称厉害
运行 PyGame 程序而不启动到 Desktop Raspberry Pi