Ausgabeproblem bei Liste von Dictionaries

Fragen zu Tkinter.
Antworten
Gisi
User
Beiträge: 15
Registriert: Sonntag 13. Mai 2007, 17:28

Hi,

folgendes Dictionary sei ein Corpus:

Code: Alles auswählen

[{'Erstzulassung': '04/00', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '298 kW', 'Kilometer': '72.000 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111259405817', 'Preis': '76.900', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '10/00', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': '--', 'Farbe': 'schwarz-metallic', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '298 kW', 'Kilometer': '77.500 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111259405817', 'Preis': '77.500', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '06/00', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaanlage', 'Farbe': 'schwarz-metallic', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '298 kW', 'Kilometer': '131.000 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111259405817', 'Preis': '88.500', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '04/01', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '--', 'Kilometer': '62.500 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111263406584', 'Preis': '89.000', 'Kraftstoffart': 'Benzin', 'Anbieter': 'privat', 'Tueren': '--'}, {'Erstzulassung': '06/01', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': '--', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': '--', 'Leistung': '298 kW', 'Kilometer': '--', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111263406584', 'Preis': '91.900', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '11/01', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '298 kW', 'Kilometer': '65.000 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111263406584', 'Preis': '93.500', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '10/01', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': '--', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '298 kW', 'Kilometer': '34.900 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111172855388', 'Preis': '109.000', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '03/05', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': '--', 'Farbe': '--', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '335 kW', 'Kilometer': '13.476 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111172855388', 'Preis': '118.000', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '02/02', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz-metallic', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '298 kW', 'Kilometer': '80.500 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111172855388', 'Preis': '119.900', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '04/02', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '336 kW', 'Kilometer': '42.000 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111258913457', 'Preis': '159.750', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '04/04', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': '--', 'Farbe': '--', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '335 kW', 'Kilometer': '34.500 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111258913457', 'Preis': '160.000', 'Kraftstoffart': 'Benzin', 'Anbieter': 'privat', 'Tueren': '--'}, {'Erstzulassung': '05/04', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': '--', 'Leistung': '336 kW', 'Kilometer': '20.800 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111258913457', 'Preis': '161.999', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '09/03', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': '--', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': '--', 'Leistung': '298 kW', 'Kilometer': '120 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111263042333', 'Preis': '165.000', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '02/03', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '336 kW', 'Kilometer': '16.900 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111263042333', 'Preis': '168.500', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '02/02', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '336 kW', 'Kilometer': '22.000 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111263042333', 'Preis': '174.900', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '09/04', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz-metallic', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '298 kW', 'Kilometer': '8.900 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111254063539', 'Preis': '219.500', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '01/06', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz-metallic', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '298 kW', 'Kilometer': '13.900 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111254063539', 'Preis': '245.000', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '--', 'Fahrzeugart': '--', 'Klima': '--', 'Farbe': '--', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '336 kW', 'Kilometer': '--', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111254063539', 'Preis': '288.902', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '--', 'Fahrzeugart': '--', 'Klima': '--', 'Farbe': 'schwarz', 'ESP': '--', 'ABS': '--', 'Leistung': '373 kW', 'Kilometer': '0 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111262861386', 'Preis': '313.500', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '04/07', 'Fahrzeugart': 'Gebrauchtfahrzeug', 'Klima': 'Klimaautomatik', 'Farbe': 'schwarz', 'ESP': 'ESP', 'ABS': 'ABS', 'Leistung': '372 kW', 'Kilometer': '1.500 km', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111262861386', 'Preis': '324.900', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}, {'Erstzulassung': '--', 'Fahrzeugart': '--', 'Klima': 'Klimaautomatik', 'Farbe': '--', 'ESP': '--', 'ABS': 'ABS', 'Leistung': '373 kW', 'Kilometer': '--', 'Link': 'http://mobile.de/cgi-bin/da.pl?bereich=pkw&id=11111111262861386', 'Preis': '326.448', 'Kraftstoffart': 'Benzin', 'Anbieter': '--', 'Tueren': '--'}]
Das ganze soll in einer Tabelle ausgegeben werden. In jeder Zeile steht dabei ein Fahrzeug, bzw ein Dictionary. Ist die Liste kleiner, zB mit nur 4 Fahrzeugen (Dictionaries), funktioniert folgender Code (Aussschnitt):

