Probleme beim laienhaften Zusammenschustern ... ;-)

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Mueck
User
Beiträge: 20
Registriert: Dienstag 16. November 2010, 02:20

Moin

Versuche gerade, als Python-Anfänger eine kleine Anwendung zu programmieren ...
Hauptsächlich soll sich das Teil im Taskbar einnisten, deswegen versuche ich rund um http://www.python-forum.de/viewtopic.ph ... 00#p151953 aus diversen Beispiel-Code-Stückchen was zusammenzuschustern. Beim Kenr der Anwendung, im Bsp. unten nicht enthalten, bin ich eigentlich ganz zufrieden wie ich damit voran komme ... Nur bei der kleinen GUI, die beim Erststart 2-3 Werte abfragen soll (und später als conf speichern soll, dann werden die Werte da nur noch angezeigt) und ansonsten nur paar Zeilen Text anzeigen soll, passen die geklauten Code-Schnippsel wohl irgendwie nicht so recht zusammen, jedenfalls passt die Gesamtgröße nicht und einiges ist grau hinterlegt.
Vermutlich nur 'ne Kleinigkeit, die man als Anfänger aber nicht sieht ...

Bei der Gelegenheit: Die Einheit für die Eingabefenster scheint Pixel zu sein. Wie kann man deren Größe auch in "Zeichen" angeben? Es schien so, als wäre das in einem Bsp. aus der Demo so dimensioniert. Aber deren Einbau funktionierte nicht, vielleicht wegen desselben Fehlers ...

Hier mal das gekürzte Progrämmle, das ausführbar sein sollte, sobald man ein anderes Icon statt xxx.xpm eingebaut hat:

Code: Alles auswählen

#!/usr/bin/python
# encoding: iso-8859-1

verbose = 1

TimerZeit = 2000 # msec

import sys
import wx

try :
   f = open( pyitest.conf )
   config = f.read( )
   configured = 1
   f.close( )

except :
   configured = 0

###################################### Task Bar Icon #########################

class TaskbarIcon(wx.TaskBarIcon) :

   def __init__( self, app ) :

      global ItestTask

      wx.TaskBarIcon.__init__( self )
      self.app = app

      self.SetIcon( wx.Icon( 'xxx.xpm', wx.BITMAP_TYPE_XPM ),
                    'abc\ndef' )

      self.Bind( wx.EVT_MENU, self.OnTaskbarFrametoggle, id=1 )
      self.Bind( wx.EVT_MENU, self.OnTaskbarClose, id=2 )

      self.Bind( wx.EVT_TASKBAR_LEFT_DOWN, self.OnTaskbarFrametoggle )

      ItestTask = self


   def CreatePopupMenu( self ) :

      menu = wx.Menu( )
      menu.Append( 1, 'Show / Hide' )
      menu.Append( 2, 'Close' )
      return menu


   def OnTaskbarFrametoggle( self, event ) :

      if not self.app.frame.IsShown( ) :
         self.app.frame.Show( )
      else :
         self.app.frame.Hide( )
   
   def OnTaskbarClose( self, event ) :

      try :
         self.app.frame.Destroy( )
      except :
         print( 'Schon wech 1' )

      try :
         self.Destroy( )
      except :
         print( 'Schon wech 2' )

################################ Fenster ###################################

