Programmierstilfrage

Fragen zu Tkinter.
Antworten
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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)
mfg

Thomas :-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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
mfg

Thomas :-)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Wenn die Parameter sich oft wiederholen, lohnt es sich auch, functools.partial anzugucken.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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)?
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

@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
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

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. :)
mfg

Thomas :-)
Antworten