Pergunta

Basicamente, tenho duas telas separadas que desejo exibir.Um que tenha 11 painéis exibidos na tela ao mesmo tempo e, quando eu clicar em um painel chamado teclado, ele deverá limpar a tela e configurar 36 painéis que deverão exibir um teclado (para fins de teste, usei apenas três painéis).

Meu problema é que, quando clico no teclado, ele limpa a tela e exibe os 3 painéis de teste, assim como os outros 10 painéis que vêm da primeira página.

Exemplo:Para começar, tudo bem:Fine Display

Isso não está bem.(A, B e C devem ser exibidos, mas o resto não):Not Fine

Aqui está o código:

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();

Acho que o problema que estou enfrentando é que todos esses painéis estão sendo adicionados à lista Panes = [].Como posso ter certeza de que esta lista está clara antes de exibir os novos painéis através do uso da função def drawPanes(self):

Não acredite apenas na minha palavra, pois é apenas uma suposição e estou realmente preso.(Qualquer ajuda é apreciada.)

Foi útil?

Solução

Você pode atribuir uma lista vazia ao Painel para torná-la vazia

Panes = []

mas você perderá todos os painéis adicionados para sempre.

Talvez você deva fazer uma lista separada para painéis de teclado e desenhar apenas esta lista.

EDITAR:

Por falar nisso:

Você usa uma variável myScreen para ambas as telas - quando você executa myScreen = Screen(...) você cria uma nova tela, mas perde o acesso à tela anterior.

Usando Screen = pygame.display.set_mode((1366,768), 0, 32); self.screen = Screen limpar a tela é perda de tempo e memórias.Você precisa apenas self.screen.fill((white))

Você usa Screen nome como nome de classe e como variável em algumas funções.Você pode acidentalmente ter conflito de nomes.

EDITAR:

Exemplo prático completo de como o código poderia ser:

eu uso um self.screen então a janela não é criada/excluída todas as vezes.

Você pode pressionar a tecla "ESC" para mostrar/ocultar o teclado.

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()

EDITAR:

  • Teclado de aula
  • O painel tem um event_handler
  • Teste do painel se o mouse acabou
  • O painel muda de plano de fundo quando o mouse passa (amarelo)
  • O plano de fundo do painel muda quando o mouse é pressionado (vermelho)
  • clicando na tecla Q na tela para fechar o teclado
  • teclado envia evento próprio para mainloop quando a tecla Q é clicada - para informar que o teclado está fechado

.

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()

EDITAR:

Agora o painel pode ser clicado e movido.Coloquei aqui apenas a classe Pane

Procurar: is_movable e 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

EDITAR:

O painel clicado se torna o painel superior da tela:

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top