wx.ListCtrl Hintergrundfarbe einer Zelle nicht Zeile

Plattformunabhängige GUIs mit wxWidgets.
Antworten
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hallo!

Kann man in einer ListCtrl die Hintergrundfarbe einer Zelle schalten?

Mit

Code: Alles auswählen

index = 0
item = self.GetItem(index)
item.SetBackgroundColour((255,255,0)) 
self.SetItem(item)
kann ich nur die Hintergrundfarbe der ganzen (hier 1.) Zeile auf (hier) gelb setzen!?

Möchte auffällige Werte in einer Liste farblich hervorheben.

Wenn das nicht geht, dann :x

Grüße aus Berlin
JR
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Schau dir einfach mal die Dokumentation an von wx.ListCtrl...

Code: Alles auswählen

SetItemBackgroundColour(self, item, col)
demfall

Code: Alles auswählen

self.SetItemBackgroundColour(listitem, 1)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:Kann man in einer ListCtrl die Hintergrundfarbe einer Zelle schalten?
Hi JR!

Schau dir in der wxPython-Demo, die Demo des "ListCtrl_virtual" an. Dort werden Zeilen eingefärbt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Gero!

Ich meinte ZELLE nicht ZEILE :-)

Möchte nicht immer die ganze Zeile farblich darstellen, sondern nur bestimmte Zellen in einer Zeile einfärben.

Mal eine zweite (ganz andere Frage):
Du bist für mich bisher hier der Plone-Crack. Ich muss unbedingt an die Passwörter meiner registrierten Benutzer kommen, um sie parallel in einer MySQL-Tabelle zu sichern. Diese Tabelle wird von meiner Webapplikation in Plone und gleichzeitig in einer ähnlichen Applikation in wx.Python verwendet. Letzter soll einen Benutzerzugang für diesselben Anwender erhalten.

Grüße und hoffe, du weißt da etwas zu zu schreiben
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:Ich muss unbedingt an die Passwörter meiner registrierten Benutzer kommen
Hi JR!

Das geht nicht, da nur der MD5-Hash gespeichert wird.
Es gibt evt. eine andere Möglichkeit -- man kann die Plone-Benutzer auch von anderen Systemen wie z.B. ActiveDirectory verwalten lassen. Es gibt also eine Möglichkeit, Plone mit anderen Systemen zu verbinden. Allerdings habe ich davon keine Ahnung.

--> http://www.dzug.org/kommunikation
oder
--> http://plone.org/support

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

Danke erstmal für die schnelle Reaktion.

Das verstehe ich nicht. Wenn meine Benutzer zum Beispiel ihr Passwort ändern, geben sie es in ein Formular ein. Irgendwie muss ich doch in dem Augenblick, wo sie es absenden, an den Inhalt des Feldes für das neue Passwort kommen!?

Naja.

Wie ist es mit dem Einfärben einzelner Zellen? Ich befürchte, das geht nicht, oder? Hab da mal wo aufgeschnappt, dass jemand deswegen die Liste vom Typ wx.ListCtrl nicht mag. Dachte aber, evtl. hat er es einfach nur nicht hinbekommen, weniger als immer eine ganze Zeile einzufärben...

Gruß
JR
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo, Ich glaube, das geht nicht, einzelne Zellen
einzufärben. Du könntest aber ein Grid verwenden.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi!

Danke, das befürchte ich auch.
Hab mir jetzt in zwei, drei Tagen Arbeit so eine riesige und komfortable Bibliothek (basierend auf dem Objekt wx.ListCtrl) geschaffen und darf mich jetzt wohl ärgern... :oops:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:Das verstehe ich nicht. Wenn meine Benutzer zum Beispiel ihr Passwort ändern, geben sie es in ein Formular ein. Irgendwie muss ich doch in dem Augenblick, wo sie es absenden, an den Inhalt des Feldes für das neue Passwort kommen!?
Hi JR!

Natürlich kommst du in **exakt diesem** Moment an das Passwort. Du musst nur einen zusätzlichen **Validator** an die Seitenvorlage heften. Dieser Validator bekommt alle, vom Formular übertragenen Daten übermittelt. Diese kannst du dann irgendwo abspeichern.

Achte aber auch darauf, dass es mehrere Stellen gibt, an denen ein Passwort eingegeben/geändert werden kann. Diese musst du auch anpassen.

Was ich sagen wollte ist, dass das Passwort nicht gespeichert wird. Willst du das Passwort nachträglich herausfinden, ist das nicht möglich, da du in Zope nur noch den MD5-Hash des Passworts finden wirst.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

