2017-08-11 593 views
1

我试图在基于一个事件,一个MIDI输入pygame的窗口位块传输的图像,然后根据的blit的下一个事件,另一个MIDI输入另一个图像。这里发生的是当我按下midi键盘上的按键时,图像弹出一秒钟。我需要它留在窗口中,即使在我输入另一个输入并输出另一个图像之后。如何处理此情况是,我的MIDI键盘上的每个按键被记录为数字(1-88),并加入到NoteList[]那么图像是使用h,项目blit的窗口中NoteList x坐标。在我的实际pygame中的h变量也将通过一组函数,我只是想弄清楚这部分以简单的pygame的窗口。screen.blit(图像)pygame的,图像消失

going = True 
while going: 
    screen.fill(white) 
    events = event_get() 
    NoteList=[] 
    for e in events: 
     if e.type in [QUIT]: 
      going = False 
     if e.type in [KEYDOWN]: 
      going = False 
      events = pygame.event.get() 
     if e.type in [pygame.midi.MIDIIN]: 
      print(str(e.data1)) 
      NoteList.append(int(e.data1-20)) 
    for h in NoteList: 
      screen.blit(EthnoteIMG, (int(h), 100)) 
    pygame.display.update() 

回答

0

您需要定义NoteList外while循环,如果票据应该坚持的,否则你创建一个新的空单每一次迭代。

NoteList = [] 

going = True 
while going: 
    for e in pygame.event.get(): 
     if e.type == pygame.QUIT: 
      going = False 
     elif e.type == pygame.midi.MIDIIN: 
      print(str(e.data1)) 
      NoteList.append(int(e.data1-20)) 

    screen.fill(white) 

    for h in NoteList: 
     screen.blit(EthnoteIMG, (int(h), 100)) 

    pygame.display.update() 

可以使用enumerate函数来移动位置:

for g, h in enumerate(NoteList): 
    screen.blit(EthnoteIMG, (g*12, int(h))) 
+0

我还建议添加一个时钟'时钟= pygame.time.Clock()',然后限制帧的通过在while循环中调用'clock.tick(30)#或60'来提高速度。 – skrx

+0

好的,谢谢。你知道我会怎么做这样的while循环内:G = 0,而g>的8:G + = 1个screen.blit(IMG,(G * 12),INT(H)),它只有通过去循环一次,我每次输入的东西通过MIDI –

+0

我已经添加了一个段落的答案。那是你要的吗? – skrx

0

我相信这个问题是你每次充满屏幕,而循环运行,但你刚才的blit在屏幕上的形象在事件发生时...

试试这个:

screen.fill(white) 
going = True 
while going: 
    events = event_get() 
    NoteList=[] 
    for e in events: 
     if e.type in [QUIT]: 
      going = False 
     if e.type in [KEYDOWN]: 
      going = False 
      events = pygame.event.get() 
     if e.type in [pygame.midi.MIDIIN]: 
      print(str(e.data1)) 
      NoteList.append(int(e.data1-20)) 
    for h in NoteList: 
     screen.fill(white) 
     screen.blit(EthnoteIMG, (int(h), 100)) 
    pygame.display.update()