Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Print valores do dicionário na GUI (Python/Tkinter)

Olá, estou tentando colocar os valores de um dicionário que foram retirados de uma planilha para uma interface gráfica feita em Tkinter. O código em si funciona, meu problema no caso é que ele só me retorna o último valor armazenado.

Segue código abaixo:

from tkinter import *
import openpyxl

root = Tk()

def func():
    newWindow = Toplevel()
    newWindow.title("Output")
    newWindow.geometry("400x500+375+50")

    # Abre a planilha e obtém o status do último pagamento.

    wb = openpyxl.load_workbook('C:/temp/cobranca.xlsx')
    sheet = wb['Sheet1']

    lastCol = sheet.max_column
    # latestMonth = sheet.cell(row=1, column=lastCol).value

    # Verifica o status de pagamento de cada cliente.

    unpaidMembers = {}
    for r in range(2, sheet.max_row + 1):
        for c in range(3, lastCol + 1):
            payment = sheet.cell(row=r, column=c).value
            if payment != 'ok':
                cliente = sheet.cell(row=r, column=1).value
                email = sheet.cell(row=r, column=2).value
                mes = sheet.cell(row=1, column=c).value
                unpaidMembers[cliente] = email
                print('Linha:', r, 'Coluna:', c, 'Cliente:', cliente, 'Email:', email, 'Mês:', mes)


    #--- LABELS ---#
    l_label1 = Label(newWindow, text="Cliente", font='-weight bold')
    l_label1.grid(row=1, column=1)
    l_label2 = Label(newWindow, text="Competência", font='-weight bold')
    l_label2.grid(row=1, column=2)

    v_result1 = StringVar()
    l_cliente = Label(newWindow, textvariable=v_result1)
    l_cliente.grid(row=2, column=1)
    v_result2 = StringVar()
    l_mes = Label(newWindow, textvariable=v_result2)
    l_mes.grid(row=2, column=2)


    #--- VARIAVEIS ---#
    result1 = cliente
    result2 = mes

    #--- OUTPUT ---#
    v_result1.set(result1)
    v_result2.set(result2)




bt = Button(root, text='Verificar', command=func)
bt.grid(row=1, column=1)


root.mainloop()

Modelo da planilha que estou utilizando: https://prnt.sc/123non7

Podem me ajudar?

3 respostas

Não vi onde foi adicionado os valores ao dicionário unpaidMembers{}. Tente adicionar os valores dos devedores no dicionario e depois dar um print nele. Entendo que usou o openpyxl, mas se ler seu arquivo com o pandas seu código vai ficar extremamente mais curto e eficaz. Boa sorte.

solução!

Implementei o que eu acho que você quer. Veja se te ajuda.

import openpyxl
from collections import defaultdict
from tkinter import *


FILE_NAME = "C:/temp/cobranca.xlsx"
SHEET_NAME = "Sheet1"


def getDicionarioFromExcel(filename, sheetname):
    wb = openpyxl.load_workbook(filename)
    sheet = wb[sheetname]
    unpaidMembers = {}
    for r in range(2, sheet.max_row + 1):
        meses = []
        for c in range(3, sheet.max_column + 1):
            payment = sheet.cell(row=r, column=c).value
            if payment != 'ok':
                mes = sheet.cell(row=1, column=c).value
                meses.append(mes)
        if meses:
            cliente = sheet.cell(row=r, column=1).value
            # email = sheet.cell(row=r, column=2).value
            unpaidMembers[cliente] = meses
    return unpaidMembers


def getMatrixFromDicionario(dicionario):
    matrix = defaultdict(list)
    for key, val in dicionario.items():
        matrix["Cliente"].append(key)
        matrix["Competência"].append(", ".join(val))
    return matrix


def createTable(root, matrix):
    # head
    for i, key in enumerate(matrix.keys(), 1):
        label = Label(root, text=key, font='-weight bold') 
        label.grid(row=1, column=i)
    # body
    font = ('Arial', 12, 'bold')
    for j, key in enumerate(matrix.keys(), 1):
        for i, item in enumerate(matrix[key], 2):
            entry = Entry(root, font=font)
            entry.grid(row=i, column=j)
            entry.insert(END, item)


def func():
    newWindow = Toplevel()
    newWindow.title("Output")
    newWindow.geometry("400x500+375+50")
    dicionario = getDicionarioFromExcel(FILE_NAME, SHEET_NAME)
    matrix = getMatrixFromDicionario(dicionario)
    createTable(newWindow, matrix)


if __name__ == "__main__":
    root = Tk()
    bt = Button(root, text='Verificar', command=func)
    bt.grid(row=1, column=1)
    root.mainloop()

Luiz Gustavo, muito obrigado pela ajuda.