Я новичок в 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()