Programmierstil

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.
Benutzeravatar
snafu
User
Beiträge: 5902
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Samstag 2. März 2019, 15:36

grid() ist doch total leicht zu verstehen: Man muss sich eine Tabelle vorstellen, wo row die Zeile und column die Spalte ist. Bei einem sehr einfachen Design ist column=1 quasi die linke und column=2 die rechte Seite. Die row wird natürlich für jede Zeile erhöht. Mehr Magie steckt nicht dahinter.
Benutzeravatar
__blackjack__
User
Beiträge: 4005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 2. März 2019, 16:31

Wobei das Grid wie vieles in der Informatik bei 0 anfängt. Links oben ist also 0, 0 nicht 1, 1.
“Programmieren ist ein Hobby, bei dem es einen riesigen Baumarkt mit quasi jedem Bauteil und Werkzeug und fast immer kostenlos gibt. Ob man deswegen in der Lage ist einen Kölner Dom zu bauen ist eine andere Frage. Arbeit steckt auf jeden Fall drin ;).” — Greebo, forum.ubuntuusers.de
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Samstag 2. März 2019, 16:39

@ snafu :
du, ich bin nicht auf der Brennsuppn dahergeschwommen !
na, ganz so leicht ist es nun auch wieder nicht. Es geht hier ja um DESIGN !
wenn ich mit column=1 anfange, dann erwarte ich, dass zumindest column0 etwas Space generiert. Aber nein, column0 wird komplett ignoriert, weil es nirgends angegeben ist. Ebenso der Raum ZWISCHEN (vertikal) den Labels. Wenn ich row=1, row=3, row=5, etc. angebe, dann erwarte ich, dass row0, row2, row4 wenigstens etwas Zwischenraum generiert, Pustekuchen ... wie soll ich da eine ORDENTLICHE Tabelle generieren ?
MOMENTAN bleibe ich dabei:
grid ist undankbar (für Anfänger) und sch...

EDIT:
das Bild aus _backjack_'s Post vom Samstag 2. März 2019, 12:24, kannst du ja sehen, dann mach' mal, wenn's so einfach ist ...

@ _blackjack_:
eh klar ;-)
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 4005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 2. März 2019, 17:02

@Perlchamp: Fazit: Keine Zeilen oder Spalten leer lassen. Warum auch? Für Abstände ist `pad` bei `columnconfigure()`/`rowconfigure()` für ganze Zeilen/Spalten da oder die Padding-Angaben beim `grid()`-Aufruf bei einzelnen Zellen.
“Programmieren ist ein Hobby, bei dem es einen riesigen Baumarkt mit quasi jedem Bauteil und Werkzeug und fast immer kostenlos gibt. Ob man deswegen in der Lage ist einen Kölner Dom zu bauen ist eine andere Frage. Arbeit steckt auf jeden Fall drin ;).” — Greebo, forum.ubuntuusers.de
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Samstag 2. März 2019, 17:36

@ _blackjack_ :
ich habe mich bisher noch nicht in grid eingelesen. Und deine Aussage bezüglich *pad *:
das hat mit einer Tabelle im klassischen Sinne nichts mehr zu tun. Wenn ich eine Zelle beispielsweise mit bg (Hintergrundfarbe) formatiere, dann erwarte ich auch, dass diese Zelle KOMPLETT mit dieser Farbe hinterlegt wird. Wenn ein *pad* nun einen weißen oder farblosen Zwischenraum generiert, dann hat dies meiner Meinung nach mit einer klassischen Tabelle persé nichts mehr zu tun. Deswegen auch meine vormalige Aussage:
grid ist für Anfänger undankbar, oder gar besch ... (im Sinne einer Tabelle, wie man sie aus HTML, PHP oder Excel her kennt, wo es Freizeilen oder -reihen gibt, eben eine *klassische Tabelle* !).
Wie gesagt: ich muß mich erst noch einlesen ... mit MEINEM Verständnis einer *klassischen* Tabelle hat grid nichts gemein (mein jetziger Wissensstand) ...
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Samstag 2. März 2019, 17:47

@ alle :
und wenn wir schon dabei sind:
kennt jemand eine wirklich gute UND AKTUELLE Doku über Tkinter (und demzufolge auch über grid). Die kann meinetwegen auch auf afrikanisch sein, kein Problem. Ich habe bisher einige Links auf Seiten 'angeboten' bekommen, aber entweder Python 2.7, Doku von 2005, nur *halbherzige* (unvollkommene) Dokus usw. manchmal fühle ich mich diesbezüglich (Dokus) richtig verars... Mir geht es auch bestimmt nicht darum, irgendwelchen Code oder Dinge ohne Nachzudenken serviert zu bekommen, aber Hinweise auf die richtigen Dokus würden mir schon sehr helfen, da ich als Anfänger meist auch nicht zwischen guten und schlechten/alten Dokus (auf die Schnelle) unterscheiden kann ... auch der erste oder zweite Link bei *duckduckgo.com* muß nicht immer der beste oder gar zielführend sein ;-)
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 4005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 2. März 2019, 20:57

