Seite 1 von 1

Programmierstilfrage

Verfasst: Freitag 6. Februar 2009, 13:33
von Python 47
Hey,

Wenn man viele Labels, Buttons usw. hat und die immer mit den gleichen Parametern packt, ist es dann sinnvoll das ganze so zu schreiben:

Code: Alles auswählen

widgets=[Label1(par1, par2, par3), 
         Label2(par1, par2, par3), 
         Button(par1, par2, par3), 
         Entry(par1, par2, par3, par4)]

for widget in widgets:
    widget.pack(par1, par2)
oder würde das als schlechter Programmierstil gelten und man sollte das ganze dann doch lieber so schreiben:

Code: Alles auswählen

Label1(par1, par2, par3)
Label1.pack(par1, par2)
Label2(par1, par2, par3)
Label2.pack(par1, par2)
Button(par1, par2)
Button.pack(par1, par2)

Verfasst: Freitag 6. Februar 2009, 14:06
von numerix
Aus meiner Sicht lässt sich das anhand deines Beispiels nicht grundsätzlich beantworten. Ich mache es jeweils von den "Umständen" abhängig, d.h. z.B. von der tatsächlichen Gesamtzahl der Widgets und der Komplexität, aber auch davon, welcher Art die Widgets sind und wie sie zusammenhängen.

Da kann es z.B. sein, dass ich erst die benötigten Widgets nach und nach erzeuge und erst im Anschluss daran, diese auf der GUI zusammensetze. Bei kleineren Sachen mache ich es eher so, dass ich Erzeugung und das "packen" unmittelbar hintereinander setze.

Ein anderer Weg - habe ich aber noch nie so gemacht - wäre es, eigene Widget-Klassen von den Tkinter-Widgets abzuleiten, und diese um eine entsprechende Methode - etwa quickpack() zu erweitern, die automatisch über die immer gleichen Parameter verfügt.

Es könnte aber z.B. auch im Einzelfall passen, direkt eine Liste oder ein Dictionary mit Widgets zu erstellen, und dann bei bestimmten Operationen über die Collection iterieren zu können.

Verfasst: Freitag 6. Februar 2009, 16:49
von Python 47
Hallo,

da es schon recht viele Widgets sind sehe ich in der Iterationsweise 2 Vorteile:

1. Ich würde den Quellcode um einige Zeilen verkürzen
2. Häufig vorkommende Anweisungen z.B. Foo.pack(padx=30, pady=10)
würden dann nur noch einmal im Quelltext stehen.

Allerdings könnte es ja sein, dass das unpythonisch ist ähnlich wie z.B.

for x in range(len(string)) statt for x in string

Verfasst: Freitag 6. Februar 2009, 17:39
von derdon
Wenn die Parameter sich oft wiederholen, lohnt es sich auch, functools.partial anzugucken.

Verfasst: Freitag 6. Februar 2009, 17:56
von DasIch
Python 47 hat geschrieben:Allerdings könnte es ja sein, dass das unpythonisch ist ähnlich wie z.B.

for x in range(len(string)) statt for x in string
Wiederholungen im Code sind immer grausam, unabhängig von der verwendeten Programmiersprache.

Verfasst: Freitag 6. Februar 2009, 18:12
von numerix
DasIch hat geschrieben:
Python 47 hat geschrieben:Allerdings könnte es ja sein, dass das unpythonisch ist ähnlich wie z.B.

for x in range(len(string)) statt for x in string
Wiederholungen im Code sind immer grausam, unabhängig von der verwendeten Programmiersprache.
Es gibt Grenzfälle, wo z.B. irgendetwas genau zweimal oder vielleicht dreimal gemacht werden muss, und dieses "irgendetwas" aus einer Zeile besteht. Soll man dann immer eine Schleife aufsetzen (oder LC oder irgendwas in der Art)?

Verfasst: Freitag 6. Februar 2009, 19:04
von yipyip
@Python 47:

Schau Dir mal mein (etwas sinnfreies) Beispiel in

http://www.python-forum.de/topic-17216.html

an.
Dort wird *eine* Möglichkeit gezeigt, wie
man mit ähnlichen Widgets unabhängig von deren
Anzahl umgehen kann.

:wink:
yipyip

Verfasst: Freitag 6. Februar 2009, 20:27
von Python 47
DasIch hat geschrieben:
Python 47 hat geschrieben:Allerdings könnte es ja sein, dass das unpythonisch ist ähnlich wie z.B.

for x in range(len(string)) statt for x in string
Wiederholungen im Code sind immer grausam, unabhängig von der verwendeten Programmiersprache.
Ich meinte mit unpythonisch nicht die Wiederholungen im Code sondern das Iteretieren über die, in einer Liste gespeicherten, Widgets. :)