Criar QLabels Automaticamente em python

18 views
Skip to first unread message

Beto Alves

unread,
Aug 12, 2019, 11:38:29 AM8/12/19
to Grupy-AM
Olá a todos, sou novato em python e estou tendo dificuldades na seguinte situação: Tenho um banco mysql onde existe uma tabela que espelha a situação atual dos apatos de um hotel e preciso gerar uma consulta que mostre essa situação, estou usando o pyqt4 para desenhar os formulários. Esse mapa é demonstrado com os aptos cadastrados e todos os dias dos meses, onde o Qlabel que representa cada dia aparece em verde se o apto estiver livre, vermelho se estiver ocupado(hóspede) e laranja se estiver reservado, isso eu ja consigo fazer, minha dificuldade está em gerar os qlabels automaticamente de acordo com a quantidade de aptos cadastrados. Desde já meu muito obrigado a quem puder me ajudar nessa questão.

Marcos Thomaz

unread,
Aug 12, 2019, 1:51:02 PM8/12/19
to grup...@googlegroups.com
Dá uma olhada se é isso:  https://pastebin.com/ykbDvqrU

Em seg, 12 de ago de 2019 às 10:38, Beto Alves <betog...@gmail.com> escreveu:
Olá a todos, sou novato em python e estou tendo dificuldades na seguinte situação: Tenho um banco mysql onde existe uma tabela que espelha a situação atual dos apatos de um hotel e preciso gerar uma consulta que mostre essa situação, estou usando o pyqt4 para desenhar os formulários. Esse mapa é demonstrado com os aptos cadastrados e todos os dias dos meses, onde o Qlabel que representa cada dia aparece em verde se o apto estiver livre, vermelho se estiver ocupado(hóspede) e laranja se estiver reservado, isso eu ja consigo fazer, minha dificuldade está em gerar os qlabels automaticamente de acordo com a quantidade de aptos cadastrados. Desde já meu muito obrigado a quem puder me ajudar nessa questão.

--
Você recebeu essa mensagem porque está inscrito no grupo "Grupy-AM" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para grupy-am+u...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/grupy-am/7c60aa73-9b99-40a2-af82-caa628d4d5e5%40googlegroups.com.


--


Marcos Thomaz da Silva
Analista de Tecnologia da Informação

Beto Alves

unread,
Aug 12, 2019, 2:27:20 PM8/12/19
to Grupy-AM
Oi Marcos, obrigado pela atenção que dispensou ao meu pedido de ajuda, estou usando o pytq4 e python 2.7.
Deixa eu tentar ser mais preciso na minha necessidade.

Tenho um banco mysql (phpmyadmin) onde tenho uma tabela denominada tblmapasituacao onde constam 1 coluna com o nro do apto e + 31 colunas que representam os dias do mês, quando o usuário cadastra um apartamento eu atualizo o status desse apto na tblmapasituacao como livre, assim como também quando são feitas as reservas e hospedagens ela é atualizada, então eu quero mostrar esse mapa mensal e por período, já até consegui exibir mensal parcilamente, mas tive que desenhar os Qlabels todos no pyqt4, o código abaixo está fazendo isso, mas vc pode ver que só tem 6 aptos, mas pode ter 100 ou mais por isso a necessidade de gerar os QLabels de acordo com a quantidade de aptos cadastrados, estou mandando em anexo um arquivo do print do formulário para vc entender melhor.

ano = date.today().year
mes = date.today().month
c=con.cursor()
c.execute("""select * from tblmapasituacao where month(dtInicio )=%s And year(dtInicio)=%s ORDER BY intSequencia""", (mes,ano))
aptos = c.fetchall()
apto = [a[1] for a in aptos]
self.Apto1.setText("%s" % apto[0]) if apto[0] != None else self.Apto1.setText("")
self.Apto2.setText("%s" % apto[1]) if apto[1] != None else self.Apto2.setText("")
self.Apto3.setText("%s" % apto[2]) if apto[2] != None else self.Apto3.setText("")
self.Apto4.setText("%s" % apto[3]) if apto[3] != None else self.Apto4.setText("")
self.Apto5.setText("%s" % apto[4]) if apto[4] != None else self.Apto5.setText("")
self.Apto6.setText("%s" % apto[5]) if apto[5] != None else self.Apto6.setText("")
MapaAptos.doc