class Frame( wx.Frame ) :

   def __init__( self, app, parent, id ) :

      global ItestWin

      ItestWin = self

      wx.Frame.__init__( self, parent, id,
                         title = "PyItest",
                         pos   = wx.DefaultPosition,
                         size  = wx.DefaultSize,
                         style = wx.DEFAULT_DIALOG_STYLE ) 

      #self.Centre( )
      self.CreateStatusBar( )


      self.sizer = wx.BoxSizer( wx.VERTICAL )

      ### Nachricht

      if configured :
         self.quote = wx.StaticText( self, -1, "Konfiguration:" )
      else :
         self.quote = wx.StaticText( self, -1,
                                     "Erststart, bitte konfigurieren:" )

      self.sizer.Add( self.quote,   0, wx.ALIGN_CENTRE | wx.ALL, 5 )

      ### IP-Adresse des Servers

      self.sizer2 = wx.BoxSizer( wx.HORIZONTAL )

      self.ipt = []
      self.ipf = []
      for i in range( 0, 4 ):
         if i == 0 :
            self.ipt.append( wx.StaticText( self, -1, "IP-Adresse:" ) )
            self.sizer2.Add( self.ipt[i], 0, wx.ALIGN_CENTRE | wx.ALL, 5 )
         else :
            self.ipt.append( wx.StaticText( self, -1, "." ) )
            self.sizer2.Add( self.ipt[i], 0, wx.ALIGN_CENTRE | wx.ALL, 5 )

         self.ipf.append( wx.TextCtrl( self, -1, "", size = ( 30, -1 ) ) )
         self.sizer2.Add( self.ipf[i], 1, wx.ALIGN_CENTRE | wx.ALL, 5 )

      self.sizer.Add( self.sizer2,  0,
                      wx.GROW | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5 )

      ### Intervall

      self.sizer3 = wx.BoxSizer( wx.HORIZONTAL )

      self.timert = wx.StaticText( self, -1, "Intervall:" )
      self.sizer3.Add( self.timert, 0, wx.ALIGN_CENTRE | wx.ALL, 5 )

      self.timerv = ( wx.TextCtrl( self, -1, str( TimerZeit), size = ( 50, -1)))
      self.sizer3.Add( self.timerv, 1, wx.ALIGN_CENTRE | wx.ALL, 5 )

      self.timeru = wx.StaticText( self, -1, "msec" )
      self.sizer3.Add( self.timeru, 0, wx.ALIGN_CENTRE | wx.ALL, 5 )

      self.sizer.Add( self.sizer3,  0,
                      wx.GROW | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5 )

      self.SetSizer( self.sizer )
      self.SetAutoLayout( 1 )
      self.sizer.Fit( self )

      filemenu = wx.Menu( )

      menuAbout = filemenu.Append( wx.ID_ABOUT, "&About",
                                   "Information about this program" )

      if configured :
         menuExit = filemenu.Append( wx.ID_EXIT, "&Close", " Close Window" )

      else :
         menuExit = filemenu.Append( wx.ID_EXIT, "E&xit", " Close Window" )

      menuBar = wx.MenuBar( )
      menuBar.Append( filemenu, "&File" )
      self.SetMenuBar( menuBar )

      self.Bind( wx.EVT_MENU, self.OnAbout, menuAbout )
      self.Bind( wx.EVT_MENU, self.OnExit,  menuExit  )

      if configured :
         self.Show( False )

      else :
         self.Show( True )

   def OnExit( self, e ) :
      if configured :
         app.frame.Hide( )
      else :
         ItestTask.Destroy( )
         ItestWin.Destroy( )

   def OnAbout( self, e ) :
      dlg = wx.MessageDialog( self, "A small text editor",
                              "About Sample Editor", wx.OK )
      dlg.ShowModal( )
      dlg.Destroy( )


############################# Gesamtanwendung ################################

class App( wx.App ) :

   def OnInit( self ) :

      self.frame = Frame( self, None, -1 )

      self.taskb = TaskbarIcon( self )

      return True

##############################################################################

ItestStatus = -1

app = App( 0 )

app.MainLoop( )
Zuletzt geändert von Anonymous am Sonntag 20. Februar 2011, 20:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Mueck: Man sollte kein ``except`` ohne konkrete Ausnahmen, die man damit behandeln will, verwenden. Zum Beispiel ist ein Fehler im Einlesen der Konfiguration die dafür sorgt, dass dort immer der ``except``-Zweig genommen wird, ohne dass man als Benutzer oder auch als Programmierer auf den Fehler aufmerksam gemacht wird, weil dort *alle* Ausnahmen gleichermassen "verschluckt" werden.

Wenn dort der ``except``-Zweig genommen wird, ist nicht garantiert, dass die Datei auch wieder geschlossen wird. Dateien sollte man wenn möglich mit der ``with``-Anweisung öffnen und damit automatisch zuverlässig schliessen lassen.

Die Einrückung mit drei statt vier Leerzeichen pro Ebene entspricht nicht dem Standard.

Importe sollten weiter oben stehen, damit man sieht wovon das Modul abhängig ist.

Die Zahlen 0 und 1 sollten nicht als Wahrheitswerte verwendet werden -- insbesondere nicht als Literale. `True`/`False` drücken das viel verständlicher aus.

Die ``global``\s sind unschön.

