Ausgabeproblem bei Liste von Dictionaries (von Gisi)

Fragen zu Tkinter.
Antworten
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi Gisi,

bei mir wurde die Seite nicht geladen, um auf Dein Posting zu antworten, darum der neue Thread.
Dein Codeausschnitt ist zwar umfangreich, enthält aber viel zu wenig Angaben, um das Problem nachvollziehen zu können.

Probiere doch mal folgenden Code als Grundgerüst:

Code: Alles auswählen

#   -*- encoding: iso-8859-1 -*-
import os
import Tkinter as TK

###############
##  Konstanten
sFONT = "Courier 8 bold"

def highlight_button(sButton):
    sButton.config(fg="red")
    
def reset_button(sButton):
    sButton.config(fg="black")

class Tabelle(TK.Toplevel):
    lKeys=["Fahrzeugart", "Preis", "Kraftstoffart",
           "Kilometer", "Leistung", "Farbe", "Klima",
           "Erstzulassung", "Anbieter", "Link"]

    def __init__(self, wMaster, lInhalt, sName="unbenannt"):
        TK.Toplevel.__init__(self, wMaster)
        self.title(sName)
        self._lTableVars = [[TK.StringVar() for x in range(len(self.lKeys))] for y in range(len(lInhalt))]
        self._create_table(iZeilenAnzahl=len(lInhalt))
        self.update_table(lInhalt)

    def _create_table(self, iZeilenAnzahl):
        "Generiert die Tabelle"
        iSpalten = len(self.lKeys)
        iZeilen = iZeilenAnzahl

        for iSpalte in range(1, iSpalten+1):
            TK.Label(self, text=self.lKeys[iSpalte-1], font=sFONT,
                     relief=TK.RIDGE, bd=1).grid(row=0, column=iSpalte, sticky=TK.NSEW, ipadx=8)

        for iZeile in range(1, iZeilen+1):
            TK.Label(self, text=str(iZeile), font=sFONT,
                     relief=TK.RIDGE, bd=1).grid(row=iZeile, column=0, sticky=TK.NSEW, ipadx=8)

        for iZeile in range(1, iZeilen+1):
            for iSpalte in range(1, iSpalten+1):
                TK.Label(self, textvariable=self._lTableVars[iZeile-1][iSpalte-1], bg="#fff", font=sFONT,
                         relief=TK.RIDGE, bd=1).grid(row=iZeile, column=iSpalte, sticky=TK.NSEW, ipadx=8)

    def update_table(self, lInhalt):
        "Füllt die Daten des Dictionaries in die Tabelle ein"
        for iZeile in range(min(len(self._lTableVars),
                                len(lInhalt))):
            dZeile = lInhalt[iZeile]
            for iSpalte in range(len(self.lKeys)):
                sKey = self.lKeys[iSpalte]
                sValue = dZeile.get(sKey, " "*5)
                self._lTableVars[iZeile][iSpalte].set(sValue)
                
        
class HauptProgramm(TK.Tk):
    def __init__(self):
        TK.Tk.__init__(self)
        self.title("Hauptfenster")
        self._create_widgets()

    def _create_widgets(self):
        self._create_menu()

        #   Frame, um die Größe zu definieren        
        self.wFrame = TK.Frame(self, width=300, height=200)
        self.wFrame.grid()

    def _create_menu(self):
        wMenuZeile = TK.Menu(self)
        wMenuZeile.add_command(label="Exit", command=self._exit)
        self.config(menu=wMenuZeile)

    def _exit(self):
        self.quit()
        self.destroy()
        
lDicts = [{'Erstzulassung': '04/00',
           'Fahrzeugart': 'Gebrauchtfahrzeug',
           'Klima': 'Klimaautomatik',
           'Farbe': 'schwarz'},
          {'Erstzulassung': '02/01',
           'Fahrzeugart': 'Neuwagen',
           'Preis': '7800 Euro'}]
wHauptProgramm = HauptProgramm()
wTabelle = Tabelle(wHauptProgramm, lDicts, "Beispiel 1")
wHauptProgramm.mainloop()
Du kannst die Werte der Dictionaries auch ändern und die Tabelle dann über die update_table-Methode aktualisieren.
Bei Unklarheiten einfach nachfragen.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Sly
User
Beiträge: 3
Registriert: Mittwoch 13. Juni 2007, 12:09

Hi Michael,

Erstmal Danke für die Antwort, sieht gut aus, das wird ausprobiert.

Ich hab dasselbe Problem wie Gisi, Gruppenarbeit... Haben es zwar inzwischen soweit gelöst (-> Tkinter aufgegeben, HTML gemacht), aber man wills halt doch wissen.

Zur Nachvollziehbarkeit- hier ist mal ein Codeschnipsel, der so auch läuft, ohne das viele Gedöns, und mit nur einem Listenelement:

Code: Alles auswählen

from Tkinter import *
from os import *

def kram():
	liste=[{'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': '--'}]
	ausgabeFun(liste)

anfang=Tk()
Button(anfang, text="starten!", command=kram).pack()
Button(anfang, text="ende", command=anfang.quit).pack()

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:
                                                                Button(ausgabe, text="Zur Anzeige", command=lambda zeile=zeile:startfile(
                                                                    dieListeVonDenValues[zeile][spalte]), bg="grey").grid(
                                                                    row=zeile+1, column=listeVonKeys.index("Link")+1, sticky=E+W)          
                                                        else:
                                                                Button(ausgabe, text="Zur Anzeige", command=lambda zeile=zeile:startfile(
                                                                    dieListeVonDenValues[zeile][spalte]), bg="white").grid(
                                                                    row=zeile+1, column=listeVonKeys.index("Link")+1, sticky=E+W)
			n+=1
		i+=1
	Button(ausgabe, text="Neue Suche", command=ausgabe.destroy, bg="white").grid(column=0, columnspan=len(listeVonKeys)+1, sticky=W+E)
	Button(ausgabe, text="Beenden", command=anfang.quit, bg="white").grid(column=0, columnspan=len(listeVonKeys)+1, sticky=W+E)

