Python 3.x 将pygame keyDown事件与pygame混合器一起使用时出错

Python 3.x 将pygame keyDown事件与pygame混合器一起使用时出错,python-3.x,pygame,Python 3.x,Pygame,因此,我试图搞乱Pygame模块,我使用了Pygame.mixer和Pygame.key。但是,当我运行下面的代码块时,它会生成一个错误 import pygame, sys pygame.init() window = pygame.display.set_mode((600,400)) kick = pygame.mixer.Sound("kick.wav") clap = pygame.mixer.Sound("clap.wav") while True: for event

因此,我试图搞乱
Pygame
模块,我使用了
Pygame.mixer
Pygame.key
。但是,当我运行下面的代码块时,它会生成一个错误

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()
代码:

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()
错误消息:

*** error for object 0x101008fd0: pointer being freed was not allocated
import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()

任何帮助都会很好

我对您的代码进行了修改,结果成功了——LinuxMint、Python2.7.10

import pygame

pygame.init() # init all modules

window = pygame.display.set_mode((600,400)) # required by event

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
    pygame.event.get() # required by get_pressed()

    keyPressed = pygame.key.get_pressed()
    if keyPressed[pygame.K_a]:
        print "A"
        pygame.mixer.Sound.play(kick)
    if keyPressed[pygame.K_d]:
        print "D"
        pygame.mixer.Sound.play(clap)
import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()

但是您可能会遇到不同的问题,我也帮不了您。

代码不起作用的原因有很多,请参见下面我的

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()
首先,您必须为pygame创建一个要运行的显示窗口

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()
window = pygame.display.set_mode((600,400))
第二个,请注意,您正在为kick和clap变量指定一个声音对象。这些是具有play()方法的声音对象,可以使用点运算符引用该方法。这不是错误,只是有点不必要。阅读以查看声音和播放()参数。您可以简单地执行以下操作:

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()
kick.play()
最后,一种更为传统的事件处理方式

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()
   for event in pygame.event.get():
       if event.type == pygame.KEYDOWN:
           if event.key == pygame.K_a:
这是一个malloc“双重自由”错误

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()
看到这个错误,在浏览了很多网站后,他们基本上说了同样的话:

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()
当您在调试器中中断时,您将发现对象是什么。只需查找调用堆栈,就可以找到释放它的位置。这将告诉你它是哪个物体。

设置断点的最简单方法是:

import pygame, sys

pygame.init()

window = pygame.display.set_mode((600,400))

kick = pygame.mixer.Sound("kick.wav")
clap = pygame.mixer.Sound("clap.wav")

while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_a:
            kick.play()
         if event.key == pygame.K_d:
            clap.play()
      if event.type == pygame.QUIT:
         pygame.quit()
         quit()
  • 转到运行->显示->断点(ALT-Command-B)
  • 滚动到列表底部并添加符号
    malloc\u error\u break

  • 以上是链接中接受的答案。

    我认为您应该使用
    pygame.init()
    初始化所有模块。可能操作系统不会在没有窗口的情况下向程序发送(键)事件。@furas它仍然无法工作-即使实现了窗口。您仍然有相同的错误吗?
    get_pressed()
    需要窗口,但它可能与错误无关。顺便说一句:
    get_pressed()
    如果没有
    pygame.event.get()
    ,它将无法工作。我指定了Python3.x,但在2.7下运行它时,它对我有效。谢谢你的帮助。我知道,这些天人们都很刻薄:P不是我。似乎对我不起作用。。。谢谢你的帮助!
    import pygame, sys
    
    pygame.init()
    
    window = pygame.display.set_mode((600,400))
    
    kick = pygame.mixer.Sound("kick.wav")
    clap = pygame.mixer.Sound("clap.wav")
    
    while True:
       for event in pygame.event.get():
          if event.type == pygame.KEYDOWN:
             if event.key == pygame.K_a:
                kick.play()
             if event.key == pygame.K_d:
                clap.play()
          if event.type == pygame.QUIT:
             pygame.quit()
             quit()