wx-IDs darf man nicht einfach so selber festlegen weil `wx` selber schon einige davon vorbelegt hat. Wenn man unbedingt IDs benötigt, dann kann man die mit der `wx.NewId()`-Funktion erzeugen. Allerdings gibt es dafür kaum noch Gründe, weil man bei `wx` in den allermeisten Fällen auch die Objekte statt einer stellvertretenden ID übergeben kann. Anstelle einer literalen -1 ist die Konstante `wx.ID_ANY` verständlicher.

Der `Frame` ist nicht gross genug weil Du nach dem `Fit()` noch die Menüs hinzufügst. Damit wird -- zumindest auf meinem System -- der Platz für das Menü nicht in der Fenstergrösse berücksichtigt, und die Elemente passen nicht alle in das Fenster hinein.

Abkürzungen wie `ipt` oder `ipf` machen Programme schwer verständlich.
Mueck
User
Beiträge: 20
Registriert: Dienstag 16. November 2010, 02:20

BlackJack hat geschrieben:@Mueck: Man sollte kein ``except`` ohne konkrete Ausnahmen, die man damit behandeln will, verwenden. Zum Beispiel ist ein Fehler im Einlesen der Konfiguration die dafür sorgt, dass dort immer der ``except``-Zweig genommen wird, ohne dass man als Benutzer oder auch als Programmierer auf den Fehler aufmerksam gemacht wird, weil dort *alle* Ausnahmen gleichermassen "verschluckt" werden.

Wenn dort der ``except``-Zweig genommen wird, ist nicht garantiert, dass die Datei auch wieder geschlossen wird. Dateien sollte man wenn möglich mit der ``with``-Anweisung öffnen und damit automatisch zuverlässig schliessen lassen.
An genau welcher Stelle habe ich behauptet, dass schon alle Teile des Programms dem Stadium eines Provisoriums entwachsen sind? :wink:

It's not a bug, it's a feature, dat dat Teil beim Fehlen einer config anders startet ohne großes Aufhebens darum.
Man merkt's daran, dass das Fenster aufpoppt anstatt zu zu bleiben :wink:

An den Details werde ich aber noch feilen und dabei alle Eventualitäten anschauen und auch das with zu Rate ziehen.
BlackJack hat geschrieben: Die Einrückung mit drei statt vier Leerzeichen pro Ebene entspricht nicht dem Standard.
Seitdem ich Fortran IV in Lochkarten stanzte, sind drei Leerzeichen im Finger drin, der kann das nicht anders! :wink:

Das Programm wird nie Teil irgendeines Standards werden.
Sollte ich jemals in die Versuchung kommen, an Open Source Pythons rumzuschrauben, kann man über 4 Leerzeichen gerne noch mal diskutieren :wink:
BlackJack hat geschrieben: Importe sollten weiter oben stehen, damit man sieht wovon das Modul abhängig ist.
Die beiden Variablen davor wären in C in ein "#define TimerZeit 2000" gelandet, das sind einfach Sachen, die will ich nicht irgendwo mitten im source zusammen suchen müssen. Aber alles weitere kommt gerne nach den #include's :wink:
BlackJack hat geschrieben: Die Zahlen 0 und 1 sollten nicht als Wahrheitswerte verwendet werden -- insbesondere nicht als Literale. `True`/`False` drücken das viel verständlicher aus.
Als alter C-Programmierer ist man den Umgang mit 1 und 0 einfach gewohnt :wink:

Das Thema fällt ansonsten unter das Thema "Schönheitsreparaturen", wenn's irgendwann mal läuft oder wenn ich einen Fehler nicht finde und mal eine Denkpause mit "nice to have"-Dingen zur Ablenkung füllen möchte ...
BlackJack hat geschrieben: Die ``global``\s sind unschön.
Ich will als Anfänger erst mal was irgendwie funktionierendes in absehbarer Zeit.
Mit etwas mehr Routine kann ich immer noch überlegen, ob ich das verfeiner ...
Ich bin momentan schon vollauf zufrieden, dass nach nur ganz wenigen Stunden python überhaupt schon irgendwas läuft und halbwegs macht, was es soll ...
BlackJack hat geschrieben: wx-IDs darf man nicht einfach so selber festlegen weil `wx` selber schon einige davon vorbelegt hat. Wenn man unbedingt IDs benötigt, dann kann man die mit der `wx.NewId()`-Funktion erzeugen. Allerdings gibt es dafür kaum noch Gründe, weil man bei `wx` in den allermeisten Fällen auch die Objekte statt einer stellvertretenden ID übergeben kann. Anstelle einer literalen -1 ist die Konstante `wx.ID_ANY` verständlicher.
Ich lerne python nach der Methode Guttenberg: Lerning by abschreibing :wink:
Die -1 findet man überall, selbst im wxPython-Demo-Teil. Beschwerden bitte dorthin :wink:
Wären in den Vorlagen Anys drin, hätte ich die genommen und für völlig normal gehalten ...
BlackJack hat geschrieben: Der `Frame` ist nicht gross genug weil Du nach dem `Fit()` noch die Menüs hinzufügst. Damit wird -- zumindest auf meinem System -- der Platz für das Menü nicht in der Fenstergrösse berücksichtigt, und die Elemente passen nicht alle in das Fenster hinein.
Ah, endlich kommen wir zum Kern der Sache!
In der Tat macht sich das Fit() weiter hinten deutlich besser und bastelt nun alles in der richtigen Größe zusammen!

DANKE!

Wusste ich doch, dass da ein dummer Anfängerfehler hintersteckt ...

Wenn ich jetzt noch das grau loswerde ...
BlackJack hat geschrieben: Abkürzungen wie `ipt` oder `ipf` machen Programme schwer verständlich.
Manchmal will man einfach nicht zu viel Platz verschwenden für Variablen, die sich in der nächsten Zeile schon wieder erledigt haben.

Immerhin nenne ich Variablen, die im ganzen Programm wichtig sind, nur noch selten "i", erkenne diesen Fortschritt im Lebenswerk bitte an! :wink:
BlackJack

@Mueck: Es mag ein Feature sein, dass das Programm beim Fehlen einer Konfiguration trotzdem startet, aber es ist ein Bug, dass es die Konfiguration auch dann nicht einliest, wenn sie vorhanden ist, weil in dem Quelltext ein `NameError` steckt. Das würde Dir als Programmierer auffallen wenn Du nicht einfach *alle* Ausnahmen "behandelst", sondern nur die, welche beim Einlesen von Dateien auftreten können.

Wenn Du ein Programm oder Programmteil hier veröffentlichst und Dich dabei nicht an die üblichen vier Leerzeichen hältst, verringern sich die Chancen dass das jemand ausprobiert und Änderungen vornimmt um einen Fehler zu finden. Du tippst die drei Leerzeichen tatsächlich als solche ein!? Gab es zu Fortran-Zeiten noch keine Tab-Taste?

In C kommen ``#define``\s in der Regel auch nach den ``#include``\s -- solange sie keinen Einfluss auf die inkludierten Dateien haben sollen jedenfalls. Konstanten werden per Konvention komplett in Grossbuchstaben benannt. In C in der Regel übrigens auch.

Du bindest die Namen `ipt` und `ipf` an das Objekt, dann können die sich wohl kaum in der nächsten Zeile schon wieder erledigt haben.
Mueck
User
Beiträge: 20
Registriert: Dienstag 16. November 2010, 02:20

