pourquoi mon code affiche-t-il toujours les anciens volets ?
Question
Donc, fondamentalement, j'ai deux écrans distincts que je souhaite afficher.Celui qui a 11 volets affichés à l'écran en même temps et une fois que je clique sur un volet nommé clavier, il devrait effacer l'écran et configurer 36 volets qui devraient afficher un clavier (à des fins de test, je n'ai utilisé que trois volets).
Mon problème est qu'une fois que je clique sur le clavier, l'écran s'efface et affiche les 3 volets de test, comme il affiche également mes 10 autres volets provenant de la première page.
Exemple:C'est bien pour commencer :
Ce n'est pas bien.(A, B et C devraient être affichés mais le reste ne devrait pas) :
Voici le code :
import pygame
import sys
white = (255,255,255)
black = (0,0,0)
objs = []
MAIN_BUTTON = 2
KEYBOARD = True
WORDS = False
class Pane():
def __init__(self, textToDisplay, coordinates, screen):
self.textToDisplay = textToDisplay
self.coordinates = coordinates
self.screen = screen
self.font = pygame.font.SysFont('Palace Script MT', 25)
Screen = pygame.display.set_mode((1366,768), 0, 32)
self.screen = Screen
self.screen.fill((white))
def coordinates(self):
return self.coordinates
def text(self):
return self.textToDisplay
def drawPane(self):
textCoords = self.coordinates
self.screen.blit(self.font.render(self.textToDisplay, True, (black)), textCoords)
pygame.draw.rect(self.screen, (black), self.coordinates, 2)
pygame.display.update()
class Screen():
NoOfPanes = 0
Panes = []
paneLocs = [(583, 334, 300, 150),
(633, 150, 200, 125),
(633, 600, 200, 125),
(350, 360, 200, 100),
(925, 360, 200, 100),
(1000, 150, 150, 100),
(275, 150, 150, 100),
(275, 600, 150, 100),
(1000, 600, 150, 100),
(75, 350, 200, 100),
(0, 668, 200, 100)
]
keyboardPaneLocs = [(0, 100, 100, 100),
(0, 200, 100, 100),
(0, 300, 100, 100),
(0, 400, 100, 100)
]
def __init__(self):
pygame.init()
pygame.display.set_caption('Box Test')
self.font = pygame.font.SysFont('Arial', 25)
Screen = pygame.display.set_mode((1366,768), 0, 32)
self.screen = Screen
self.screen.fill((white))
pygame.display.update()
def addPane(self, textToDisplay, keyboardFlag):
if (not keyboardFlag) and (self.NoOfPanes > 11):
print("Limit Reached")
else:
print(int(self.NoOfPanes))
if keyboardFlag:
newPane = Pane(textToDisplay, self.keyboardPaneLocs[self.NoOfPanes], Screen)
else:
newPane = Pane(textToDisplay, self.paneLocs[self.NoOfPanes], Screen)
self.Panes.append(newPane)
self.NoOfPanes = self.NoOfPanes + 1
pygame.display.update()
def drawPanes(self):
for Pane in self.Panes:
Pane.drawPane()
def mousePosition(self):
global clickPos
global releasePos
for event in pygame.event.get():
if event.type == MAIN_BUTTON:
self.Pos = pygame.mouse.get_pos()
return MAIN_BUTTON
else:
return False
def mouseDown(self, posx, posy):
textToReturn = "Nothing selected"
for Pane in self.Panes:
paneCoords = Pane.coordinates
print(str(paneCoords[0]) + ":" + str(paneCoords[1]) + ":" + str(paneCoords[2]) + ":" + str(paneCoords[3]))
if (paneCoords[0] <= posx <= paneCoords[0]+paneCoords[2]) and (paneCoords[1] <= posy <= paneCoords[1]+paneCoords[3]):
textToReturn = Pane.text()
return textToReturn
def displayKeyboard(self):
self.addPane("A", KEYBOARD)
self.addPane("B", KEYBOARD)
self.addPane("C", KEYBOARD)
def clearScreen(self):
Screen = pygame.display.set_mode((1366,768), 0, 32)
self.screen = Screen
self.screen.fill((white))
if __name__ == '__main__':
myScreen = Screen()
myScreen.addPane("1", WORDS)
myScreen.addPane("2", WORDS)
myScreen.addPane("3", WORDS)
myScreen.addPane("4", WORDS)
myScreen.addPane("5", WORDS)
myScreen.addPane("6", WORDS)
myScreen.addPane("7", WORDS)
myScreen.addPane("8", WORDS)
myScreen.addPane("9", WORDS)
myScreen.addPane("10", WORDS)
myScreen.addPane("Keyboard", WORDS)
myScreen.drawPanes()
while True:
ev = pygame.event.get()
for event in ev:
if event.type == pygame.MOUSEBUTTONUP:
posx,posy = pygame.mouse.get_pos()
textSelected = myScreen.mouseDown(posx, posy)
print(textSelected)
if textSelected == "Keyboard":
myScreen = Screen()
myScreen.clearScreen()
myScreen.displayKeyboard()
myScreen.drawPanes()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit(); sys.exit();
Je pense que le problème auquel je suis confronté est que tous ces volets sont ajoutés à la liste Panes = []
.Comment puis-je m'assurer que cette liste est claire avant d'afficher les nouveaux volets grâce à l'utilisation de la fonction def drawPanes(self):
Ne me croyez pas sur parole, ce n’est qu’une hypothèse et je suis bel et bien coincé.(Toute aide est appréciée.)
La solution
Vous pouvez attribuer une liste vide au volet pour la rendre vide
Panes = []
mais vous perdrez à jamais tous les volets ajoutés.
Peut-être devriez-vous créer une liste séparée pour les volets du clavier et dessiner uniquement cette liste.
MODIFIER:
D'ailleurs:
Vous utilisez une variable myScreen
aux deux écrans - lorsque vous exécutez myScreen = Screen(...)
vous créez un nouvel écran mais perdez l'accès à l'écran précédent.
En utilisant Screen = pygame.display.set_mode((1366,768), 0, 32); self.screen = Screen
effacer l'écran est une perte de temps et de souvenirs.Il vous suffit self.screen.fill((white))
Tu utilises Screen
name comme nom de classe et comme variable dans certaines fonctions.Vous pouvez avoir accidentellement un conflit de noms.
MODIFIER:
Exemple de travail complet à quoi pourrait ressembler le code :
j'en utilise un self.screen
donc la fenêtre n'est pas créée/supprimée à chaque fois.
Vous pouvez appuyer sur la touche « ESC » pour afficher/masquer le clavier.
import pygame
import sys
#----------------------------------------------------------------------
WHITE = (255,255,255)
BLACK = (0 ,0 ,0 )
#---------------------------
MAIN_BUTTON = 2
KEYBOARD = True
WORDS = False
#----------------------------------------------------------------------
class Pane():
def __init__(self, textToDisplay, coordinates, screen):
self.textToDisplay = textToDisplay
self.coordinates = coordinates
self.screen = screen
self.font = pygame.font.SysFont('Palace Script MT', 25)
#---------------------------
def coordinates(self):
return self.coordinates
#---------------------------
def text(self):
return self.textToDisplay
#---------------------------
def drawPane(self):
textCoords = self.coordinates
self.screen.blit(self.font.render(self.textToDisplay, True, BLACK), textCoords)
pygame.draw.rect(self.screen, BLACK, self.coordinates, 2)
#----------------------------------------------------------------------
class Application():
NoOfPanes = 0
NoOfKeys = 0
Panes = []
Keys = []
paneLocs = [(583, 334, 300, 150),
(633, 150, 200, 125),
(633, 600, 200, 125),
(350, 360, 200, 100),
(925, 360, 200, 100),
(1000, 150, 150, 100),
(275, 150, 150, 100),
(275, 600, 150, 100),
(1000, 600, 150, 100),
(75, 350, 200, 100),
(0, 668, 200, 100)
]
keyboardPaneLocs = [(0, 100, 100, 100),
(0, 200, 100, 100),
(0, 300, 100, 100),
(0, 400, 100, 100)
]
#---------------------------
def __init__(self):
pygame.init()
pygame.display.set_caption('Box Test')
self.font = pygame.font.SysFont('Arial', 25)
self.screen = pygame.display.set_mode((1366,768), 0, 32)
self.show_panes = True
self.show_keyboard = False
self.createPanes()
self.createKeyboard()
#---------------------------
def close(self):
print "pygame quit"
pygame.quit()
sys.exit()
#---------------------------
def createPanes(self):
self.addPane("1", WORDS)
self.addPane("2", WORDS)
self.addPane("3", WORDS)
self.addPane("4", WORDS)
self.addPane("5", WORDS)
self.addPane("6", WORDS)
self.addPane("7", WORDS)
self.addPane("8", WORDS)
self.addPane("9", WORDS)
self.addPane("10", WORDS)
self.addPane("Keyboard", WORDS)
#---------------------------
def createKeyboard(self):
self.addPane("A", KEYBOARD)
self.addPane("B", KEYBOARD)
self.addPane("C", KEYBOARD)
#---------------------------
def addPane(self, textToDisplay, keyboardFlag):
if (not keyboardFlag) and (self.NoOfPanes > 11):
print("Limit Reached")
else:
print(int(self.NoOfPanes))
if keyboardFlag:
self.Keys.append(Pane(textToDisplay, self.keyboardPaneLocs[self.NoOfKeys], self.screen))
self.NoOfKeys += 1
else:
self.Panes.append(Pane(textToDisplay, self.paneLocs[self.NoOfPanes], self.screen))
self.NoOfPanes += 1
#---------------------------
def drawPanes(self):
for Pane in self.Panes:
Pane.drawPane()
#---------------------------
def drawKeyboard(self):
for Key in self.Keys:
Key.drawPane()
#---------------------------
def mousePosition(self, event):
if event.type == MAIN_BUTTON:
self.Pos = pygame.mouse.get_pos()
return MAIN_BUTTON
else:
return False
#---------------------------
def mouseDown(self):
posx,posy = pygame.mouse.get_pos()
textToReturn = "Nothing selected"
if self.show_panes:
for Pane in self.Panes:
paneCoords = Pane.coordinates
print(str(paneCoords[0]) + ":" + str(paneCoords[1]) + ":" + str(paneCoords[2]) + ":" + str(paneCoords[3]))
if (paneCoords[0] <= posx <= paneCoords[0]+paneCoords[2]) and (paneCoords[1] <= posy <= paneCoords[1]+paneCoords[3]):
textToReturn = Pane.text()
elif self.show_keyboard:
for Pane in self.Keys:
paneCoords = Pane.coordinates
print(str(paneCoords[0]) + ":" + str(paneCoords[1]) + ":" + str(paneCoords[2]) + ":" + str(paneCoords[3]))
if (paneCoords[0] <= posx <= paneCoords[0]+paneCoords[2]) and (paneCoords[1] <= posy <= paneCoords[1]+paneCoords[3]):
textToReturn = Pane.text()
return textToReturn
#---------------------------
def run(self):
clock = pygame.time.Clock()
RUNNING = True
while RUNNING:
# --- events ---
for event in pygame.event.get():
if event.type == pygame.QUIT:
RUNNING = False
break
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
self.show_keyboard = not self.show_keyboard
self.show_panes = not self.show_panes
if event.type == pygame.MOUSEBUTTONUP:
textSelected = self.mouseDown()
print(textSelected)
if textSelected == "Keyboard":
self.show_keyboard = True
self.show_panes = False
# --- draws ---
self.screen.fill(WHITE)
if self.show_panes:
self.drawPanes()
if self.show_keyboard:
self.drawKeyboard()
pygame.display.update()
# --- FPS ---
clock.tick(25)
self.close()
#----------------------------------------------------------------------
Application().run()
MODIFIER:
- Clavier de classe
- Le volet a un event_handler
- Test du volet si la souris est passée
- Le volet change d'arrière-plan lorsque la souris est survolée (jaune)
- Le volet change d'arrière-plan lorsque la souris est enfoncée (rouge)
- en cliquant sur la touche Q à l'écran pour fermer le clavier
- le clavier envoie son propre événement à mainloop lorsque la touche Q est cliqué - pour informer que le clavier est fermé
.
import pygame
import sys
#----------------------------------------------------------------------
WHITE = (255,255,255)
BLACK = (0 ,0 ,0 )
#---------------------------
MAIN_BUTTON = 2
KEYBOARD = True
WORDS = False
#----------------------------------------------------------------------
class Pane():
def __init__(self, textToDisplay, rect, screen, fgColor=(0,0,0), bgColor=(255,255,255), mouseoverBgColor=(255,255,0) ):
self.textToDisplay = textToDisplay
self.rect = pygame.Rect(*rect)
self.screen = screen
# colors
self.fgColor = fgColor
self.bgColor = bgColor
self.mouseoverBgColor = mouseoverBgColor
self.currentFgColor = self.fgColor
self.currentBgColor = self.bgColor
self.font = pygame.font.SysFont('Palace Script MT', 25)
#---------------------------
def coordinates(self):
return self.rect
#---------------------------
def text(self):
return self.textToDisplay
#---------------------------
def draw(self):
# background
self.screen.fill(self.currentBgColor, self.rect)
# border
pygame.draw.rect(self.screen, self.currentFgColor, self.rect, 2)
# text
self.screen.blit(self.font.render(self.textToDisplay, True, self.currentFgColor), self.rect)
#---------------------------
def test_coordinates(self, posx, posy):
return self.rect.collidepoint(posx, posy)
#---------------------------
def event_handler(self, event):
# standard pane color
self.currentFgColor = self.fgColor
self.currentBgColor = self.bgColor
# if mouse over pane change color
if event.type == pygame.MOUSEMOTION:
if self.rect.collidepoint(event.pos):
self.currentBgColor = self.mouseoverBgColor
elif event.type == pygame.MOUSEBUTTONDOWN:
if self.rect.collidepoint(event.pos):
self.currentBgColor = (255,0,0)
elif event.type == pygame.MOUSEBUTTONUP:
if self.rect.collidepoint(event.pos):
self.currentBgColor = self.mouseoverBgColor
#----------------------------------------------------------------------
class Keyboard():
Keys = []
paneLocs = []
visible = False
#---------------------------
def __init__(self, screen):
self.screen = screen
self.font = pygame.font.SysFont('Arial', 25)
self.create()
#---------------------------
def create(self):
letter_code = ord("A")
for y in range(2):
for x in range(13):
lock = (100*x, 100*y, 100, 100)
self.paneLocs.append(lock)
self.Keys.append(Pane(chr(letter_code), lock, self.screen, (0,0,0), (0,255,0)))
letter_code += 1
#---------------------------
def draw(self):
for key in self.Keys:
key.draw()
#---------------------------
def event_handler(self, event):
textToReturn = None
# let panes handle event
for key in self.Keys:
key.event_handler(event)
if event.type == pygame.MOUSEBUTTONUP:
posx, posy = event.pos
for key in self.Keys:
#print "debug: keyboard.event_handler", posx, posy
if key.test_coordinates(posx, posy):
textToReturn = key.text()
print textToReturn
# if Q was
if textToReturn == 'Q':
self.onKeyQ(textToReturn)
return textToReturn
#---------------------------
def onKeyQ(self, text):
# hide keyboard
self.visible = False
# send event to inform main loop that keyboard was closed
pygame.event.post(pygame.event.Event(pygame.USEREVENT, {'code': 666, 'key':text}))
#----------------------------------------------------------------------
class Application():
NoOfPanes = 0
Panes = []
paneLocs = [(583, 334, 300, 150),
(633, 150, 200, 125),
(633, 600, 200, 125),
(350, 360, 200, 100),
(925, 360, 200, 100),
(1000, 150, 150, 100),
(275, 150, 150, 100),
(275, 600, 150, 100),
(1000, 600, 150, 100),
(75, 350, 200, 100),
(0, 668, 200, 100)
]
#---------------------------
def __init__(self):
pygame.init()
pygame.display.set_caption('Box Test')
self.font = pygame.font.SysFont('Arial', 25)
self.screen = pygame.display.set_mode((1366,768), 0, 32)
self.show_panes = True
self.createPanes()
self.keyboard = Keyboard(self.screen)
#---------------------------
def close(self):
print "pygame quit"
pygame.quit()
sys.exit()
#---------------------------
def createPanes(self):
self.addPane("1", WORDS)
self.addPane("2", WORDS)
self.addPane("3", WORDS)
self.addPane("4", WORDS)
self.addPane("5", WORDS)
self.addPane("6", WORDS)
self.addPane("7", WORDS)
self.addPane("8", WORDS)
self.addPane("9", WORDS)
self.addPane("10", WORDS)
self.addPane("Keyboard", WORDS)
#---------------------------
def addPane(self, textToDisplay, keyboardFlag):
if (not keyboardFlag) and (self.NoOfPanes > 11):
print("Limit Reached")
else:
print(int(self.NoOfPanes))
if not keyboardFlag:
self.Panes.append(Pane(textToDisplay, self.paneLocs[self.NoOfPanes], self.screen))
self.NoOfPanes += 1
#---------------------------
def drawPanes(self):
for Pane in self.Panes:
Pane.draw()
#---------------------------
def mousePosition(self, event):
if event.type == MAIN_BUTTON:
self.Pos = event.pos
return MAIN_BUTTON
else:
return False
#---------------------------
def event_handler(self, event):
textToReturn = None
# let panes handle events
for pane in self.Panes:
pane.event_handler(event)
if event.type == pygame.MOUSEBUTTONUP:
posx, posy = event.pos
for pane in self.Panes:
#print "debug: app.event_handler", posx, posy
if pane.test_coordinates(posx, posy):
textToReturn = pane.text()
if textToReturn == "Keyboard":
self.keyboard.visible = True
self.show_panes = False
print textToReturn
return textToReturn
#---------------------------
def run(self):
clock = pygame.time.Clock()
RUNNING = True
while RUNNING:
# --- events ---
for event in pygame.event.get():
if event.type == pygame.QUIT:
RUNNING = False
break
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
self.keyboard.visible = not self.keyboard.visible
self.show_panes = not self.show_panes
if event.type == pygame.USEREVENT:
print "USEREVENT:", event.code
# event from keyboard
if event.code == 666:
# keyboar was closed so I have to show panes
self.show_panes = True
if self.show_panes:
self.event_handler(event)
if self.keyboard.visible:
self.keyboard.event_handler(event)
# --- draws ---
self.screen.fill(WHITE)
if self.show_panes:
self.drawPanes()
if self.keyboard.visible:
self.keyboard.draw()
pygame.display.update()
# --- FPS ---
clock.tick(25)
self.close()
#----------------------------------------------------------------------
Application().run()
MODIFIER:
Le volet peut désormais être cliqué et déplacé.Je mets ici uniquement la classe Pane
Chercher: is_movable
et is_moving
class Pane():
def __init__(self, textToDisplay, rect, screen, fgColor=(0,0,0), bgColor=(255,255,255), mouseoverBgColor=(255,255,0) ):
self.textToDisplay = textToDisplay
self.rect = pygame.Rect(*rect)
self.screen = screen
# colors
self.fgColor = fgColor
self.bgColor = bgColor
self.mouseoverBgColor = mouseoverBgColor
self.currentFgColor = self.fgColor
self.currentBgColor = self.bgColor
self.font = pygame.font.SysFont('Palace Script MT', 25)
self.is_movable = True
self.is_moving = False
#---------------------------
def coordinates(self):
return self.rect
#---------------------------
def text(self):
return self.textToDisplay
#---------------------------
def draw(self):
# background
self.screen.fill(self.currentBgColor, self.rect)
# border
pygame.draw.rect(self.screen, self.currentFgColor, self.rect, 2)
# text
self.screen.blit(self.font.render(self.textToDisplay, True, self.currentFgColor), self.rect)
#---------------------------
def test_coordinates(self, posx, posy):
return self.rect.collidepoint(posx, posy)
#---------------------------
def event_handler(self, event):
# standard pane color
self.currentFgColor = self.fgColor
self.currentBgColor = self.bgColor
# if mouse over pane change color
if event.type == pygame.MOUSEMOTION:
if self.rect.collidepoint(event.pos):
self.currentBgColor = self.mouseoverBgColor
if self.is_movable and self.is_moving:
self.rect.move_ip(event.rel)
self.currentBgColor = (0,0,255)
elif event.type == pygame.MOUSEBUTTONDOWN:
if self.rect.collidepoint(event.pos):
self.currentBgColor = (255,0,0)
self.is_moving = True
elif event.type == pygame.MOUSEBUTTONUP:
if self.rect.collidepoint(event.pos):
self.currentBgColor = self.mouseoverBgColor
self.is_moving = False
MODIFIER:
Le volet cliqué devient le volet le plus haut de l'écran :
import pygame
import sys
#----------------------------------------------------------------------
WHITE = (255,255,255)
BLACK = (0 ,0 ,0 )
#---------------------------
MAIN_BUTTON = 2
KEYBOARD = True
WORDS = False
#----------------------------------------------------------------------
class evt_type(): # UserEvent - types
PANE = pygame.USEREVENT + 1
KEYBOARD = pygame.USEREVENT + 2
class evt_code(): # UserEvent - codes
KEYBOARD_CLOSED = 100
PANE_CLICKED = 200
#----------------------------------------------------------------------
class Pane():
def __init__(self, textToDisplay, rect, screen, fgColor=(0,0,0), bgColor=(255,255,255), mouseoverBgColor=(255,255,0) ):
self.textToDisplay = textToDisplay
self.rect = pygame.Rect(*rect)
self.screen = screen
# colors
self.fgColor = fgColor
self.bgColor = bgColor
self.mouseoverBgColor = mouseoverBgColor
self.currentFgColor = self.fgColor
self.currentBgColor = self.bgColor
self.font = pygame.font.SysFont('Palace Script MT', 25)
self.is_movable = True
self.is_moving = False
#---------------------------
def coordinates(self):
return self.rect
#---------------------------
def text(self):
return self.textToDisplay
#---------------------------
def draw(self):
# background
self.screen.fill(self.currentBgColor, self.rect)
# border
pygame.draw.rect(self.screen, self.currentFgColor, self.rect, 2)
# text
self.screen.blit(self.font.render(self.textToDisplay, True, self.currentFgColor), self.rect)
#---------------------------
def test_coordinates(self, posx, posy):
return self.rect.collidepoint(posx, posy)
#---------------------------
def event_handler(self, event):
# standard pane color
self.currentFgColor = self.fgColor
self.currentBgColor = self.bgColor
# if mouse over pane change color
if event.type == pygame.MOUSEMOTION:
if self.rect.collidepoint(event.pos):
self.currentBgColor = self.mouseoverBgColor
if self.is_movable and self.is_moving:
self.rect.move_ip(event.rel)
self.currentBgColor = (0,0,255)
elif event.type == pygame.MOUSEBUTTONDOWN:
if self.rect.collidepoint(event.pos):
if self.is_movable:
pygame.event.post(pygame.event.Event(evt_type.PANE, {'code': evt_code.PANE_CLICKED, 'widget': self}))
self.currentBgColor = (255,0,0)
self.is_moving = True
elif event.type == pygame.MOUSEBUTTONUP:
if self.rect.collidepoint(event.pos):
self.currentBgColor = self.mouseoverBgColor
self.is_moving = False
#----------------------------------------------------------------------
class Keyboard():
Keys = []
paneLocs = []
visible = False
#---------------------------
def __init__(self, screen):
self.screen = screen
self.font = pygame.font.SysFont('Arial', 25)
self.create()
#---------------------------
def create(self):
letter_code = ord("A")
for y in range(2):
for x in range(13):
lock = (100*x, 100*y, 100, 100)
self.paneLocs.append(lock)
self.Keys.append(Pane(chr(letter_code), lock, self.screen, (0,0,0), (0,255,0)))
self.Keys[-1].is_movable = False
letter_code += 1
#---------------------------
def draw(self):
for key in self.Keys:
key.draw()
#---------------------------
def event_handler(self, event):
textToReturn = None
# let panes handle event
for key in self.Keys:
key.event_handler(event)
if event.type == pygame.MOUSEBUTTONUP:
posx, posy = event.pos
for key in self.Keys:
#print "debug: keyboard.event_handler", posx, posy
if key.test_coordinates(posx, posy):
textToReturn = key.text()
print textToReturn
# if Q was
if textToReturn == 'Q':
self.onKeyQ(textToReturn)
return textToReturn
#---------------------------
def onKeyQ(self, text):
# hide keyboard
self.visible = False
# send event to inform main loop that keyboard was closed
pygame.event.post(pygame.event.Event(evt_type.KEYBOARD, {'code': evt_code.KEYBOARD_CLOSED, 'key':text}))
#----------------------------------------------------------------------
class Application():
NoOfPanes = 0
Panes = []
paneLocs = [(583, 334, 300, 150),
(633, 150, 200, 125),
(633, 600, 200, 125),
(350, 360, 200, 100),
(925, 360, 200, 100),
(1000, 150, 150, 100),
(275, 150, 150, 100),
(275, 600, 150, 100),
(1000, 600, 150, 100),
(75, 350, 200, 100),
(0, 668, 200, 100)
]
#---------------------------
def __init__(self):
pygame.init()
pygame.display.set_caption('Box Test')
self.font = pygame.font.SysFont('Arial', 25)
self.screen = pygame.display.set_mode((1366,768), 0, 32)
self.show_panes = True
self.createPanes()
self.keyboard = Keyboard(self.screen)
#---------------------------
def close(self):
print "pygame quit"
pygame.quit()
sys.exit()
#---------------------------
def createPanes(self):
self.addPane("1", WORDS)
self.addPane("2", WORDS)
self.addPane("3", WORDS)
self.addPane("4", WORDS)
self.addPane("5", WORDS)
self.addPane("6", WORDS)
self.addPane("7", WORDS)
self.addPane("8", WORDS)
self.addPane("9", WORDS)
self.addPane("10", WORDS)
self.addPane("Keyboard", WORDS)
#---------------------------
def addPane(self, textToDisplay, keyboardFlag):
if (not keyboardFlag) and (self.NoOfPanes > 11):
print("Limit Reached")
else:
print(int(self.NoOfPanes))
if not keyboardFlag:
self.Panes.append(Pane(textToDisplay, self.paneLocs[self.NoOfPanes], self.screen))
self.NoOfPanes += 1
#---------------------------
def drawPanes(self):
for Pane in self.Panes:
Pane.draw()
#---------------------------
def mousePosition(self, event):
if event.type == MAIN_BUTTON:
self.Pos = event.pos
return MAIN_BUTTON
else:
return False
#---------------------------
def event_handler(self, event):
textToReturn = None
# let panes handle events
for pane in self.Panes:
pane.event_handler(event)
if event.type == pygame.MOUSEBUTTONUP:
posx, posy = event.pos
for pane in self.Panes:
#print "debug: app.event_handler", posx, posy
if pane.test_coordinates(posx, posy):
textToReturn = pane.text()
if textToReturn == "Keyboard":
self.keyboard.visible = True
self.show_panes = False
print textToReturn
return textToReturn
#---------------------------
def run(self):
clock = pygame.time.Clock()
RUNNING = True
while RUNNING:
# --- events ---
for event in pygame.event.get():
if event.type == pygame.QUIT:
RUNNING = False
break
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
self.keyboard.visible = not self.keyboard.visible
self.show_panes = not self.show_panes
if event.type == evt_type.KEYBOARD:
print "USEREVENT:: TYPE:", event.type, "CODE:", event.code
# event from keyboard
if event.code == evt_code.KEYBOARD_CLOSED:
# keyboar was closed so I have to show panes
self.show_panes = True
if event.type == evt_type.PANE:
print "USEREVENT:: TYPE:", event.type, "CODE:", event.code
if event.code == evt_code.PANE_CLICKED:
# move to the end - move to top of screen
index = self.Panes.index(event.widget)
self.Panes.append(self.Panes.pop(index))
if self.show_panes:
self.event_handler(event)
if self.keyboard.visible:
self.keyboard.event_handler(event)
# --- draws ---
self.screen.fill(WHITE)
if self.show_panes:
self.drawPanes()
if self.keyboard.visible:
self.keyboard.draw()
pygame.display.update()
# --- FPS ---
clock.tick(25)
self.close()
#----------------------------------------------------------------------
Application().run()