@Perlchamp: In HTML kann man genau so einen Zwischenraum *zwischen* den Zellen erstellen. Und Du kannst ja auch innerhalb der Zellen ”padden” dann hat die Fläche selbstverständlich auch die entsprechende Farbe des Zellhintergrunds. Das ist im Grunde alles wie bei einer HTML-Tabelle. Und Leerzeilen machen wie gesagt keinen Sinn. Wenn Du die haben möchtest, musst Du halt irgendwas als Platzhalter rein setzen. Aber warum? Zumal man auch nicht so mit Farben rum spielt. Irgendwie scheinen Anfänger immer alle möglichen Farben und Schriftarten ausprobieren zu wollen. 99% der Anwendungen nehmen die Farben und Schriften die der Benutzer für sein System eingestellt hat. Da sieht man dann weder etwas vom Zellhintergrund noch vom Padding zwischen Zeilen/Spalten, weil das alles den normalen Fensterhintergrund als Farbe hat.

Wie bei den meisten GUI-Toolkits ist die beste Dokumentation die Originaldokumentation. Also die von Tk. Andererseits hat sich an Tk und damit Tkinter auch nicht so wirklich viel verändert. Für Tkinter ist das Buch vom Effbot und die Referenzdokumentation von New Mexico Tech geeignet. Beides ist auch in der Dokumentation zum `tkinter`-Modul verlinkt.
“Programmieren ist ein Hobby, bei dem es einen riesigen Baumarkt mit quasi jedem Bauteil und Werkzeug und fast immer kostenlos gibt. Ob man deswegen in der Lage ist einen Kölner Dom zu bauen ist eine andere Frage. Arbeit steckt auf jeden Fall drin ;).” — Greebo, forum.ubuntuusers.de
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Samstag 2. März 2019, 21:58

@ _blackjack_ :
danke für den Hinweis auf die Dokus !
Ich spiele nicht gerne mit Farben rum (dafür habe ich schon zu viel mit Excel zu tun gehabt), war nur als Beispiel genannt ... und natürlich machen Leerzellen auch keinen Sinn, klar. Wie gesagt, ich muß mich da erst einmal reinlesen, um zu verstehen, wie grid funktioniert ... danke für alles !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Montag 4. März 2019, 18:43

@ sirius3 :
so, ich habe jetzt deinen Code mal durchgeackert und bin mächtig beeindruckt (auch von Python) !
Echt toller Code ! Wie einfach es doch ist, wenn man es kann. Leicht zu verstehen, sehr gut zu lesen, wow!
'raise' raffe ich jetzt auch ...
mit 'partial' habe ich noch meine Schwierigkeiten, auch, es ohne *return* zu meistern; werde ich aber auch noch in den Griff bekommen.
Da es sich bei der Argumenten'liste' um Schlüsselwort-Argumente der Form *Option=Wert* handelt, kann ich über beispielsweise 'koerpergroesse_label.keys()' auf die Optionen('liste') 'schauen'. Wie kann ich denn eigentlich auf die Werte('liste') schauen?
Mit 'koerpergroesse_label.values()' (da kein Dict) und 'koerpergroesse_label.items()' (da kein Dict) geht das nicht. Habe bisher noch keine Lösung gefunden ...
Und als nächstes werde ich es mit Klassen versuchen, mal schauen, wie ich das gebacken bekomme ...
Vielen lieben Dank nochmals.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
__blackjack__
User
Beiträge: 4005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Montag 4. März 2019, 19:12

@Perlchamp: An die Optionen von Tk-Widgets kommst Du mit der `config()`/`configure()`-Methode heran. Die kann man auch ohne Argumente aufrufen, dann liefert sie ein Wörterbuch mit den Optionen.
“Programmieren ist ein Hobby, bei dem es einen riesigen Baumarkt mit quasi jedem Bauteil und Werkzeug und fast immer kostenlos gibt. Ob man deswegen in der Lage ist einen Kölner Dom zu bauen ist eine andere Frage. Arbeit steckt auf jeden Fall drin ;).” — Greebo, forum.ubuntuusers.de
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Montag 4. März 2019, 19:39

@ _blackjack_:
hmm, klaaaaaaaaaaaaaar. Ich Honk. Vor lauter Bäumen ...
danke !

