لماذا لا يزال الكود الخاص بي يعرض الأجزاء القديمة؟

StackOverflow https://stackoverflow.com//questions/20053552

  •  27-12-2019
  •  | 
  •  

سؤال

لذا لدي شاشتان منفصلتان أريد عرضهما.واحد يحتوي على 11 جزءًا معروضًا على الشاشة في وقت واحد وبمجرد النقر على جزء مسمى بلوحة المفاتيح، يجب أن يقوم بمسح الشاشة وإعداد 36 جزءًا والتي يجب أن تعرض لوحة المفاتيح (لأغراض الاختبار، استخدمت ثلاثة أجزاء فقط).

مشكلتي هي أنه بمجرد النقر على لوحة المفاتيح، فإنها تقوم بمسح الشاشة وعرض أجزاء الاختبار الثلاثة كما تعرض أيضًا الأجزاء العشرة الأخرى التي تأتي من الصفحة الأولى.

مثال:هذا جيد للبدء بـ:Fine Display

هذا ليس بخير.(يجب أن يتم عرض A وB وC ولكن لا ينبغي عرض الباقي):Not Fine

هنا هو الرمز:

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

أعتقد أن المشكلة التي أواجهها هي إضافة كل هذه الأجزاء إلى القائمة Panes = [].كيف يمكنني التأكد من أن هذه القائمة واضحة قبل أن أقوم بعرض الأجزاء الجديدة من خلال استخدام الوظيفة def drawPanes(self):

لا تأخذ كلامي على محمل الجد لأنه مجرد افتراض وأنا عالق حقًا.(أي مساعدة هي موضع تقدير.)

هل كانت مفيدة؟

المحلول

يمكنك تعيين القائمة الفارغة على الجزء لجعلها فارغة

Panes = []

لكنك ستفقد جميع الأجزاء المضافة إلى الأبد.

ربما يجب عليك إنشاء قائمة منفصلة لأجزاء لوحة المفاتيح ثم رسم هذه القائمة فقط.

يحرر:

بالمناسبة:

يمكنك استخدام متغير واحد myScreen إلى كلتا الشاشتين - عند التشغيل myScreen = Screen(...) قمت بإنشاء شاشة جديدة ولكن فقدت الوصول إلى الشاشة السابقة.

استخدام Screen = pygame.display.set_mode((1366,768), 0, 32); self.screen = Screen مسح الشاشة هو مضيعة للوقت والذكريات.تحتاج فقط self.screen.fill((white))

انت تستخدم Screen name كاسم فئة وكمتغير في بعض الوظائف.يمكن أن يكون لديك تعارض في الأسماء عن طريق الخطأ.

يحرر:

مثال عملي كامل لكيفية ظهور الكود:

أنا استخدم واحدة self.screen لذلك لا يتم إنشاء/حذف النافذة في كل مرة.

يمكنك الضغط على مفتاح "ESC" لإظهار/إخفاء لوحة المفاتيح.

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

يحرر:

  • لوحة المفاتيح الصفية
  • يحتوي الجزء على معالج حدث واحد
  • اختبار الجزء إذا انتهى الماوس
  • تغيير خلفية الجزء عند انتهاء الماوس (أصفر)
  • تغيير خلفية الجزء عند الضغط على الماوس (أحمر)
  • النقر على مفتاح Q على الشاشة لإغلاق لوحة المفاتيح
  • ترسل لوحة المفاتيح حدثًا خاصًا إلى mainloop عند النقر على المفتاح Q - لإعلامك بأن لوحة المفاتيح مغلقة

.

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

يحرر:

الآن يمكن النقر على الجزء ونقله.أضع هنا فئة جزء فقط

بحث: is_movable و 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

يحرر:

يصبح الجزء الذي تم النقر عليه هو الجزء العلوي على الشاشة:

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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top