Marcos Thomaz

unread,
Aug 12, 2019, 5:16:53 PM8/12/19
to grup...@googlegroups.com
Tente pensar em percorrer a lista de componentes... Troque seu código (que postou) por algo do tipo:

aptos = [a[1] for a in aptos]
for i, apto in enumerate(aptos, 1):
    qlab = self.findChild(QtGui.QLabel, "Apto{}".format(i))
    self.qlab.setText(str(apto) if apto else "")

 

--
Você recebeu essa mensagem porque está inscrito no grupo "Grupy-AM" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para grupy-am+u...@googlegroups.com.

Beto Alves

unread,
Aug 12, 2019, 5:40:02 PM8/12/19
to grup...@googlegroups.com
Marcos, mas uma vez obrigado pelo interesse, mas eu precisaria que os Qlabels sejam criados de acordo com a quantidade de apartamentos na tabela nas 32 colunas, ou seja 1 coluna com os nros dos apartamentos as outras 31 representando os dias do mês. Tentei sua dica, mas não funcionou, estou anexando o script para vc dar uma olhada, o script está funcionando, mas tive que setar 1 por um, além do que eu só criei 33 linhas e quando tiver mais que 33 aptos cadastrados não vai funcionar

FrmMapaSituacao.pyw

Marcos Thomaz

unread,
Aug 12, 2019, 5:52:40 PM8/12/19
to grup...@googlegroups.com
Beto, é só adaptar os códigos. Bem, aqui [1] vai um exemplo que gera os QLabels em tempo de execução. No exemplo, os QLabels em verde simbolizam os Apartamentos livres, e os QLabels em vermelho simbolizam os Apartamentos ocupados.



Beto Alves

unread,
Aug 12, 2019, 6:13:25 PM8/12/19
to grup...@googlegroups.com
Marcos desculpe minha ignorância amigo, mas como citei no início da minha postagem sou iniciante em python, então minha dúvida é que o exemplo está em pyqt5 e estou usando o pyqt4, não tem diferença? Na verdade amigo já tenho alguns aplicativos que desenvolvi em vba e estou migrando eles para o python, Perdoe-me se estou sendo chato no questionamento.

Marcos Thomaz

unread,
Aug 12, 2019, 8:04:59 PM8/12/19
to grup...@googlegroups.com
Sobre o PyQT5 para o 4 tem pouca diferença. Substitui o nome da biblioteca e faça alguns testes. A implementação que mandei serve como base. Note que criei variáveis para gerar os todos os apartamentos e os apartamentos ocupados. Basta adaptar para a consulta pelo SQL.

Beto Alves

unread,
Aug 12, 2019, 11:32:44 PM8/12/19
to grup...@googlegroups.com
Oi Marcos, quase lá meu amigo, não sei se vc chegou a ver o arquivo do word que anexei com o print de como ficaria o mapa. Com a sua dica consigui exibir exatamente a coluna com o nro dos apartamentos, como deve ser, mas falta exibir os dias do mês, estou postando a imagem de como deve ficar vc observar que o mapa é pertinente ao mês de agosto e o apto 2 está ocupado do dia 1 ao 13 e o apto 5 está livre do dia 13a 14 e reservado para o dia 15 e livre nos dias posteriores, na verdade é assim: Eu atualizo a tblmapasituacao com as letras O=ocupado, L=livre, R=reservado e M=manutenção e para colorir os dias em que os aptos tem uma das 4 condições eu percorro o formulário com o seguinte código:
for l in Form.findChildren(QtGui.QLabel):
            if l.text() == "L":
                l.setStyleSheet(_fromUtf8("background-color: rgb(0, 134, 0);"))
                l.setText("<html><head/><body><p><span style=\" color:#0000ff;\"></span></p></body></html>")
            elif l.text() == "R":
                l.setStyleSheet(_fromUtf8("background-color: rgb(255, 85, 0);"))
                l.setText("<html><head/><body><p><span style=\" color:#ff5500;\"></span></p></body></html>")
            elif l.text() == "O":
                l.setStyleSheet(_fromUtf8("background-color: rgb(255, 0, 0);"))
                l.setText("<html><head/><body><p><span style=\" color:#ff0000;\"></span></p></body></html>")
            elif l.text() == "M":
                l.setText("<html><head/><body><p><span style=\" color:#ff0000;\">X</span></p></body></html>")