EDIT:
und wie komme ich nur an die *Werte* ran ?

Code: Alles auswählen

>>> import tkinter as tk
>>> root = tk.Tk()
>>> koerpergroesse_label = tk.Label(root, text='Größe in m :  ', bg='pink')
>>> koerpergroesse_label.keys()
['activebackground', 'activeforeground', 'anchor', 'background', 'bd', 'bg', 'bitmap', 'borderwidth', 'compound', 'cursor', 'disabledforeground', 'fg', 'font', 'foreground', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'image', 'justify', 'padx', 'pady', 'relief', 'state', 'takefocus', 'text', 'textvariable', 'underline', 'width', 'wraplength']
Zuletzt geändert von Perlchamp am Montag 4. März 2019, 19:46, insgesamt 1-mal geändert.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Tholo
User
Beiträge: 164
Registriert: Sonntag 7. Januar 2018, 20:36

Montag 4. März 2019, 19:40

@Perlchamp
Ich lunger hier schon seit ca. 1 Jahr im Forum rum. Aber ich möchte dich Beglückwünschen! Ich bin der Meinung, dass du dich und deinen Code schnell reflektieren kannst und die Verständnisse schneller erreichen kannst als ich zb. Mein Respekt und Glückwunsch dazu! Ganz Ehrlich! Ich empfinde wirkliches Interesse an Python bei dir!
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Montag 4. März 2019, 21:05

@ Tholo :
danke für die Blumen. Mit Lob kann ich allerdings nicht gut umgehen ... aber Python ist einfach geil und macht richtig Spaß, oder ?
Ich habe hier aber auch sehr, sehr gute Tutoren - der Dank oder das Lob gilt euch allen hier !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Tholo
User
Beiträge: 164
Registriert: Sonntag 7. Januar 2018, 20:36

Montag 4. März 2019, 21:23

Auf jeden! die großen und kleinen Schreiber hier seien genannt!
Benutzeravatar
Perlchamp
User
Beiträge: 151
Registriert: Samstag 15. April 2017, 17:58

Mittwoch 6. März 2019, 19:33

moinsen,
gesagt, getan: simples tkinter-Programm mit Klassendefinition, mehr oder minder abgeschrieben. Die Fragen diesbezüglich habe ich als Kommentare *im* Skript gekennzeichnet. Und zum Thema 'guter Programmierstil':
ihr hättet mir den Hosenboden versohlt, wenn ich das hier gepostet hätte ...

Code: Alles auswählen

#!/usr/bin/env python3

__author__ = 'Perlchamp'
__date__ = '06.03.2019'

import tkinter as tk

class Application(tk.Frame):

    def __init__(self, master=None):
        tk.Frame.__init__(self, master)  # tk.Frame wird überladen ?
        self.grid()                      # Objekt mittels grid-Manager sichtbar machen ?
        self.createWidgets()

    def createWidgets(self):
        self.quitButton = tk.Button(self, text='Quit',
                                     command=self.quit) # quit 'offizielle' tkinter-Anweisung/-methode,
                                                        # da keine gleichnamige Funktion/Methode ?
        self.quitButton.grid()                         # warum geht self.quit_button.grid() ohne row und column ?

if __name__ == '__main__' :
    root = Application()
    root.master.title(ROOT_TITLE)  # warum  das *.master* ?
    root.mainloop()
wie kann ich alles unterhalb von *if __name__ == '__main__' :* in def main(self) innerhalb der Klasse schreiben und kann man Konstanten in die Klasse schreiben?
Ich habe Folgendes versucht:

Code: Alles auswählen

#!/usr/bin/env python3

__author__ = 'Perlchamp'
__date__ = '06.03.2019'

import tkinter as tk

##    FAVICON = 'image/perlchamp_20x16.ico'      # kann Konstante auch in Klasse geschrieben werden ?
ROOT_TITLE = ' Button mittels Klassendefinition'
ROOT_WIDTH = 350
ROOT_HEIGHT = 200

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        self.quit_button = tk.Button(self, text='Quit', command=self.quit)
        self.quit_button.grid(row=0, column=0)
        
    def main(self):
        self.root = Application()
##        self.root.master.iconbitmap(FAVICON)      
        self.root.master.title(ROOT_TITLE)
        self.root.master.geometry(f'{ROOT_WIDTH}x{ROOT_HEIGHT}')
        self.root.mainloop()
        
if __name__ == '__main__' :
    main()
... und erhalte den Fehler "name 'main' is not defined"
Momentan blick's ich nicht, und raten macht auch keinen Spaß (mehr) ... wie macht man es denn richtig ?

EDIT:
Option *mich benachrichtigen* aktiviert
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Antworten