Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
@Strawk: wenn Dein execute beim SELECT so aussieht, wie beim INSERT, wird der SQL-String nicht korrekt erstellt. Du willst anscheinend keine Hilfe, weil Du Deinen Code so verheimlichst und auf Anmerkungen nicht reagierst.
Du koenntest github bemuehen. Oder pastebin. ZIP ist aetzend, weil man mehrere Schritte gehen muss, um es zu betrachten, und das dann nicht mehr im Browser.
Die Wandlung willst du so wie so erst machen, wenn du die Daten ausgibst. Solange die mit den Daten intern hantierst, solltest du diese Datentypen behalten.
Wenn du z.B. Unicode-Strings per `print` Statement ausgibst, dann erscheint das so, wie du es erwartest:
[codebox=pycon file=Unbenannt.txt]>>> a = u'h\xe4keln'
>>> print a
häkeln[/code]
Noch was: die SQL-Abfrage liefert dir bereits eine Liste von Tupeln. Warum iterierst du über die Liste, nur um diese in einen neue Liste zu packen? Das kannst du dir auch sparen...
@Strawk: wie oft sollen wir Dir eigentlich noch sagen, dass so, wie Du programmierst, alles sehr fragil ist und Dir bei der ersten kleinen Änderung um die Ohren fliegt?
In `inMaskeEinlesen` formatierst Du eine Zahl, die als String an die Funktion übergeben werden muß, direkt in eine SQL-Abfrage, die auch noch ein * enthält.
1. nie direkt Parameter zu SQL-Befehle zusammenstückeln.
- bei nummer erwartet jeder, dass er eine Zahl übergeben könnte, funktioniert aber nur mit Strings.
- Wenn Du die nummer direkt aus einer Eingabemaske liest, hat jeder komplette Kontrolle über Deine Datenbank und kann sie, auch unabsichtlich, komplett kaputt machen.
- ist es einfach nur viel umständlicher, als es richtig zu machen.
2. Das * liefert dir die Spalten in einer Reihenfolge, die irgendwo intern in der Datenbank definiert ist. Wenn sich da was ändert, passen die Spalten nicht mehr zu der Liste, die Du irgendwo anders definiert hast. Von der Wartungsseite her ist das also eine Katastrophe.
Warum nennst Du `nummer` in `zugriffsnummer` um? Wie viele Ergebnisse erwartest Du, wenn jeder Eintrag eine eindeutige Nummer hat? `inMaskeEinlesen` ist der falsche Name, weil hier nichts in irgendeine Maske gelesen wird.
In `buttonLiesInMaskeEinClick` definierst Du irgendwelche Felder, die Du sicher noch an 7 anderen Stellen auch brauchst, das ist also eine Konstante, die an einen globalen Ort gehört. `nummer` kommt aus dem Nichts. Alles was eine Funktion braucht, sollte sie als Parameter bekommen. Bei GUIs mit Zustand, wird das meist über Klassen gelöst, GUI ohne OOP geht eigentlich nicht.
Für `sql_ergebnis` ist es eigentlich egal, woher die Daten kamen, wichtig ist, was die Variable enthält.
Zeile 19: nochmal, wie viele Ergebnisse erwartest Du, wie viele Felder hast Du, und was passiert, wenn doch mehr Ergebnisse geliefert werden als erwartet?
Zeile 23: diese Zeile sollte schon in der Funktion mit der SQL-Abfrage stehen.
Zeile 26: das ist der Grund, warum nichts funktioniert. Niemals `eval` benutzen. Hier wurde Dir schon mehrmals gesagt, pack die Eingabefelder in Listen oder Wörterbücher, oder sonst was.
Also, nimm mein Beispiel von vor drei Wochen. Das ist ein guter Einstieg in die Art und Weise, wie Du Dein Programm aufbauen solltest. Lies in der Dokumentation nach, wie man richtig SQL-Abfragen schreibt. Lerne OOP.
@Strawk: Versuch’ einfach mal, eine Person mit dem Namen „Robert'); DROP TABLE dauner; -- Roberts“ (natürlich ohne die Anführungszeichen) anzulegen. Nachdem du ein Backup der Datenbank angelegt hast.
@strawk: du brauchst nicht die Segel streichen - du musst nur mal _vernünftig_ von Grund auf Lernen. Python Anfänger + GUI + SQL-DB ist nun mal keine gute Idee. Und vielleicht nicht direkt mit 38 Feldern anfangen. Sagte ich aber bereits schon mal...
Zum Thema Buch: gibt es nicht, würde ich mal behaupten. Das Thema ist zu speziell. Selbst zu Zeiten, als Print-Medien noch wesentlich populärer waren als heute, wäre das wohl zu speziell gewesen.
Im Prinzip brauchst du auch kein Buch, was beides behandelt. Die GUI interagiert ja nicht mit der Datenbank direkt. Du hast ja immer einen "Übergabepunkt" für die Daten dazwischen.
1. Offizielles Python-Tutorial durcharbeiten. Danach solltest du die Grundlagen drauf haben.
2. DB-Teil programmieren, so dass du sauber Daten schreiben und Lesen kannst.
3. GUI angehen mit _weniger_ Felder, sagen wir 3-5
Und natürlich am besten hier im Forum den Code immer wieder vorstellen, Kritik abholen, besser werden
Und wenn das alles sauber läuft, die GUI auf 38 Felder aufbohren.
Und falls du erwartest, dass du das alles mit deutschsprachiger Literatur / Webseiten hin bekommst: vergiß' es. Englisch ist nun mal die Standardsprache und auf Englisch findest du auch viiiiiiiiiel mehr Webseiten, Lösungsansätze etc. (z.B. bei Stack Overflow).
Ich finde die Argumentation etwas schräg. Du kannst doch nicht programmieren, nur weil du ein Buch durchgelesen hast. Jedes Fachbuch das ich kenne, muss man durcharbeiten. Ggf mehrfach. Es gab diverse Themen hier, bei denen wir dir Hilfestellung angedeihen lassen mussten, obwohl das Thema in deinem Buch behandelt wurde. War aber nicht auf Pfanne. Was ja nicht schlimm ist. Zeigt nur, das du dich durchaus wieder beschäftigen kannst. ZB Kapitel 5.2 zur String Formatierung.
Strawk hat geschrieben:Farid Hajji: Das Python Praxisbuch. Der große Profi-Leitfaden für Programmierer. München: Addison-Wesley 2008. (Open Source Library)
ist wohl, wie gesagt, noch zu schwer, da für Profis geschrieben.
Das Buch ist eigentlich ganz gut gelungen, ist aber eben auch von 2008 und bezieht sich auf das damals aktuelle Python 2.5. Das zu dem Zeitpunkt neue with-Statement hatte es wohl nicht mehr in das Manuskript geschafft und das einführende Hello-World Beispiel nutzt in der tkinter-Variante ein 'global', vermutlich da OOP erst später behandelt wird. Bis Kapitel 10 ist das Buch meiner Meinung nach durchaus für Anfänger geeignet – in dem Bewusstsein, dass es bereits 10 Jahre alt ist und sich die Sprache seitdem weiterentwickelt hat.
In der rein prozeduralen Programmierung war die Nutzung von 'global' häufig anzutreffen, auch auf die Gefahr hin, ein Programm fehlerhaft und unwartbar zu machen. In Python sind globale Variable glücklicherweise vermeidbar. Beachte dies bitte, wenn Du Deinen Raspi bekommst und Hilfe in Raspi-Foren suchen solltest. Dort erhalten globals mittlerweile wieder ein zweites Leben.