BlackJack hat geschrieben:@Mueck: Es mag ein Feature sein, dass das Programm beim Fehlen einer Konfiguration trotzdem startet, aber es ist ein Bug, dass es die Konfiguration auch dann nicht einliest, wenn sie vorhanden ist, weil in dem Quelltext ein `NameError` steckt. Das würde Dir als Programmierer auffallen wenn Du nicht einfach *alle* Ausnahmen "behandelst", sondern nur die, welche beim Einlesen von Dateien auftreten können.
Du meinst, Hochkommas rund um den Dateinamen wären nicht so ganz unpraktisch?
Ja, das wäre mir hoffentlich noch rechtzeitig aufgefallen :wink:
Derzeit gibt es noch keine .conf also gibt es derzeit noch keine 1000 Fälle, die in so einem Falle abzufangen wären.
Das korrekte Abfangen kommt mit der Existenz der config ...
Das Programm ist erst im Entstehen. Das Kapitel existierende config ist schlicht noch nicht dran gewesen, die Stelle ist noch'n halber Dummy ...
"schon wech" sind auch Platzhalter ...
BlackJack hat geschrieben: Wenn Du ein Programm oder Programmteil hier veröffentlichst und Dich dabei nicht an die üblichen vier Leerzeichen hältst, verringern sich die Chancen dass das jemand ausprobiert und Änderungen vornimmt um einen Fehler zu finden. Du tippst die drei Leerzeichen tatsächlich als solche ein!? Gab es zu Fortran-Zeiten noch keine Tab-Taste?
Keine Ahnung, ob die Lochkartenstanzer schon eine Tab-Taste hatten, ist schon zu lange her.
Jedenfalls waren die ersten 6 Spalten bei Fortran für andere Sachen reserviert (Zeilennummer und Fortsetzungsmarke), so hat sich bei mir für's Einrücken eine durch 3 teilbare Zahl als Optimum festgestzt, das ist einfach "drin".
Und ja, die sind handgetippt, da mir Tabs irgendwie ein Greuel sind ...
Die kann man nämlich umkonfigurieren, man weiß also nie, ob die immer und überall gleich lang bleiben und das ist für jemand mit ungewöhnlichen ästhetischen Ansichten, die dadurch durcheinander geraten könnten, schlichtweg unakzeptabel! :wink:
Und bei halben Einrückungen muss man mit Leerzeichen mischen etc. pp., neee, nix für mich, bleib mir mit Tabs wech ... :wink:
Tabs nehme ich nur da, wo in OS-Code Tabs vorfinde und die ich bearbeitet wieder zurückspeisen will ...
BlackJack hat geschrieben: Du bindest die Namen `ipt` und `ipf` an das Objekt, dann können die sich wohl kaum in der nächsten Zeile schon wieder erledigt haben.
Im Moment stehen sie nur eng beieinander
Sollte ich die noch ganz woanders brauchen, mache ich mir Gedanken um den Namen :wink:
BlackJack

@Mueck: Tabs haben IMHO in Python-Quelltext auch nichts zu suchen. Trotzdem ist es heutzutage üblich mit der Tab-*Taste* einzurücken. Jeden vernünftigen Editor kann man so einstellen, dass diese Taste mit Leerzeichen zur nächsten Tabulatorposition einrückt und natürlich auch wie gross der Abstand zwischen den Positionen ist.

Wenn `ipt` und `ipf` nur ganz begrenzt lokal benötigt werden, warum bindest Du sie dann an das Objekt? Das ist für den Leser doch ein deutliches Zeichen, dass die in irgend einer anderen Methode auch benötigt werden!? Wobei mir sich der Sinn dort auch lokal bei dem gezeigten Quelltext nicht erschliesst. Das liesse sich einfacher ohne die beiden Listen schreiben.
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

man ...progrämmle oder unikat ala guttenberg...

ihr seid beide nicht gut.... :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Wenn Du ein Programm oder Programmteil hier veröffentlichst und Dich dabei nicht an die üblichen vier Leerzeichen hältst, verringern sich die Chancen dass das jemand ausprobiert und Änderungen vornimmt um einen Fehler zu finden.
Genau so gehts mir. Zusammen mit der Ansicht des OP dass er konstruktive Kritik einfach wegwischt. Bereitschaft sich in diesem Thread positiv zu beiteiligen: 0. Der Hinweis das andere das nicht besser machen, ist doch gar kein Argument?!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Mueck
User
Beiträge: 20
Registriert: Dienstag 16. November 2010, 02:20

Leonidas hat geschrieben:
BlackJack hat geschrieben:Wenn Du ein Programm oder Programmteil hier veröffentlichst und Dich dabei nicht an die üblichen vier Leerzeichen hältst, verringern sich die Chancen dass das jemand ausprobiert und Änderungen vornimmt um einen Fehler zu finden.
Genau so gehts mir. Zusammen mit der Ansicht des OP dass er konstruktive Kritik einfach wegwischt. Bereitschaft sich in diesem Thread positiv zu beiteiligen: 0. Der Hinweis das andere das nicht besser machen, ist doch gar kein Argument?!
Ähm, um mal kurz dran zu erinnern:
Ich hatte hier im wx-Unterforum Fragen zu wx gestellt.
Ich hatte NICHT Fragen dazu gestellt, ob mein sonstiger Code schön aussieht. Ich hatte auch nirgends behauptet, dass der Code auch nur im Ansatz fertig wäre. Das sollte auch klar aus meinem Anfangsposting hervor gehen, dass das eine Baustelle ist und nix fertiges.
Wenn jemand über die eigentliche Frage hinaus auch 1000 Kritiken zu halbfertigen Code hat, dann ist sicher nett gemein, danke dafür, aber eben über das Ziel hinaus geschossen und ich werde ja wohl noch erwähnen dürfen, dass besagte Code-Stellen noch Provisorien sind und nix mit dem endgültigen Produkt zu tun haben müssen.
Es steht auch nirgends, dass man hier nur mit perfekt fertigem Code Fragen stellen darf.