anfang.mainloop()
Und wenn du sehen willst, wie schön der bei großen Listen abstürzt, musst du nur die große Liste von Gisi pasten!

Was bin ich froh, dachte schon ich wär die einzige die nicht antworten kann :wink:
Sly
User
Beiträge: 3
Registriert: Mittwoch 13. Juni 2007, 12:09

Das ist wirklich nicht schlecht Michael, nur die "Link"-Buttons fehlen noch...
Danke, echt!
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi,

Gruppenarbeit? Heißt das Übungsaufgabe für Schule oder Studium? Oo

Ich habe das Programm mal um den Referenzaufruf erweitert. Aber wenn ihr das eh in html programmiert, interessiert es ja keinen mehr. :)

Code: Alles auswählen

#   -*- encoding: iso-8859-1 -*-
import os
import Tkinter as TK

###############
##  Konstanten
sFONT = "Courier 8 bold"

def highlight_button(sButton):
    sButton.config(fg="red")
    
def reset_button(sButton):
    sButton.config(fg="black")

class Tabelle(TK.Toplevel):
    lKeys=["Fahrzeugart", "Preis", "Kraftstoffart",
           "Kilometer", "Leistung", "Farbe", "Klima",
           "Erstzulassung", "Anbieter", "Link"]

    def __init__(self, wMaster, lInhalt, sName="unbenannt"):
        TK.Toplevel.__init__(self, wMaster)
        self.title(sName)
        self._lTableVars = [[TK.StringVar() for x in range(len(self.lKeys))] for y in range(len(lInhalt))]
        self._create_table(iZeilenAnzahl=len(lInhalt))
        self.update_table(lInhalt)

    def _create_table(self, iZeilenAnzahl):
        "Generiert die Tabelle"
        iSpalten = len(self.lKeys)
        iZeilen = iZeilenAnzahl

        for iSpalte in range(1, iSpalten+1):
            TK.Label(self, text=self.lKeys[iSpalte-1], font=sFONT,
                     relief=TK.RIDGE, bd=1).grid(row=0, column=iSpalte, sticky=TK.NSEW, ipadx=8)

        for iZeile in range(1, iZeilen+1):
            TK.Label(self, text=str(iZeile), font=sFONT,
                     relief=TK.RIDGE, bd=1).grid(row=iZeile, column=0, sticky=TK.NSEW, ipadx=8)

        for iZeile in range(1, iZeilen+1):
            for iSpalte in range(1, iSpalten+1):
                
                #   wenn Link: füge einen Button statt einem Label ein
                if self.lKeys[iSpalte-1] == "Link":
                    
                    def show_in_browser(iZ=iZeile, iS=iSpalte):
                        """Individuelle Aufrufprozedur"""
                        sLink = self._lTableVars[iZ-1][iS-1].get()
                        
                        #   nicht anzeigen, wenn der Link nur whitespaces enthält
                        if not sLink.strip(): return
                        os.startfile(sLink)

                    TK.Button(self, textvariable=self._lTableVars[iZeile-1][iSpalte-1],
                              bg="#fff", font=sFONT, command=show_in_browser, width=10,
                              bd=5).grid(row=iZeile, column=iSpalte, sticky=TK.NSEW, ipadx=8)

                #   sonst füge ein Label zur Darstellung ein
                else:            
                    TK.Label(self, textvariable=self._lTableVars[iZeile-1][iSpalte-1], bg="#fff", font=sFONT,
                             relief=TK.RIDGE, bd=1).grid(row=iZeile, column=iSpalte, sticky=TK.NSEW, ipadx=8)

    def update_table(self, lInhalt):
        "Füllt die Daten des Dictionaries in die Tabelle ein"
        for iZeile in range(min(len(self._lTableVars),
                                len(lInhalt))):
            dZeile = lInhalt[iZeile]
            for iSpalte in range(len(self.lKeys)):
                sKey = self.lKeys[iSpalte]
                sValue = dZeile.get(sKey, "")
                self._lTableVars[iZeile][iSpalte].set(sValue)
                
        
class HauptProgramm(TK.Tk):
    def __init__(self):
        TK.Tk.__init__(self)
        self.title("Hauptfenster")
        self._create_widgets()

    def _create_widgets(self):
        self._create_menu()

        #   Frame, um die Größe zu definieren        
        self.wFrame = TK.Frame(self, width=300, height=200)
        self.wFrame.grid()

    def _create_menu(self):
        wMenuZeile = TK.Menu(self)
        wMenuZeile.add_command(label="Exit", command=self._exit)
        self.config(menu=wMenuZeile)

    def _exit(self):
        self.quit()
        self.destroy()
        
lDicts = [{'Erstzulassung': '04/00',
           'Fahrzeugart': 'Gebrauchtfahrzeug',
           'Klima': 'Klimaautomatik',
           'Farbe': 'schwarz'},
          {'Erstzulassung': '02/01',
           'Fahrzeugart': 'Neuwagen',
           'Preis': '7800 Euro'},
          {'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': '--'}]
wHauptProgramm = HauptProgramm()
wTabelle = Tabelle(wHauptProgramm, lDicts, "Beispiel 1")
wHauptProgramm.mainloop()
Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten