[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] Delay in MOUSEBUTTONUP after application start



I have been working on the development of a number of demonstration games using pygame.  I use these as demonstration pieces in classes that I teach.

I do my development on an older Mac using Mac OS X 10.12.6, with Python 3.6.1 and pygame (not sure how to check what version, but fairly recent).   I'm running these demo programs in IDLE.

I have built a library of user interface widgets that I use often.  One of these is a typical button widget.  My button widget code shows an "up" state', an "over" state, and a "down" state image.  I have used this code for years, and it works well.  However, I have seen an odd behavior at the start of the programs.  

I finally decided to do some debugging and found that the problem is in pygame sending the MOUSEBUTTONUP event.  If I click right away after starting the program, the MOUSEBUTTONDOWN event comes in followed quickly by a MOUSEBUTTONUP.  If I click again quickly, I get the MOUSEBUTTONDOWN event, BUT, there is a delay of about one to three second before my code gets the related MOUSEBUTTONUP event.  Other events work fine, and I can tell that the program is still running through the main loop (I can output a count of frames to the shell window, and that continues to increase).  The MOUSEBUTTONUP eventually does happen after the delay.  After that, all the MOUSEBUTTONUP events come in just fine, and my code works well.  Button clicks work perfectly.



Here is a minimal program (without using my interface widgets) that demonstrates the problem.  I just click on the background of the window, and the program outputs a message to the shell when it gets the MOUSEBUTTONDOWN and MOUSEBUTTONUP events:

import pygame
from pygame.locals import *
import sys

BACKGROUND_COLOR = (0, 180, 180)
WINDOW_WIDTH = 640
WINDOW_HEIGHT = 480
FRAMES_PER_SECOND = 30 

pygame.init()
window = pygame.display.set_mode([WINDOW_WIDTH, WINDOW_HEIGHT])
clock = pygame.time.Clock()  # set the speed (frames per second)
counter = 0

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            # if it is quit, the program
            pygame.quit()
            sys.exit()
            
        if event.type == MOUSEBUTTONUP:
            print('******* Got a MOUSEBUTTONUP *******')

        if event.type == MOUSEBUTTONDOWN:
            print('******* Got a MOUSEBUTTONDOWN *******')

    print(counter)
    counter = counter + 1

    window.fill(BACKGROUND_COLOR)
    pygame.display.update()
    clock.tick(FRAMES_PER_SECOND)  # make PyGame wait the correct amount


Here is a sample run:

I clicked the background right way (notice first matching MOUSEBUTTONDOWN and MOUSEBUTTONUP) work fine.

Then I clicked again (got a MOUSEBUTTONDOWN right away, but notice how many frames elapsed before the related MOUSEBUTTONUP).  

After the long delay, the MOUSEBUTTONDOWN and MOUSEBUTTONUP's all work fine and respond quickly.


Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> 
 RESTART: /Users/irvkalb/Desktop/PygWidgets Dev/pygame MOUSEBUTTONDOWN bug.py 
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
******* Got a MOUSEBUTTONDOWN *******
18
19
******* Got a MOUSEBUTTONUP *******
20
21
22
23
24
25
26
27
28
29
30
31
******* Got a MOUSEBUTTONDOWN *******
32
33
34
35
36
37
38
39
40
41
<------------------------   Snipped 42 to 137 to save space!    -------------->
138
139
140
141
142
143
144
******* Got a MOUSEBUTTONUP *******
145
146
147
148
149
150
151
152
153
******* Got a MOUSEBUTTONDOWN *******
154
******* Got a MOUSEBUTTONUP *******
155
156
157
158
159
160
161
162
163
164
165
******* Got a MOUSEBUTTONDOWN *******
166
167
168
******* Got a MOUSEBUTTONUP *******
169
170
171


I see this type of output consistently.

I am curious to know if anyone else has seen this behavior - or can reproduce it with this simple program (you can comment out the print statement that prints the loop counts).  More importantly, is there anything that can be done about it?  Not a big problem - just an annoyance.

Irv