...Ein anderer Ansatzpunkt ist das Skript ``portal_skins/plone_login/register``. An dieses Skript wird das Passwort (wahrscheinlich) im Klartext übermittelt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hi Gerold!

Ich werde alle Benutzer einfach bitten, ihr Passwort einmal in einen Dummy und dann in das gewünschte Passwort zu ändern. Die Passwortänderung fange ich ab und notiere sie in meiner MySQL-Tabelle. Dasselbe mache ich beim Zurücksetzen von Passwörtern (Plone-Funktion).

Muss mir wohl nochmal das Kapitel zum MD5-Verschlüsseln in Python Ge-Packt durchlesen. Dachte über Benutzername und MD5-Hash komme ich aufs Passwort...

Danke für den Tipp mit dem Validator!

Grüße
JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:Muss mir wohl nochmal das Kapitel zum MD5-Verschlüsseln in Python Ge-Packt durchlesen. Dachte über Benutzername und MD5-Hash komme ich aufs Passwort...
Hi JR!

Mit MD5 erstellst du so etwas ähnliches wie eine Ziffernsumme -- nur viel komplexer.

Nehmen wir mal an, du hast zwei Passwörter ("123" und "234"). Wenn du alle Zahlen zusammenzählst, bekommst du eine Summe, mit der du prüfen kannst, ob jemand das korrekte Passwort eingegeben hat.

Code: Alles auswählen

"123" --> 6
"234" --> 9
In diesem Beispiel wären die Ergebnisse 6 und 9 die Ziffernsummen. Wenn du später wieder herausfinden möchtest, ob jemand das korrekte Passwort übermittelt, dann bildest du aus dem übermittelten Passwort wieder so eine Ziffernsumme und vergleichst diese mit der gespeicherten Ziffernsumme.

So brauchst du nicht das Passwort zu speichern und deine Anwendung ist automatisch sicherer.

In diesem Beispiel ist es natürlich ziemlich einfach, andere Passwörter zu bilden die ebenfalls wieder die Ziffernsummen 6 oder 9 ergeben. Deshalb gibt es komplexere Algorithmen wie MD5 oder SHA, die aus einem String oder einer ganzen Datei einen langen eindeutigen Hashwert bilden. Dieser Hashwert ist ziemlich eindeutig und kann nur mit sehr hohem Rechenaufwand zurückgerechnet werden.

Wenn du den MD5-Hash statt dem Passwort in einer Datenbank speicherst dann weiß niemand, außer dem Benutzer selber, das Passwort und trotzdem kannst du das Passwort beim Anmelden anhand des gespeicherten MD5-Hashes auf Korrektheit prüfen.
Dazu errechnest du einfach erneut den MD5-Hash des übermittelten Passworts und vergleichst es mit dem MD5-Hash, den du in der Datenbank gespeichert hast.

lg
Gerold
:-)
Zuletzt geändert von gerold am Freitag 29. September 2006, 14:25, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Hey Gerold,

danke für die Erläuterung.

Du bist Site-Admin.
Vielleicht magst du diese Fragen zu Plone ja hier im Forum verschieben, damit andere Leser diese denke ich interessante Frage plus Antworten besser finden können?

JR
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

JR hat geschrieben:Du bist Site-Admin.
Vielleicht magst du diese Fragen zu Plone ja hier im Forum verschieben, damit andere Leser diese denke ich interessante Frage plus Antworten besser finden können?
Hi JR!

Das ist das Problem, wenn mehrere Frage in einem Thread behandelt werden. Manchmal ist es zu viel Arbeit die Themen aufzuteilen, da man dann auch Beiträge aufteilen müsste.

Ist zwar schade, aber dieses Thema aufzuteilen ist mir zu viel Arbeit. -- Sollte aber die Ausnahme bleiben.

Du könntest aber einen Beitrag ins Zope-Forum (mit ein paar Stichwörtern) schreiben und auf diesen Thread verweisen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Guten Morgähn :-)

Nachdem ich mich nun seit einigen Stunden damit beschäftige, eine Subklasse des wx.grid.Grid zu erstellen und mich zunächst über die vielen Möglichkeiten erfreue, stehe ich nun vor einem Problem :-(

Mein Grid soll sich wie eine ganz normale Liste verhalten. Unter anderem soll die Zeilenhöhe nicht veränderbar sein. In der wx.Python-Refrenz wird ein Event namens "EVT_GRID_ROW_SIZE" erwähnt. Es klingt so, als sei dies das Event für meinen Fall. Nur wie kann ich ein Binding erstellen?

Das...

Code: Alles auswählen

self.Bind(wx.EVT_GRID_ROW_SIZE, self.EvtRowSize, self)
... geht leider nicht.

Und was sagt mir folgender Satz:
"The event handler for the following functions takes a wxGridSizeEvent parameter. The ..._CMD_... variants also take a window identifier."

Hat jemand schon mal Erfahrung in dieser Richtung gesammelt?

Hoffentlich findet sich mal jemand, dem ich Fragen beantworten kann ;-)

