Label in einer Tabelle verändern(Farbe)

Fragen zu Tkinter.
Antworten
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Mittwoch 2. November 2005, 13:12

Hallo

Ich möchte gerne in einer Tabelle aus Labeln das Aussehen einzelner Zeilen und Spalten verändern.
Umgesetzt habe ich bis jetzt:
- färbe Text in Zeilen mit negativen Beträgen rot
- hebe jede 2. Spalte hervor

Code: Alles auswählen

#!/usr/bin/env python
import string
from Tkinter import *

verschachtelte_liste = [
    ["BAR FOOBAR","12345678","23456789","-2,05","EUR"],
    ["FOO,BAR","119032142","23456789","180,00","EUR"],
    ["BAR FOOBAR","12345678","23456789","-2,05","EUR"],
    ["FOO,BAR","119032142","23456789","180,00","EUR"],
]

root=Tk()
root.title("Labels im array")

for zeile in range(len(verschachtelte_liste)):
    for spalte in range(len(verschachtelte_liste[zeile])):
        if string.atof(string.replace(verschachtelte_liste[zeile][3], ",", "."))<0:
            if spalte % 2 == 0:
                Label(
                    text=verschachtelte_liste[zeile][spalte],
                    bd=1, relief="flat",fg="red"
                ).grid(
                    row=zeile, column=spalte,sticky=E+W)
            else:
                Label(
                    text=verschachtelte_liste[zeile][spalte],
                    bd=1, relief="groove",fg="red"
                ).grid(
                    row=zeile, column=spalte,sticky=E+W)
        else:
            if spalte % 2 == 0:
                Label(
                    text=verschachtelte_liste[zeile][spalte],
                    bd=1, relief="flat",
                ).grid(
                    row=zeile, column=spalte,sticky=E+W)
            else:
                Label(
                    text=verschachtelte_liste[zeile][spalte],
                    bd=1, relief="groove"
                ).grid(
                    row=zeile, column=spalte,sticky=E+W)

root.mainloop()


Mein if-else Konstrukt sieht aber jetzt schon abenteuerlich aus.
Wenn ich nun noch den Fall einbaue:
- färbe den Hintergrund jeder 2. Zeile weiß
wird es mir zu viel.

Meine Fragen nun:
1) Kann ich nicht irgendwie einmal das Grid mit Standartwerden(Farben) aufbauen und nachträglich in eigenen Funktionen für die einzelnen Fälle die Labels beeinflussen?

Eine Idee habe ich schon unter:
http://www.python-forum.de/viewtopic.php?t=3474
gesehen.
Da werden alle Labels erst in einer Liste gespeichert und darüber können dann einzelne Elemente verändern werden.
1.2) Was haltet ihr davon? Ist das elegant? Ich erwarte einige hundert Zeilen und 10 Spalten

2)Kann man auch die Rahmenfarbe eines Labels verändern (habe da bisher nix zu finden können)?


Bin für jede Idee / jeden Tipp dankbar.

cu Sebastian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 2. November 2005, 15:18

Hi!
Mr_Snede hat geschrieben: Da werden alle Labels erst in einer Liste gespeichert und darüber können dann einzelne Elemente verändern werden.
1.2) Was haltet ihr davon? Ist das elegant
Da die Lösung von mir stammt, ist sie natürlich genial und wahnsinnig elegant :D
Mr_Snede hat geschrieben: 1) Kann ich nicht irgendwie einmal das Grid mit Standartwerden(Farben) aufbauen und nachträglich in eigenen Funktionen für die einzelnen Fälle die Labels beeinflussen?
Ich würd vielleicht so etwas in der Art machen:

Code: Alles auswählen

for zeile, lst in enumerate(verschachtelte_liste):
    # Farbe wegen negativer Zahl
    if float(lst[3].replace(",",".")) < 0: fg_color = "red"
    else: fg_color = "blue"
    # Hintergrund jeder 2. Zeile weiss
    if zeile % 2: bg_color = "white"
    else: bg_color = None

    for spalte, element in enumerate(lst):
        # jede 2. Spalte hervorgehoben
        if spalte % 2: relief = "groove"
        else: relief = "flat"
        Label(
                text=element, bd=1, relief=relief, 
                fg=fg_color, background=bg_color
                ).grid(row=zeile, column=spalte, sticky=E+W)
Wenn Du die Tabelle nachher noch editieren willst, wirds so natürlich mühsam. Da ist das Speichern in ein Array sicher praktischer.

UPDATE: Muss die Liste aus Labels bestehen? Vielleicht interessiert Dich ja so eine Multilistbox

Gruß, mawe
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Mittwoch 2. November 2005, 16:26

Danke,
das sieht doch schon mal viel ordentlicher aus.

Mir ist es egal wie ich meine Tabelle baue, sollte möglichst simpel und übersichtlich sein.

Editiert wird da erstmal nichts.
Im Ende möchte ich zwei Ansichten generieren:
1. die Tabellarische und
2. einen Graphen

Wenn ich das habe und meine Kontostände importieren / exportieren (csv Dateien) kann, bin ich glücklich.

Die Multilistbox schreckt mich etwas ab (ist noch etwas zu hoch für mich) scheint aber ansonsten ganz cool zu sein. Da werde ich mal ein Auge drauf behalten.

Ich probiere heute Abend deine "geniale und wahnsinnig elegante" Lösung aus und schaue die aus dem obenstehenden Post richtig an. Bin nämlich nicht so mit enumerate vertraut.


cu Sebastian

Edit:
Habe gerade noch ScrolledHList aus der tix Widgetsammlung gefunden, ich werde einfach mal alles ausprobieren. Vorallem, wenn ich schon tix benutze kann ich auch gleich dessen Dateiöffnendialog benutzen, der von Tkinter bringt mich unter Linux auf die Palme.
Link: http://tix.sourceforge.net/dist/current ... ro.htm#M32

Edit2:
Bin gerade mit einer Lösung basierend auf pmw speziell mit scrolledFrame recht glücklich für heute.
Screenshot + Quelltext gibt es hier: http://spuddel.sp.funpic.de/dokuwiki2/d ... ontolister
Antworten