Code: Alles auswählen

from os import *
from Tkinter import *

ausgabeFun(listebla)

def buttonHighlight(button):
    button.config(fg="red")
def unHighlight(button):
    button.config(fg="black")

def detail(ausgabe,listeVonDicts):
    ausgabe.destroy()
    listeVonKeys=["Fahrzeugart","Preis","Kraftstoffart","Kilometer", "Leistung", "Tueren", "Farbe", "Erstzulassung",
                  "Klima", "Anbieter", "ABS", "ESP", "Link"]
    dieListeVonDenValues=[]
    

    for i in range(len(listeVonDicts)):
        auto=listeVonDicts[i]
        dieListeVonDenValues.append([auto[key] for key in listeVonKeys])
     
    ausgabe=Tk()
    ausgabe.title("Ergebnis : Details")

    i=0
    for row in range(len(dieListeVonDenValues)+1):
        n=0
        for column in listeVonKeys:
                if i==0:
                    Label(ausgabe, text=column).grid(row=i, column=n+1, sticky=W+E)
                elif n==0:
                    Label(ausgabe, text=row).grid(row=i, column=n, sticky=W+E)
                else:
                    for zeile in range(len(dieListeVonDenValues)):
                            for spalte in range(len(dieListeVonDenValues[zeile])):
                                    if zeile % 2==0 and spalte!=listeVonKeys.index("Link"):
                                            lab=Label(ausgabe, text=dieListeVonDenValues[zeile][spalte], bg="grey").grid(
                                                row=zeile+1, column=spalte+1, sticky=E+W)
                                    elif zeile % 2 !=0 and spalte != listeVonKeys.index("Link"):
                                            labl=Label(ausgabe, text=dieListeVonDenValues[zeile][spalte], bg="white").grid(
                                                row=zeile+1, column=spalte+1, sticky=E+W)
                                    if spalte==listeVonKeys.index("Link")-2:
                                            if zeile % 2==0:
                                                butt=Button(ausgabe, text="Zur Anzeige", command=lambda zeile=zeile:startfile(
                                                    dieListeVonDenValues[zeile][spalte]), bg="grey")
                                                butt.bind('<Enter>', lambda event, butt=butt:buttonHighlight(butt))
                                                butt.bind('<Leave>', lambda event, butt=butt:unHighlight(butt))
                                                butt.grid(
                                                    row=zeile+1, column=listeVonKeys.index("Link")+1, sticky=E+W)
                                            else:
                                                butt=Button(ausgabe, text="Zur Anzeige", command=lambda zeile=zeile:startfile(
                                                    dieListeVonDenValues[zeile][spalte]), bg="white")
                                                butt.bind('<Enter>', lambda event, butt=butt:buttonHighlight(butt))
                                                butt.bind('<Leave>', lambda event, butt=butt:unHighlight(butt))
                                                butt.grid(
                                                    row=zeile+1, column=listeVonKeys.index("Link")+1, sticky=E+W)
                                       
                n+=1
        i+=1
    neu=Button(ausgabe, text="Neue Suche", command=ausgabe.destroy, bg="white")
    neu.bind('<Enter>', lambda event, neu=neu:buttonHighlight(neu))
    neu.bind('<Leave>', lambda event, neu=neu:unHighlight(neu))
    neu.grid(column=0, columnspan=len(listeVonKeys)+1, sticky=W+E)
    
    ende=Button(ausgabe, text="Beenden", command=hauptfenster.quit, bg="white")
    ende.bind('<Enter>', lambda event, ende=ende:buttonHighlight(ende))
    ende.bind('<Leave>', lambda event, ende=ende:unHighlight(ende))
    ende.grid(column=0, columnspan=len(listeVonKeys)+1, sticky=W+E)
    
def ausgabeFun(listeVonDicts):
    listeVonKeys=["Preis","Kraftstoffart","Kilometer", "Leistung", "Farbe", "Erstzulassung",
                  "Anbieter", "Link"]
    dieListeVonDenValues=[]
    

    for i in range(len(listeVonDicts)):
        auto=listeVonDicts[i]
        dieListeVonDenValues.append([auto[key] for key in listeVonKeys])
     
    ausgabe=Tk()
    ausgabe.title("Ergebnis")

    i=0
    for row in range(len(dieListeVonDenValues)+1):
        n=0
        for column in listeVonKeys:
                if i==0:
                    Label(ausgabe, text=column).grid(row=i, column=n+1, sticky=W+E)
                elif n==0:
                    Label(ausgabe, text=row).grid(row=i, column=n, sticky=W+E)
                else:
                    for zeile in range(len(dieListeVonDenValues)):
                            for spalte in range(len(dieListeVonDenValues[zeile])):
                                    if zeile % 2==0 and spalte!=listeVonKeys.index("Link"):
                                            lab=Label(ausgabe, text=dieListeVonDenValues[zeile][spalte], bg="grey").grid(
                                                row=zeile+1, column=spalte+1, sticky=E+W)
                                    elif zeile % 2 !=0 and spalte != listeVonKeys.index("Link"):
                                            labl=Label(ausgabe, text=dieListeVonDenValues[zeile][spalte], bg="white").grid(
                                                row=zeile+1, column=spalte+1, sticky=E+W)
                                    if spalte==listeVonKeys.index("Link")-2:
                                            if zeile % 2==0:
                                                butt=Button(ausgabe, text="Zur Anzeige", command=lambda zeile=zeile:startfile(
                                                    dieListeVonDenValues[zeile][spalte]), bg="grey")
                                                butt.bind('<Enter>', lambda event, butt=butt:buttonHighlight(butt))
                                                butt.bind('<Leave>', lambda event, butt=butt:unHighlight(butt))
                                                butt.grid(
                                                    row=zeile+1, column=listeVonKeys.index("Link")+1, sticky=E+W)          
                                            else:
                                                butt=Button(ausgabe, text="Zur Anzeige", command=lambda zeile=zeile:startfile(
                                                    dieListeVonDenValues[zeile][spalte]), bg="white")
                                                butt.bind('<Enter>', lambda event, butt=butt:buttonHighlight(butt))
                                                butt.bind('<Leave>', lambda event, butt=butt:unHighlight(butt))
                                                butt.grid(
                                                    row=zeile+1, column=listeVonKeys.index("Link")+1, sticky=E+W)
                n+=1
        i+=1
    neu=Button(ausgabe, text="Neue Suche", command=ausgabe.destroy, bg="white")
    neu.bind('<Enter>', lambda event, neu=neu:buttonHighlight(neu))
    neu.bind('<Leave>', lambda event, neu=neu:unHighlight(neu))
    neu.grid(column=0, columnspan=len(listeVonKeys)+1, sticky=W+E)
    detailB=Button(ausgabe, text="Detailausgabe", command=lambda:detail(ausgabe,listeVonDicts), bg="white")
    detailB.bind('<Enter>', lambda event, detailB=detailB:buttonHighlight(detailB))
    detailB.bind('<Leave>', lambda event, detailB=detailB:unHighlight(detailB))
    detailB.grid(column=0, columnspan=len(listeVonKeys)+1, sticky=W+E)
    ende=Button(ausgabe, text="Beenden", command=hauptfenster.quit, bg="white")
    ende.bind('<Enter>', lambda event, ende=ende:buttonHighlight(ende))
    ende.bind('<Leave>', lambda event, ende=ende:unHighlight(ende))
    ende.grid(column=0, columnspan=len(listeVonKeys)+1, sticky=W+E)
Wenn aber die Liste zu lang ist, wie die oben gepostetete, funktionierts nicht mehr. Python stürzt ab.

Weiß einer Rat?

Danke im Vorraus,

Gisi
Antworten