Grüße
JR
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Schlüsselworte (Grid, Event, EVT_GRID_ROW_SIZE. EVTwx.grid.Grid, wx.grid)

Also, nach vielen unzähligen Try And Error-Versuchen:

Code: Alles auswählen

import wx.grid
# self ist hier eine Instance von wx.grid.Grid
wx.grid.EVT_GRID_ROW_SIZE(self, self.Event)
# self.Event ist eine Methode, welche ich erstellt habe. Sie wird nun ausgelöst, wenn der Anwender versucht, die Zeilenhöhe zu ändern.
nur zur Veranschaulichung...

Weiter gehts ;-)
JR
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

ohne Kommentar :oops:

Code: Alles auswählen

wx.grid.Grid.DisableDragRowSize()
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

EDIT:
gerold hat geschrieben: [...]
Dieser Hashwert ist ziemlich eindeutig und kann nur mit sehr hohem Rechenaufwand zurückgerechnet werden.
[...]
Sorry, wenn ich einlenke aber das ist so nicht ganz richtig. Ist nicht böse gemeint, sondern soll nur zur Information dienen :)

Erstens ist der Hash nicht 100%ig eindeutig, da der MD5 Algorithmus schwächen bietet und es durch die schwächen mehrere Kollisionen gibt, die genau auf den gleichen Hash kommen.

Zweitens ist es nicht möglich den Hash wider zurückzurechnen, da es irreversibel ist. Was aber richtig ist, ist das man auf "Jagt" nach Kollisionen gehen kann (Z.B. Mit einer Bruteforce Attacke). Sprich: Zu jedem aus einer Zeichenkette gebildeten MD5-Hash, existiert mindestens eine Kollision. Das heißt, dass es mindestens ein andere Zeichenkette gibt die genau den gleichen MD5-Hash erzeugt! Das hat aber nichts mit zurückrechen zu tun oder das man auf die exakt gleiche Zeichenkette wider zurückkommt. Das ist im Technisch nicht möglich, da wie gesagt irreversibel.

Mehr zum Thema: http://de.wikipedia.org/wiki/Md5

Und noch was zum Thema Sicherheit: Die Möglichkeit auf einer Kollision zu treffen liegt zwar im """Astronomischen""" bereich (weiß leider nicht genau wie groß die Chancen sind), aber es ist dennoch nicht ausgeschlossen darauf zu stoßen, wie der Artikel vom wiki und diverse andere Projekte bewiesen haben und beweisen.

Es gibt aber eine Möglichkeit die Sicherheit noch weiter zu steigern:
zum Beispiel bildet die Foren Software vBulletin folgendermaßen einen Hash:

$md5Hash = md5( md5($password) . $userinfo->salt);
  • Also es wird einmal aus dem Passwort ( md5($password) ) ein MD5 Hash gebildet.
  • Es wird dann einmalig eine zufällige Ziffer (salt) gebildet die in die DB gespeichert wird von dem jeweiligen Benutzer!
  • Danach wird aus der zufälligen Ziffer und dem gebildeten MD5 Hash eine neuer MD5 Hash gebildet, der dann ebenfalls in die DB gespeichert wird.
  • SO, wenn sich dann der Benutzer das nächste mal mit seinem Password einloggen will, wird aus dem eingegebenen Passwort wider eine MD5 Hash gebildet und dann aus diesem Hash und der Zufallszahl in der DB, wider ein Hash gebildet, der dann mit dem Hash in der DB vergleichen wird.
Diese Methode erhöht die Sicherheit sehr, weil man dann einmal für md5( md5($password) . $userinfo->salt); eine Kollision finden muss und danach die Kollision für md5($password) und dann auch noch die Zufallsziffer $userinfo->salt) finden muss ;) :D

Wie das in phpBB implementiert ist weiß ich nicht, da ich bisher noch nicht dazu gekommen bin das zu Analysieren . Aber ich denke die Entwickler werden ähnlich vorgegangen sein, um die Schwächen des MD5 Algorithmus zu kompensieren ;)

lg xtra
Antworten