Irgendwo stand, dass man sich den Code der Demos als Vorbild nehmen soll. Wenn ich dort oder in Tutorials was kopiere für meinen Code, dann sehe ich das nicht als Fehler an und werde doch wohl erwähnen dürfen, woher das kommt und dass man, wenn man das anders sehen möchte, doch bitteschön das Vorbild für alle korrigiert.

Und zu den Leerzeichen (irgendwann fällt sicher noch jemand auf, dass paar mehr Leerzeichenverwendungen nicht dem Style Guide entsprechen): Es ist Code, in dem ICH mich vorrangig vor allen anderen zurecht finden muss und mit dem ICH vorrangig arbeiten muss, dann gestalte ich den also so, dass ICH ihn am übersichtlichsten finde, das wäre x( y ) statt x(y), wie es gerne der Style Guide hätte, und Vielfache von 3 beim Einrücken, weil das einfach das ist, mit dem ich umzugehen gewohnt bin, weil ich alles von Fortran über C und Tcl/Tk bis Perl so einrücke, wenn ich für mich was code. Wenn ich versuche, mit 4 einzurücken, werde ich garantiert irgendwo Fehler einbauen, weil ich garantiert irgendwo aus Gewohnheit 3 nehme, und das tut nicht Not.
Mueck
User
Beiträge: 20
Registriert: Dienstag 16. November 2010, 02:20

BlackJack hat geschrieben:@Mueck: Tabs haben IMHO in Python-Quelltext auch nichts zu suchen. Trotzdem ist es heutzutage üblich mit der Tab-*Taste* einzurücken. Jeden vernünftigen Editor kann man so einstellen, dass diese Taste mit Leerzeichen zur nächsten Tabulatorposition einrückt und natürlich auch wie gross der Abstand zwischen den Positionen ist.
Eben. Irgendwo steht, dass man Tabs meiden soll.
Und ich bin's nun mal gewohnt, Leerzeichen zu nehmen und das in Vielfachen von 3.
Wie man das in WordPad umstellt, mit dem ich dieses Teil hier gerade tippe, wüsste ich auch nicht, finde da auch nix, will mich auch nicht damit rumschlagen müssen, jeden Editor, den ich irgendwann irgendwo zum Editieren verwende, anpassen zu müssen, denn Leerzeichen funktionieren in jedem gleich und genauso, wie ich es haben will.
BlackJack hat geschrieben: Wenn `ipt` und `ipf` nur ganz begrenzt lokal benötigt werden, warum bindest Du sie dann an das Objekt? Das ist für den Leser doch ein deutliches Zeichen, dass die in irgend einer anderen Methode auch benötigt werden!? Wobei mir sich der Sinn dort auch lokal bei dem gezeigten Quelltext nicht erschliesst. Das liesse sich einfacher ohne die beiden Listen schreiben.
Auch der Code-Teil ist schlicht woanders kopiert mitsamt diesen Listen. Irgendein Tutorial hat so 6 Demo-Buttons gezaubert. Da ich vier gleiche Felder haben wollte, habe ich das einfach von meinem Ich-lerne-schnell-mal-python-Script kopiert und auf Eingabefelder umgearbeitet.
Vielleicht brauche ich die Liste nicht, dann wär's Overkill, vielleicht brauche ich sie ja noch, irgendwie muss ich die Werte ja aus den Feldern wieder auslesen, damit beschäftige ich mich demnächst mal. Wenn es sich ergibt, änder ich ggfs. die Namen oder Struktur, schaun mer mal. Das Script ist, wie schon mehrfach betont, eine BAUSTELLE.
BlackJack

@Mueck: Dieses "das ist Code der nur für mich lesbar sein muss" gilt halt nur solange Du wirklich der einzige bist, der es lesen muss. Wenn Du hier 100+ Zeilen davon zeigst und fragst wo der Fehler sein könnte, dann müssen sich auch andere darin zurecht finden und vielleicht ein wenig herum experimentieren um Dir helfen zu können. Und dafür ist es eben nicht mehr so egal wie eingerückt ist, oder ob der Quelltext durch ``global`` oder schlecht gewählte Namen schwerer nachvollziehbar ist, als nötig.
Antworten