class principal(object): def __init__(self, a): self.a = a self.a['bg'] = color self.con = Conecta( ) #conectar já no __init__ para que após o login já esteja com conexão no banco. self.telaprincipal() def telaprincipal(self): self.l1 = Label(self.a, text='Módulo de vendas', bg=color, fg='white', font=font1) self.l1.grid(row=2, column=2, pady=3) self.l2 = Label(self.a, text='Cliente', bg=color, font=font3) self.l2.grid(row=3, column=2, pady=3) self.e1 = Entry(self.a) self.e1.grid(row=4, column=2, pady=3) self.l3 = Label(self.a, text="Valor", bg=color, font=font3) self.l3.grid(row=5, column=2, pady=3) self.e2 = Entry(self.a) self.e2.grid(row=6, column=2, pady=3) self.l5 = Label(self.a, text="", bg=color, fg="white", font=font2) self.l5['bg'] = color self.l5.grid(row=7, column=2, pady=3) self.b1 = Button(self.a, text='Registra venda') self.b1.bind('<Button-1>', self.venda) self.b1.bind('<Return>', self.venda) self.b1.grid(row=8, column=1) self.b2 = Button(self.a, text='Abater valor') self.b2.bind('<Button-1>', self.abate) self.b2.bind('<Return>', self.abate) self.b2.grid(row=8, column=2) self.b3 = Button(self.a, text='Clientes e Saldos') self.b3.bind('<Button-1>', self.saldo) self.b3.bind('<Return>', self.saldo) self.b3.grid(row=8, column=3) def venda(self, event): c = self.e1.get() v = self.e2.get() t = time.strftime("%x, %X") c = c.upper() v = float(v.replace(',', '.')) if type(v) == float: v = v else: v = None print(v) print(type(v)) self.v = Conecta() self.dados = self.v.ledados("SELECT cliente FROM cliente_saldo") clientes = [] for i in self.dados: for g in i: clientes.append(g) if c not in clientes: if v != None: self.v.insereDadosVendas(c, v, t) self.l5[ 'text'] = 'Registrado o valor de R$ %.2f para cliente: %s' % ( v, c) else: pass self.l5['text'] = 'Valor inserido inválido' else: if v != None: self.quantidade = float( self.v.transformaResultados( self.v.ledados( 'SELECT saldo FROM cliente_saldo WHERE cliente = ?', (c, )))) self.v.executaUpdate( "UPDATE cliente_saldo SET saldo = ? WHERE cliente = ?", ( str(v + self.quantidade), c, )) self.l5[ 'text'] = 'Registrado o valor de R$ %.2f para cliente: %s' % ( v, c) else: pass self.l5['text'] = 'Valor inserido inválido' def abate(self, event): c = self.e1.get() v = self.e2.get() t = time.strftime("%x, %X") c = c.upper() v = float(v.replace(',', '.')) self.v = Conecta() self.dados = self.v.ledados("SELECT cliente FROM cliente_saldo") if self.dados == []: self.v.insereDadosVendas(c, v, t) self.v.fechaConexao() else: for i in self.dados: if c in i: saldo = self.v.ledados( "SELECT saldo FROM cliente_saldo WHERE cliente = ?", (c, )) for h in saldo: saldo1 = h[ 0] # precisa fazer esse for pra tirar o resultado da tupla (verificar melhora no código) saldo1 = float(saldo1) saldo1 -= float(v) self.v.executaUpdate( "UPDATE cliente_saldo SET saldo = ? WHERE cliente = ?", ( saldo1, c, )) self.v.fechaConexao() time.sleep(0.3) self.l5[ 'text'] = 'Subtraído o valor de R$ %.2f para cliente: %s' % ( v, c) break elif c not in i: continue # break para para aqui se o if for verdadeiro, senão vai continuar (é errado) def saldo(self, event): self.saldo = Tk() self.saldo.title('Clientes e Saldos') self.t = Text(self.saldo) self.t.pack() self.s = Conecta() self.pesquisa_valores = self.s.ledados( "SELECT cliente,saldo FROM cliente_saldo") for i in self.pesquisa_valores: consumer = i[0] value = i[1] self.t.insert(INSERT, '%s: R$ %s\n' % (consumer, str(value)))
class Login(object): def __init__(self, b): self.b = b self.b['bg'] = color self.telaprincipal() def telaprincipal(self): self.l1 = Label(self.b, text='Bem - vindo!', bg=color, fg='white', font=font1) self.l1.grid(row=1, column=1, columnspan=2, padx=5) self.l2 = Label(self.b, text='Faça login e escolha um modo para entrar', bg=color, fg='white', font=font3) self.l2.grid(row=2, column=1, columnspan=2, padx=5) self.l3 = Label(self.b, text='Usuário', bg=color, fg='white', font=font3) self.l3.grid(row=3, column=1, columnspan=2, padx=3) self.e1 = Entry(self.b) self.e1.grid(row=4, column=1, columnspan=2) self.l4 = Label(self.b, text='Senha', bg=color, fg='white', font=font3) self.l4.grid(row=5, column=1, columnspan=2, padx=3) self.e2 = Entry(self.b, show='*') self.e2.grid(row=6, column=1, columnspan=2) ''' Usar intvar() para atribuir a variable no radio button para que ele troque, bem como atribuir value crescente para cada radio button criado. ''' self.r = IntVar() self.rb1 = Radiobutton(self.b, text='Módulo Venda', variable=self.r, value=0, bg=color, font=font3) self.rb1.grid(row=7, column=1, columnspan=2) self.rb2 = Radiobutton(self.b, text='Módulo Pedidos', variable=self.r, value=1, bg=color, font=font3) self.rb2.grid(row=8, column=1, columnspan=2) self.l5 = Label(self.b, text="", bg=color, fg='white', font=font2) self.l5.grid(row=11, column=1, columnspan=2) self.l6 = Label(self.b, text="", bg=color, fg='white', font=font2) self.l6.grid(row=11, column=1, columnspan=2) self.l7 = Label(self.b, text="", bg=color, fg='white', font=font2) self.l7.grid(row=11, column=1, columnspan=2) self.b1 = Button(self.b, text='Entrar') self.b1.bind('<Button-1>', self.entrar) self.b1.bind('<Return>', self.entrar) self.b1.grid(row=12, column=1) self.b2 = Button(self.b, text='Novo usuário') self.b2.bind('<Button-1>', self.novo) self.b2.bind('<Return>', self.novo) self.b2.grid(row=12, column=2) self.new = False def entrar(self, event): c = self.e1.get() s = self.e2.get() c = c.upper() s = s.upper() if c == "" or s == "": self.l5['text'] = 'Campo Usuário e senha obrigatórios' elif c == "SUPERACCESS": if s == "MASTERACCESS" and (self.r.get() == 0): self.muda() elif s == "MASTERACESS" and (self.r.get() == 1): self.muda1() elif s != "MASTERACCESS": self.l5['text'] = 'ADMIN CANNOT LOG IN CHECK INFO PROVIDED' else: self.c = Conecta() #lembrar de colocar o comando sql ao chamar o método abaixo self.loga = self.c.ledados('SELECT * FROM usuario') for i in self.loga: #Transformar resultado em lista para facilitar o acesso aos indíces de i i = list(i) if c in i: if s == i[3] and (self.r.get() == 0): self.c.fechaConexao() self.muda() break elif s == i[3] and (self.r.get() == 1): self.c.fechaConexao() self.muda1() break elif s != i[3]: self.l5['text'] = 'Senha incorreta!' break else: self.l5['text'] = 'Usuário não encontrado!' def destroi(self): self.l1.destroy() self.l2.destroy() self.l3.destroy() self.l4.destroy() self.l5.destroy() self.l6.destroy() self.l7.destroy() self.e1.destroy() self.e2.destroy() self.b1.destroy() self.b2.destroy() self.rb1.destroy() self.rb2.destroy() def muda(self): time.sleep(0.4) self.destroi() principal(self.b) def muda1(self): time.sleep(0.4) self.destroi() Pedidos(self.b) def novo(self, event): if not self.new: self.rb1.destroy() self.rb2.destroy() self.l2['text'] = 'Digite um novo usuário e nova senha' self.b2['text'] = 'Criar' self.l5 = Label(self.b, text="Nome de usuário", bg=color, fg='white', font=font2) self.l5.grid(row=9, column=1, columnspan=2) self.e3 = Entry(self.b, show='') self.e3.grid(row=10, column=1, columnspan=2) self.new = True else: self.cria() def cria(self): n = self.e3.get() c = self.e1.get() s = self.e2.get() t = time.strftime("%x, %X") n = n.upper() c = c.upper() s = s.upper() self.c = Conecta() self.dados = self.c.ledados("SELECT login FROM usuario") self.nome = "" #definição da variável self.nome para facilitar a verificação no for loop #criação de usuário acusando corretamente se já existe cadastrado login #verificar a troca de informação das labels if self.dados == []: self.c.insereDadosUsuarios(n, c, s, t) self.l7['text'] = 'Usuário cadastrado com sucesso' self.new = False self.c.fechaConexao() else: for i in self.dados: if c in i: self.nome = i break else: continue if self.nome != "": if c in self.nome: self.l7['text'] = 'Usuário já cadastrado!' self.new = False self.c.fechaConexao() self.e3.destroy() else: self.c.insereDadosUsuarios(n, c, s, t) self.l7['text'] = 'Usuário cadastrado com sucesso' self.new = False self.c.fechaConexao() self.e3.destroy()
class Pedidos(object): def __init__(self, c): self.c = c self.c['bg'] = color self.telaprincipal() def telaprincipal(self): self.l1 = Label(self.c, text='Módulo de Pedidos', bg=color, fg='white', font=font1) self.l1.grid(row=1, column=1, columnspan=3, padx=5) self.l2 = Label( self.c, text='Escolha o produto, informe o cliente e quantidade', bg=color, fg='white', font=font2) self.l2.grid(row=2, column=1, columnspan=3, padx=5) self.l3 = Label(self.c, text='Cliente', bg=color, fg="white", font=font3) self.l3.grid(row=3, column=1, columnspan=3, padx=5) self.e1 = Entry(self.c) self.e1.grid(row=4, column=1, columnspan=3, padx=5) self.l4 = Label(self.c, text="", bg=color) self.l4.grid(row=9, column=1, columnspan=2, padx=4) self.l5 = Label(self.c, text="", bg=color, fg='white', font=font2) self.l5.grid(row=11, column=1, columnspan=2) self.l6 = Label(self.c, text="", bg=color, fg='white', font=font2) self.l6.grid(row=11, column=1, columnspan=2) #primeira opção self.con = Conecta() self.produtos = self.con.ledados("SELECT produto_nome FROM produtos") lista = [] #lista com os resultados da query para exibição no option for i in self.produtos: lista.append(str( i[0])) #adicionando resultados fora da tupla para a lista self.var = StringVar( self.c ) #verificar necessidade na documentação de optionmenu tkinter. self.var.set("Escolha um produto") # valor exibido no botão self.option1 = OptionMenu( self.c, self.var, *lista) # colocar '*' antes da variavel lista para self.option1.grid( row=6, column=1, columnspan=2, padx=5) #que sejam exibidas todas as opçães, uma em cada linha self.l5 = Label(self.c, text='Quantidade', bg=color, fg="white", font=font3) self.l5.grid(row=5, column=3, columnspan=3, padx=5) self.e2 = Entry(self.c) self.e2.grid(row=6, column=3, columnspan=3, padx=5) self.l6 = Label(self.c, text="", bg=color) self.l6.grid(row=9, column=1, columnspan=2, padx=4) # segunda opção self.con = Conecta() self.produtos = self.con.ledados("SELECT produto_nome FROM produtos") lista = [] # lista com os resultados da query para exibição no option for i in self.produtos: lista.append(str( i[0])) # adicionando resultados fora da tupla para a lista self.var2 = StringVar(self.c) self.var2.set("Escolha um produto") # valor exibido no botão self.option2 = OptionMenu( self.c, self.var2, *lista) # colocar '*' antes da variavel lista para self.option2.grid( row=8, column=1, columnspan=2, padx=5) # que sejam exibidas todas as opçães, uma em cada linha self.l5 = Label(self.c, text='Quantidade', bg=color, fg="white", font=font3) self.l5.grid(row=7, column=3, columnspan=3, padx=5) self.e3 = Entry(self.c) self.e3.grid(row=8, column=3, columnspan=3, padx=5) self.l6 = Label(self.c, text="", bg=color) self.l6.grid(row=9, column=1, columnspan=2, padx=4) # terceira opção self.con = Conecta() self.produtos = self.con.ledados("SELECT produto_nome FROM produtos") lista = [] # lista com os resultados da query para exibição no option for i in self.produtos: lista.append(str( i[0])) # adicionando resultados fora da tupla para a lista self.var3 = StringVar(self.c) self.var3.set("Escolha um produto") # valor exibido no botão self.option3 = OptionMenu( self.c, self.var3, *lista) # colocar '*' antes da variavel lista para self.option3.grid( row=10, column=1, columnspan=2, padx=5) # que sejam exibidas todas as opçães, uma em cada linha self.l5 = Label(self.c, text='Quantidade', bg=color, fg="white", font=font3) self.l5.grid(row=9, column=3, columnspan=3, padx=5) self.e4 = Entry(self.c) self.e4.grid(row=10, column=3, columnspan=3, padx=5) self.l6 = Label(self.c, text="", bg=color) self.l6.grid(row=11, column=1, columnspan=2, padx=4) # quarta opção self.con = Conecta() self.produtos = self.con.ledados("SELECT produto_nome FROM produtos") lista = [] # lista com os resultados da query para exibição no option for i in self.produtos: lista.append(str( i[0])) # adicionando resultados fora da tupla para a lista self.var4 = StringVar(self.c) self.var4.set("Escolha um produto") # valor exibido no botão self.option4 = OptionMenu( self.c, self.var4, *lista) # colocar '*' antes da variavel lista para self.option4.grid( row=12, column=1, columnspan=2, padx=5) # que sejam exibidas todas as opçães, uma em cada linha self.l5 = Label(self.c, text='Quantidade', bg=color, fg="white", font=font3) self.l5.grid(row=11, column=3, columnspan=3, padx=5) self.e5 = Entry(self.c) self.e5.grid(row=12, column=3, columnspan=3, padx=5) self.l6 = Label(self.c, text="", bg=color) self.l6.grid(row=13, column=1, columnspan=2, padx=4) self.l7 = Label(self.c, text="", bg=color) self.l7.grid(row=14, column=1, columnspan=2, padx=4) self.l7 = Label(self.c, text="", bg=color, fg="white", font=font3) self.l7.grid(row=15, column=1, columnspan=5, padx=5) self.l8 = Label(self.c, text="", bg=color) self.l8.grid(row=16, column=1, columnspan=5, padx=4) self.b1 = Button(self.c, text='Grava') self.b1.bind('<Button-1>', self.gravapedido) self.b1.bind('<Return>', self.gravapedido) self.b1.grid(row=16, column=1, padx=3) self.b2 = Button(self.c, text='Gera Pedido') self.b2.bind('<Button - 1>', self.gerapedido) self.b2.bind('<Return>', self.gerapedido) self.b2.grid(row=16, column=3, padx=3) def gravapedido(self, event): c = self.e1.get() t = time.strftime("%x, %X") c = c.upper() self.p = Conecta() # lembrar de colocar o comando sql ao chamar o método abaixo self.cliente = self.p.ledados( 'SELECT * FROM pedidos WHERE nome_cliente=?', (c, )) if self.cliente != []: ''' IMPORTANTE!!!! Depois de horas tentando realizar o update quando já tivesse cliente e produtos, e gravar um produto novo, quando já tivesse o cliente, depois de muita batalha (estava indo pro banco novamente mesmo já existente), isto por conta do for loop, em um loop ele achava, fazia o upload e continuava, no outro, como estaria diferente ele gravava outro registro duplicadp no banco. A solução, embora penosa, é simples. ao invés de tentar fazer tudo com o retorno de uma query (usando o self.cliente acima) eu executo uma para cada option. Assim, ele não vai percorrer todos os resuldados. Portanto faz o update se achar cliente e produto juntos ou grava um registro novo se achar cliente e não achar produto. Depois de muito tempo perdido, fica a lição de que nem sempre tentar simplificar o máximo deu certo. O ponto chave não está no self.cliente e sim no self.verifica1 dentro dos options ''' if self.var.get() != "Escolha um produto": self.verifica1 = self.p.ledados( 'SELECT * FROM pedidos WHERE nome_cliente=? AND produto=?', ( c, self.var.get(), )) if self.verifica1 != []: self.q1 = int( self.p.transformaResultados( self.p.ledados( ''' SELECT quantidade FROM pedidos WHERE nome_cliente = ? AND produto = ? ''', (c, self.var.get())))) self.p.executaUpdatePedidos(c, self.var.get(), (self.q1 + int(self.e2.get())), t) else: self.valida = int(self.e2.get()) if self.valida > 0: self.p.insereDadosPedidos(c, self.var.get(), self.e2.get(), t) else: pass if self.var2.get() != "Escolha um produto": self.verifica2 = self.p.ledados( 'SELECT * FROM pedidos WHERE nome_cliente=? AND produto=?', ( c, self.var2.get(), )) if self.verifica2 != []: self.q2 = int( self.p.transformaResultados( self.p.ledados( ''' SELECT quantidade FROM pedidos WHERE nome_cliente = ? AND produto = ? ''', (c, self.var2.get())))) self.p.executaUpdatePedidos(c, self.var2.get(), (self.q2 + int(self.e3.get())), t) else: self.valida2 = int(self.e3.get()) if self.valida2 > 0: self.p.insereDadosPedidos(c, self.var2.get(), self.e3.get(), t) else: pass if self.var3.get() != "Escolha um produto": self.verifica3 = self.p.ledados( 'SELECT * FROM pedidos WHERE nome_cliente=? AND produto=?', ( c, self.var3.get(), )) if self.verifica3 != []: self.q3 = int( self.p.transformaResultados( self.p.ledados( ''' SELECT quantidade FROM pedidos WHERE nome_cliente = ? AND produto = ? ''', (c, self.var3.get())))) self.p.executaUpdatePedidos(c, self.var3.get(), (self.q3 + int(self.e4.get())), t) else: self.valida3 = int(self.e4.get()) if self.valida3 > 0: self.p.insereDadosPedidos(c, self.var3.get(), self.e4.get(), t) else: pass if self.var4.get() != "Escolha um produto": self.verifica4 = self.p.ledados( 'SELECT * FROM pedidos WHERE nome_cliente=? AND produto=?', ( c, self.var4.get(), )) if self.verifica4 != []: self.q4 = int( self.p.transformaResultados( self.p.ledados( ''' SELECT quantidade FROM pedidos WHERE nome_cliente = ? AND produto = ? ''', (c, self.var4.get())))) self.p.executaUpdatePedidos(c, self.var4.get(), (self.q4 + int(self.e5.get())), t) else: self.valida4 = int(self.e5.get()) if self.valida4 > 0: self.p.insereDadosPedidos(c, self.var4.get(), self.e5.get(), t) else: pass self.gerado() else: if self.var.get() != "Escolha um produto": self.p.insereDadosPedidos(c, self.var.get(), self.e2.get(), t) else: pass if self.var2.get() != "Escolha um produto": self.p.insereDadosPedidos(c, self.var2.get(), self.e3.get(), t) else: pass if self.var3.get() != "Escolha um produto": self.p.insereDadosPedidos(c, self.var3.get(), self.e4.get(), t) else: pass if self.var4.get() != "Escolha um produto": self.p.insereDadosPedidos(c, self.var4.get(), self.e5.get(), t) else: pass self.gerado() def gerado(self): time.sleep(0.2) self.l7['text'] = "" time.sleep(0.5) self.l7['text'] = "Pedido inserido com sucesso" # atualizado 06/10/2018 . update e gravar pedido, terminados. def gerapedido(self, event): arquivo = open('Pedido.txt', 'w') self.g = Conecta() self.consultapedido = self.g.ledados('SELECT * FROM pedidos') if self.consultapedido != []: for i in self.consultapedido: arquivo.write('Cliente: %s Produto: %s Quantidade: %s\n' % (i[1], i[2], str(i[3]))) self.l5['text'] = 'Pedido gerado com sucesso!' self.l5['font'] = font2 arquivo.close()