Aplicación: estamos trabajando en un sector donde nuestro producto puede tener cientos de propiedades diferentes. Y cuando tengamos que hacer una oferta por decenas de productos, esta aplicación podría ayudarnos a reducir el número de ofertas reuniendo productos con la misma configuración.

Cómo funciona: el usuario da las propiedades en las entradas y la aplicación las comparará para ver si algunas configuraciones son iguales (aquí configuración = "Config 0", o "Config 1" y así sucesivamente. ..).

Las configuraciones y las propiedades dadas deben colocarse en un {Config 1: [1800,1,1500, x ...] como un diccionario, Config 2: [2000,2,1600, x ...], Config n: [x, y, o, x ...]} El programa comparará la lista de valores de las claves e intentará si alguna lista de valores es la misma.

Problema: no he logrado comparar los valores del diccionario para saber si hay claves con los mismos valores

¿Cómo puedo resolver este problema?

El botón 'Iniciar' permite iniciar la comparación.

import os
from tkinter import *
from tkinter import ttk


data_list=['Name','Q','Speed','TH','Open through','Level','Accesses','CW','CD','CH','SW','SD','Headroom','SP','Door type','DW','DH']
list_excel=[]
dict_user_entries={}
dict_redundance={}

fenetre =Tk()
fenetre.geometry('800x750')
a = 5
nbofconfig=4

def comparison():
    dict_redundance={}
    for r in range(len(dict_user_entries)):
        for o in range(len(dict_user_entries)):
            if dict_user_entries['Config '+str(r)] == dict_user_entries['Config '+str(o)]: #---  We compare if the values of the compared keys are the same
                print('yes -- Config ',str(r),' = Config ',str(o))
                if  'Config '+str(o) in dict_redundance:
                    dict_redundance['Config '+str(o)].append('Config '+str(r))
                else:
                    dict_redundance['Config '+str(o)]=['Config '+str(r)]
                
            else:
                print('no -- Config ',str(r),' =x= Config ',str(o))
                
    #----- print
    for i in dict_redundance.keys():
        print(i)
        
            

    
cadrebouton=Frame(fenetre)
cadrebouton.pack(side=TOP,anchor=NW)
boutonexcel=Button(cadrebouton,text="Load Excel File",width=15,height=1,bg="white",bd=5, command=excel_load)
boutonexcel.pack(side=LEFT, anchor =NW)
boutontest=Button(cadrebouton,text="Test",width=15,height=1,bg="white",bd=5, command=test)
boutontest.pack(side=LEFT, anchor =NW)
boutonlaunch=Button(cadrebouton,text="Launch",width=15,height=1,bg="white",bd=5, command=comparison)
boutonlaunch.pack(side=LEFT, anchor =NW)

head_frame=Frame(fenetre)
head_frame.pack(side=TOP,anchor=NW)

head_label=Label(head_frame,text='Data',width=15)
head_label.pack(side=LEFT)

for i in range(nbofconfig):
    head_config=Label(head_frame,text='Config '+str(i), width=13)
    head_config.pack(side=LEFT)


cadre_global=Frame(fenetre)
cadre_global.pack(side=TOP,anchor=NW)

cadre_global2=Frame(cadre_global)
cadre_global2.pack(side=LEFT)


for x in range(a):
    frame=Frame(cadre_global2)
    frame.pack(side=TOP,anchor=NW)
    
    label_data=Label(frame,width=15,text=data_list[x])
    label_data.pack(side=LEFT)
    
cadre_global3=Frame(cadre_global)
cadre_global3.pack(side=LEFT)
bx=0#------Test, to delete



    
for i in range(nbofconfig):

    frame2=Frame(cadre_global3)
    frame2.pack(side=LEFT)
    dict_user_entries['Config '+str(i)]=[]
    for x in range(a):
        bx+=x
        var_entry=StringVar()
        my_entry=Entry(frame2,textvariable=var_entry, width=15,bd=2) #--- Users gives the property
        my_entry.insert(0,bx)
        my_entry.pack()
        dict_user_entries['Config '+str(i)].append(my_entry) #--- Data from user will stored in the dictionnary
     
    
fenetre.mainloop()

os.system('pause')

Aquí un ejemplo: ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

¡Gracias!

EDITAR 11.05.2021: Encontré la solución. Juste puso las claves y valores de dict_user_entries con .get () en un nuevo diccionario.

def comparison():
    list_values=[]
    dict_2={}
    dict_reference={}
    dict_final={}
    
    #---- We put the data of entries in a new dictionnary
    index_1=0
    for keys in dict_user_entries.keys():
        dict_2[list_name[index_1].get()]=[]
        for i in range(a):
            dict_2[list_name[index_1].get()].append(dict_user_entries[keys][i].get()) 
        index_1+=1
    
    #---- We stored value in a list to count the number of different configurations (len(list_values)) and create intermediate dictionaries
    index=0
    for keys in dict_2.keys():
        if dict_2[keys] in list_values:
            pass
        else:
            list_values.append(dict_2[keys])
            dict_reference['Config '+str(index)]=dict_2[keys]
            dict_final['Config '+str(index)]=[]
            index+=1
            
    #---- We create the unique configurations with their datas
    index_2=0
    for keys in dict_2.keys():
        for i in dict_reference.keys():
            if dict_2[keys] == dict_reference[i]:
                dict_final[i].append(list_name[index_2].get())
            else:
                pass
        index_2+=1        
                
    #----- print
    for keys in dict_final.keys():
        print('\n',keys,' = ',dict_reference[keys],' = ', dict_final[keys])
0
Latiole 10 may. 2021 a las 16:04

1 respuesta

La mejor respuesta

Parece que lo que está comparando es una lista de instancias de entrada tkinter. Lo que debe hacer es extraer el valor de la entrada y luego comparar los valores. No puede hacer una comparación en una lista completa, porque lo que está comparando es el objeto de lista en sí, no los valores.

Reemplace esta línea:

if dict_user_entries['Config '+str(r)] == dict_user_entries['Config '+str(o)]:

Con esto:

list_a = [x.get() for x in dict_user_entries['Config '+str(r)]]
list_b = [x.get() for x in dict_user_entries['Config '+str(o)]]
if all([list_a[i] == list_b[i] for i in range(len(list_a))]):
1
idryer 11 may. 2021 a las 14:03