Frage

Grundsätzlich habe ich also zwei separate Bildschirme, die angezeigt werden sollen.Eines, bei dem 11 Fenster gleichzeitig auf dem Bildschirm angezeigt werden und sobald ich auf ein Fenster mit dem Namen Tastatur klicke, sollte es den Bildschirm löschen und 36 Fenster einrichten, in denen eine Tastatur angezeigt werden soll (zu Testzwecken habe ich nur drei Fenster verwendet).

Mein Problem ist, dass nach dem Klicken auf die Tastatur der Bildschirm gelöscht und die 3 Testfenster so angezeigt werden, wie es auch meine anderen 10 Fenster sind, die von der ersten Seite stammen.

Beispiel: Das ist zunächst in Ordnung:Fine Display

Das ist nicht in Ordnung.(A, B und C sollten angezeigt werden, der Rest jedoch nicht.):Not Fine

Hier ist der 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();

Ich denke, das Problem, mit dem ich konfrontiert bin, ist, dass alle diese Bereiche zur Liste hinzugefügt werden Panes = [].Wie kann ich sicherstellen, dass diese Liste klar ist, bevor ich die neuen Fenster mithilfe der Funktion anzeige def drawPanes(self):

Nehmen Sie mein Wort nicht dafür, da es nur eine Annahme ist und ich wirklich feststecke.(Jede Hilfe ist willkommen.)

War es hilfreich?

Lösung

Sie können eine leere Liste dem Fenster zuordnen, um sie leer zu machen

Panes = []

aber Sie werden alle hinzugefügten Fenster für immer verlieren.

Vielleicht sollten Sie eine separate Liste für Tastaturfenster erstellen und dann nur diese Liste zeichnen.

BEARBEITEN:

Übrigens:

Sie verwenden eine Variable myScreen zu beiden Bildschirmen - wenn Sie laufen myScreen = Screen(...) sie erstellen einen neuen Bildschirm, verlieren jedoch den Zugriff auf den vorherigen Bildschirm.

Wobei Screen = pygame.display.set_mode((1366,768), 0, 32); self.screen = Screen das Löschen des Bildschirms ist Zeit- und Erinnerungsverschwendung.Sie brauchen nur self.screen.fill((white))

Sie verwenden Screen name als Klassenname und als Variable in einigen Funktionen.Sie können versehentlich einen Namenskonflikt haben.

BEARBEITEN:

Vollständiges Arbeitsbeispiel, wie Code aussehen könnte:

Ich benutze einen self.screen das Fenster wird also nicht jedes Mal erstellt / gelöscht.

Sie können die Taste "ESC" drücken, um die Tastatur anzuzeigen / auszublenden.

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

BEARBEITEN:

  • Klassentastatur
  • Bereich hat einen event_handler
  • Fenster testen, ob die Maus über ist
  • Fensterhintergrund ändern, wenn die Maus darüber ist (gelb)
  • Fensterhintergrund ändern, wenn die Maus gedrückt wird (rot)
  • klicken Sie auf die Taste Q auf dem Bildschirm, um die Tastatur zu schließen
  • tastatur sendet ein eigenes Ereignis an die Hauptschleife, wenn die Taste Q geklickt wird - um zu informieren, dass die Tastatur geschlossen ist

.

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

BEARBEITEN:

Jetzt kann der Bereich angeklickt und verschoben werden.Ich habe hier nur Scheibenklasse eingefügt

Suchen: is_movable und 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

BEARBEITEN:

Angeklickter Bereich wird zum obersten Bereich auf dem Bildschirm:

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top