Как вызвать функцию внутри класса? - PullRequest
0 голосов
/ 09 июня 2018

Я новичок в Python, но я уже понял несколько интересных вещей.Недавно я написал пару классов для рисования кнопок / текстовых полей для приложения для печати этикеток на работе.Мне нужно перебрать некоторые записи на моем сервере sql - подключение работает нормально, поэтому я не буду публиковать весь этот код.

У меня есть функция getNextPart(), которая вызывает следующий элемент из таблицы на моемsql server - намерение, когда я нажимаю кнопку «+», она запускается getnextpart() и присваивает это глобальному параметру.То же самое происходит для getprevpart(), когда я нажимаю кнопку «-».

Когда я нажимаю кнопку «+», событие-обработчик делает все как положено, но не запускает функцию getnextpart() ввсе.Он не выполняет оператор print или что-то еще, поэтому я подозреваю, что это не соединитель базы данных, который сломан.Также нет сообщений об ошибках.Я попытался включить getnextpart в качестве метода и сослаться на него как self.getnextpart(), но у меня это тоже не сработало.Я искал пару дней, но ничего не смог найти, поэтому прошу несколько советов, пожалуйста.

Как (или даже я могу) вызвать функцию из метода handle_event()SpinnerButton класс?

Это моя программа, за исключением коннектора mysql и других параметров, инициализированных при запуске.

# Initialise global variables for display on the screen
partnumber = ''

def getnextpart():

    global partnumber

    print(str('Get Next Part should run here !!'))
    dbcurs=cnx.cursor()
    cnx.commit()
    query = 'spGetNextItem'
    args=[partnumber]
    result_args = dbcurs.callproc(query ,args)

    for result in dbcurs.stored_results():
        itemresult = result.fetchone()
        itemcode = str(itemresult[0])

    partnumber = itemcode
    print(partnumber)

def getprevpart():

    global partnumber

    dbcurs=cnx.cursor()
    cnx.commit()
    query = 'spGetPrevItem'
    args=[partnumber]
    result_args = dbcurs.callproc(query ,args)

    for result in dbcurs.stored_results():
        itemresult = result.fetchone()
        itemcode = str(itemresult[0])

    partnumber = itemcode
    print(partnumber)

class SpinnerButton:

    def __init__(self,x,y,w,h,type,cause):
        self.rect = pg.Rect(x,y,w,h)
        self.color = light_blue
        if type == 'UP':
            self.text = '+'
            self.x_adj = 7
            self.y_adj = 2
        elif type == 'DOWN':
            self.text = '-'
            self.x_adj = 11
            self.y_adj = 5
        else:
            self.txt = '>'
        self.sptorun = cause
        self.dir = type
        self.txt_surface = myfont30.render(self.text, True, black)

    def handle_event(self, event):
        if event.type == pg.MOUSEBUTTONDOWN:
            # If the user clicked on the input_box rect.
            if self.rect.collidepoint(event.pos):
                print(str(self.sptorun))
                print(str(self.dir))
                # Toggle the active variable.
                if self.sptorun =='items' and self.dir == 'UP':
                    getnextpart()
                elif self.sptorun == 'items' and self.dir =='DOWN':
                    getprevpart()

        if event.type == pg.KEYDOWN:
            if self.active:
                if event.key == pg.K_RETURN:
                    print(self.text)
                    self.text = ''
                elif event.key == pg.K_BACKSPACE:
                    self.text = self.text[:-1]
                else:
                    self.text += event.unicode
                # Re-render the text.
                self.txt_surface = FONT.render(self.text, True, self.color)

    def draw(self, screen):
        # Blit the rect.
        pg.draw.rect(screen, self.color, self.rect, 0)
        # Blit the text.
        screen.blit(self.txt_surface, (self.rect.x+self.x_adj, self.rect.y - self.y_adj))




class InputBox:

    def __init__(self, x, y, w, h, text, lbltxt):
        self.rect = pg.Rect(x, y, w, h)
        self.color = COLOR_INACTIVE
        self.text = text
        self.lbltext = lbltxt
        self.txt_surface = myfont25.render(text, True, blue)
        self.lbltxt_surface = myfont25.render(lbltxt, True, red)
        self.active = False

    def handle_event(self, event):
        if event.type == pg.MOUSEBUTTONDOWN:
            # If the user clicked on the input_box rect.
            if self.rect.collidepoint(event.pos):
                # Toggle the active variable.
                self.active = not self.active
            else:
                self.active = False
            # Change the current color of the input box.
            self.color = COLOR_ACTIVE if self.active else COLOR_INACTIVE
        if event.type == pg.KEYDOWN:
            if self.active:
                if event.key == pg.K_RETURN:
                    print(self.text)
                    self.text = ''
                elif event.key == pg.K_BACKSPACE:
                    self.text = self.text[:-1]
                else:
                    self.text += event.unicode
                # Re-render the text.
                self.txt_surface = FONT.render(self.text, True, self.color)

    def update(self):
        # Resize the box if the text is too long.
        width = max(200, self.txt_surface.get_width()+10)
        self.rect.w = width

    def draw(self, screen):
        # Blit the text.
        screen.blit(self.txt_surface, (self.rect.x+5, self.rect.y+2))
        screen.blit(self.lbltxt_surface, (self.rect.x - self.lbltxt_surface.get_width()- 10, self.rect.y))
        # Blit the rect.
        pg.draw.rect(screen, self.color, self.rect, 2)






def main():
    global partnumber
    clock = pg.time.Clock()
    input_partnumber = InputBox(200, 10, 140, 32, str(partnumber), 'Item: ')
    input_boxes = [input_partnumber]
    spin_itemup = SpinnerButton(400,10,32,33,'UP','item')
    spin_itemdown = SpinnerButton(433,10,32,33,'DOWN','item')
    spin_buttons = [spin_itemup, spin_itemdown]
    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            for box in input_boxes:
                box.handle_event(event)

            for btn in spin_buttons:
                btn.handle_event(event)

        for box in input_boxes:
            box.update()

        # screen.fill((30, 30, 30))
        screen.fill(bg)
        for box in input_boxes:
            box.draw(screen)

        for btn in spin_buttons:
            btn.draw(screen)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    main()
    pg.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...