Seu código adaptado ficou assim, ficou ótimo, mas faltando exibir os dias do mês, eu queria na verdade manter o cabeçalho da imagem.

# -*- coding: utf-8 -*-
import sys
import os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import MySQLdb
from datetime import date

def qtde_aptos():
    con = MySQLdb.connect(host = "127.0.0.1",user = "root",passwd = "",db = "geradhdb",charset='utf8',use_unicode = True)
    cursor=con.cursor()
    cursor.execute("select count(idApto) from tblapartamentos")
    d = cursor.fetchone()
    contagem = d[0]
    return list(range(1, int(contagem)))
 
def ler_aptos_ocupados():
    con = MySQLdb.connect(host="127.0.0.1", user="root", passwd="", db="geradhdb",charset='utf8',use_unicode = True)

    ano = date.today().year
    mes = date.today().month
    c=con.cursor()
    c.execute("""select * from tblmapasituacao where month(dtInicio )=%s And year(dtInicio)=%s ORDER BY intSequencia""", (mes,ano))
    aptos = c.fetchall()
    for ap in aptos:
        return [ap[1]]
    c.close()
    con.close()
 
class Window(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.layout = QVBoxLayout(self)
 
        aptos = qtde_aptos()
        ocupados = ler_aptos_ocupados()
        for apto in aptos:
            label = QLabel(str(apto))
            label.setObjectName(str(apto))
            label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
            label.setAlignment(Qt.AlignCenter)
            #if apto in ocupados:
            #    label.setStyleSheet("QLabel {background-color: red;}")
            #else:
            #    label.setStyleSheet("QLabel {background-color: green;}")
            self.layout.addWidget(label)
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())

MapaApto.jpg

Marcos Thomaz

unread,
Aug 13, 2019, 12:21:47 AM8/13/19
to grup...@googlegroups.com
Opa Beto, assim, olhando bem para o problema, não seria mais simples usar um QTableWidget ?

Beto Alves

unread,
Aug 13, 2019, 12:33:30 AM8/13/19
to grup...@googlegroups.com
Pois é Marcos, na verdade imaginei que dessa forma seria mais fácil, o que vc acha? Porque veja só. O mapa é construído na tabela para os 12 meses do ano e eu vou precisar exibir esse mapa mensal e também por período de meses, ou seja, o hotel pode querer ver por exemplo, o mês de agosto a novembro do ano em curso ou de ano futuro, pois se for feito uma reserva para junho de 2020 é criado já todo o mapa dos meses desse ano. Me dê uma luz de qual a melhor solução.Outra coisa vc presta assessoria (ajuda nessas dificuldades de nós novatos no pytho?)

Marcos Thomaz

unread,
Aug 13, 2019, 12:47:44 AM8/13/19
to grup...@googlegroups.com
Opa, na minha opinião, usar uma QTable será mais fácil por ser mais maleável, podendo se adaptar ao que você precisa. Com relação a assessora, faço sim.

Beto Alves

unread,
Aug 13, 2019, 12:59:58 AM8/13/19
to grup...@googlegroups.com
Podemos tratar por aqui mesmo sobre preço e os tipos de ajuda que vou precisar? É que já tenho alguns projetos prontos em vba (access) e que vou migrar todos eles para python, o problema é que comprei um curso básico do python e ainda tenho muitas dúvidas nele, como por exemplo, como trabalhar com relatórios e consultas, esse de hotel já está bem adiantado, mas falta resolver esse entrave de ajuda que solicitei, os relatórios e também estou tendo dificuldades para chamar outro formulário pyqt4, eu até consigo chamar, mas algumas funções que estão nele não funcionam.

Marcos Thomaz

unread,
Aug 13, 2019, 1:21:30 AM8/13/19
to grup...@googlegroups.com
Melhor tratar em PVT. Mande as demandas direto para meu email: marcos...@gmail.com

Beto Alves

unread,
Aug 13, 2019, 1:23:42 AM8/13/19
to grup...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages