Seite 1 von 4

Programmierstil

Verfasst: Freitag 1. März 2019, 17:56
von Perlchamp
moinsen,
kann man das auch eleganter lösen (mit '>>' kommentierte Codezeilen) ?

Code: Alles auswählen

def raeume_auf():
    ety_gewicht.delete(0, 'end')
    ety_groesse.delete(0, 'end')
    ety_gewicht.focus_set()
            
def berechne_bmi():
    try:
        kgroesse = float(ety_groesse.get())
        kgewicht = float(ety_gewicht.get())
        if (0.50 < kgroesse < 2.28) and (3 < kgewicht < 160):
            bmi = kgewicht/(kgroesse * kgroesse)
            lbl_bmi_anzeige.config(text=f'{bmi:.2f}')
        else:
            raeume_auf() # >>
            lbl_error.config(text='Die Werte liegen außerhalb des Bereichs !')
            
    except ValueError:        
        raeume_auf() # >>
        lbl_error.config(text='bitte VERNÜNFTIGE Werte eingeben !')
Im Voraus besten Dank. Falls nötig, kann ich auch den kompletten Code reinstellen.

Re: Programmierstil

Verfasst: Freitag 1. März 2019, 18:04
von __deets__
Ja, vor allem indem man das abfangen des ValueError so lokal wie moeglich macht. Das gilt ganz generell fuer Exceptions. Du solltest nicht all-umfassende excepts haben, die es schwer machen nachzuvollziehen, woher eine Ausnahme kommen kann.

Code: Alles auswählen

def berechne_bmi():
    try:
        error_text = 'bitte VERNÜNFTIGE Werte eingeben !'
        kgroesse = float(ety_groesse.get())
        kgewicht = float(ety_gewicht.get())
        if (0.50 < kgroesse < 2.28) and (3 < kgewicht < 160):
             error_text = 'Die Werte liegen außerhalb des Bereichs !'
             raise ValueError
   except ValueError:        
        raeume_auf()
        lbl_error.config(text=error_text)
   else:
        bmi = kgewicht/(kgroesse * kgroesse)
        lbl_bmi_anzeige.config(text=f'{bmi:.2f}')

Re: Programmierstil

Verfasst: Freitag 1. März 2019, 18:21
von __blackjack__
@Perlchamp: Wo wir bei Programmierstil sind: Was sollen denn diese `k`- und `ety_`-Präfixe bedeuten?

Re: Programmierstil

Verfasst: Freitag 1. März 2019, 19:17
von Perlchamp
@ _blackjack_:
kgroesse => KÖRPERgroesse (besser: k_groesse ?)
kgewicht => KÖRPERgewicht (besser: k_gewicht ?)
lbl => Label
btn => Button
ety => Entry

@ _deets_ :
ich habe massive Probleme mit deinem Code bzw. deiner Aussage:
1. du hast zwar 2 'error_text', aber es wird immer nur der zweite ausgegeben
2. das Programm erfüllt seine Funktion nicht mehr, wenn derart, dann müßte es lauten:

Code: Alles auswählen

if not (0.50 < kgroesse < 2.28) or not (3 < kgewicht < 160):
3.
Du solltest nicht all-umfassende excepts haben, die es schwer machen nachzuvollziehen, woher eine Ausnahme kommen kann.
Ich habe doch except ValueError geschrieben, ist doch NICHT all-umfassend, grübel ...

Programmablauf:
Eingabe eines Strings => bitte VERNÜNFTIGE Werte eingeben !
Eingabe von Gewicht außerhalb 3 und 160 => Die Werte liegen außerhalb des Bereichs !
Eingabe von Groesse außerhalb 0.5m und 2.28m => Die Werte liegen außerhalb des Bereichs !
ansonsten Anzeige des BMI.

Hier einmal mein kompletter Code (ich habe u.a. die Errormeldungen in Konstanten 'ausgelagert'), aber (noch) OHNE raise (wegen zweiter Fehlermeldung), Kommentare (als Rubrik-Überschrift) werden später entfernt:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''bmi.pyw
  Berechnung des BMI-Indexes
  + grafische Benutzeroberfläche (GUI)
  + Benutzereingabe Körpergröße (float)
  + Benutzereingabe Körpergewicht (float)
  + Layout-Manager (place)
  '''

__author__ = 'Perlchamp'
__date__ = '01.03.2019'


import tkinter as tk


##FAVICON = 'image/perlchamp_20x16.ico'
ROOT_TITLE = 'BMI'
ROOT_WIDTH = 300
ROOT_HEIGHT = 225
TEXT_ERR1 = 'Die Werte liegen außerhalb des Bereichs !'
TEXT_ERR2 = 'Bitte VERNÜNFTIGE Werte eingeben !'


def raeume_auf():
    ety_gewicht.delete(0, 'end')
    ety_groesse.delete(0, 'end')
    ety_gewicht.focus_set()

            
def berechne_bmi():
    try:
        k_groesse = float(ety_groesse.get())
        k_gewicht = float(ety_gewicht.get())
        if (0.50 < k_groesse < 2.28) and (3 < k_gewicht < 160):
            bmi = k_gewicht/(k_groesse * k_groesse)
            lbl_bmi_anzeige.config(text=f'{bmi:.2f}')
            lbl_error.config(text='')
        else:
            lbl_error.config(text=TEXT_ERR1)
            raeume_auf()  # >>
    except ValueError:
        lbl_error.config(text=TEXT_ERR2)
        raeume_auf() # >>


##HAUPTFENSTER
root = tk.Tk()
##root.iconbitmap(FAVICON)
root.title(f' {ROOT_TITLE}')
root.geometry(f'{ROOT_WIDTH}x{ROOT_HEIGHT}')


##WIDGETs
lbl_gewicht = tk.Label(root, text='Gewicht in kg :  ', bg='pink')
lbl_groesse = tk.Label(root, text='Größe in m :  ', bg='pink')
lbl_bmi_wert = tk.Label(root, text='BMI-Wert :  ', bg='green', fg='white')
lbl_bmi_anzeige = tk.Label(root, bg='gray', fg='white')
lbl_error = tk.Label(root, fg='red', text='')

ety_gewicht = tk.Entry(root)
ety_groesse = tk.Entry(root)

btn_berechnen = tk.Button(root, text='berechnen', command=berechne_bmi, bg='yellow')


##LAYOUT
lbl_gewicht.place(x=70, y=20, width=100, height=30)
ety_gewicht.place(x=190, y=20, width=50, height=30)
lbl_groesse.place(x=70, y=60, width=100, height=30)
ety_groesse.place(x=190, y=60, width=50, height=30)
btn_berechnen.place(x=70, y=100, width=100, height=30)
lbl_bmi_wert.place(x=70, y=140, width=100, height=30)
lbl_bmi_anzeige.place(x=190, y=140, width=50, height=30)
lbl_error.place(x=10, y=180, width=280, height=30)


##HAUPTPROGRAMM
if __name__ == "__main__" :
    root.mainloop()

Re: Programmierstil

Verfasst: Freitag 1. März 2019, 19:29
von __deets__
Ja, die Bedingung zur Wertebereixh-Prüfung muss negiert werden. Das habe ich falsch gemacht. Aber dann sollte es funktionieren, auch mit zwei Fehlermeldungen.

Und das all-umfassend bezieht sich nicht auf den Typ, sondern die Menge an Code-Zeilen die dein try/except umfasst. Da sind diverse Zeilen, in denen der ValueError nicht auftreten kann (oder wenn ein Programmier-Fehler wäre, statt eine gewünschte Fehlerbenhandlung). Und trotzdem sind die umfasst.

Natürlich ist das kein hartes Kriterium. Man muss nicht sklavisch nur die Zeilen absichern, in denen eine Ausnahme kommen kann. Aber gerade bei einer so klaren Trennung von eingabe umwandeln und validieren vs die Ergebnisse dann anzeigen macht das schon Sinn, die Fehlerbehandlung auf den ersten Teil you beschränken.

Re: Programmierstil

Verfasst: Freitag 1. März 2019, 19:47
von Perlchamp
@ __deets__ :
ok, das nicht all-umfassend habe ich KOMPLETT verstanden, danke ...
bin noch am 'Probieren', bekomme es aber noch nicht hin (immer nur gleiche Fehlermeldung) ... und es ist mir etwas Weiteres aufgefallen, das ich mir nicht erklären kann:
wenn ich es so schreibe (auch erst einmal ohne raise ...):

Code: Alles auswählen

def berechne_bmi():
    try:
        k_groesse = float(ety_groesse.get())
        k_gewicht = float(ety_gewicht.get())
        if (0.50 <= k_groesse <= 2.28) and (3 <= k_gewicht <= 160):
            bmi = k_gewicht/(k_groesse * k_groesse)
            lbl_bmi_anzeige.config(text=f'{bmi:.2f}')
            lbl_error.config(text='')
        else:
            lbl_error.config(text=TEXT_ERR1)
            raeume_auf()  # >>
    except ValueError:
        lbl_error.config(text=TEXT_ERR2)
        raeume_auf() # >>
... läuft alles, so wie es soll, d.h.
1. bei Eingabe eines Strings => Bitte VERNÜNFTIGE Werte eingeben !
2. bei Eingabe falscher Zahlenbereich => Die Werte liegen außerhalb des Bereichs !
3, bei korrekten Eingaben => BMI wird angezeigt, keine Fehlermeldung
wenn ich es aber so schreibe:

Code: Alles auswählen

def berechne_bmi():
    try:
        k_groesse = float(ety_groesse.get())
        k_gewicht = float(ety_gewicht.get())
        if (0.50 <= k_groesse <= 2.28) and (3 <= k_gewicht <= 160):
            bmi = k_gewicht/(k_groesse * k_groesse)
            lbl_bmi_anzeige.config(text=f'{bmi:.2f}')
            lbl_error.config(text='')
    except ValueError:
        lbl_error.config(text=TEXT_ERR2)
        raeume_auf() # >>
    else:
        lbl_error.config(text=TEXT_ERR1)
        raeume_auf()  # >>
... läuft NICHT alles, so wie es soll, d.h.
1. bei Eingabe eines Strings => Bitte VERNÜNFTIGE Werte eingeben ! (ok)
2. bei Eingabe falscher Zahlenbereich => Die Werte liegen außerhalb des Bereichs ! (ok)
3, bei korrekten Eingaben => BMI wird angezeigt, vorhergehende Fehlermeldung wird angezeigt, also *lbl_error.config(text='')* im if-Block greift nicht. Eine Idee, warum das so ist?

EDIT:
ist mir klar, warum ... habe vergessen, das *lbl_error.config(text='')* aus dem if-Block (jetzt ja negiert) in den else-Block zu stecken ... tztztz

Re: Programmierstil

Verfasst: Freitag 1. März 2019, 20:08
von Perlchamp
@ __deets__ :
so klappt's jetzt auch :-)
vielen lieben Dank.

Code: Alles auswählen

def berechne_bmi():
    try:
        error_text = TEXT_ERR2
        k_groesse = float(ety_groesse.get())
        k_gewicht = float(ety_gewicht.get())
        if not (0.50 <= k_groesse <= 2.28) or not (3 <= k_gewicht <= 160):
             error_text = TEXT_ERR1
             raise ValueError
    except ValueError:
        raeume_auf()
        lbl_error.config(text=error_text)
    else:
        bmi = k_gewicht/(k_groesse * k_groesse)
        lbl_bmi_anzeige.config(text=f'{bmi:.2f}')
        lbl_error.config(text='')  # >> war mein Fehler, hatte ich vegessen, anzugeben
was GENAU macht das *raise* hier eigentlich ? Es wäre toll, wenn du bitte mehr als *les' die doku* schreiben würdest. Ist doch immer noch besser (für mich), es an diesem konkreten Code zu erklären, in den ich *brain* gesteckt habe (und es somit besser verstehen werde), als bei einem Fremdcode in irgendeiner Doku.

Re: Programmierstil

Verfasst: Freitag 1. März 2019, 22:17
von __deets__
du Weißt doch schon was try/except macht. Woher kommen denn nun die Exceptions, die du damit fängst?

Re: Programmierstil

Verfasst: Freitag 1. März 2019, 23:43
von __blackjack__
@Perlchamp: Guter Stil wäre keine Abkürzungen zu verwenden. Wenn `k` für `koerper` steht, dann kann man das auch so schreiben `koerpergroesse` und schon muss keiner mehr raten was das `k` bedeuten könnte. Gleiches für die Labels, Buttons, und Entries. Und da dann auch eher hinten dran und nicht vor den Namensteil der die Bedeutung verrät. Das wäre irgendwie eher Yoda. ;-)

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 11:55
von Sirius3
Generell gilt, keine globalen Variablen zu verwenden. ety_xxx in `raeume_auf` kommen aus dem nichts, ebenso in `berechne_bmi`.

Jedes nicht triviale GUI-Programm braucht Klassendefinitionen.
`place` sollte man nicht benutzen, weil solche Fenster nur genau bei Deinem Rechner mit Deiner Bildschirmauflösung schön aussehen. Besser mit grid arbeiten. Dann wird die Anordnung automatisch richtig gemacht.

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 12:24
von __blackjack__
Um das mit dem `place()` mal praktisch zu demonstrieren – so sieht das bei mir aus:
Bild

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 12:29
von Perlchamp
@ sirius3:
Danke für die Anmerkungen !
Hier nochmals das komplette Script, damit wir nicht aneinander vorbeireden (neue Bezeichner, etc.)

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''bmi.pyw
  Berechnung des BMI-Indexes
  + grafische Benutzeroberfläche (GUI)
  + Benutzereingabe Körpergröße (float)
  + Benutzereingabe Körpergewicht (float)
  + Layout-Manager (place)
  '''

__author__ = 'Perlchamp'
__date__ = '01.03.2019'


import tkinter as tk


##FAVICON = 'image/perlchamp_20x16.ico'
ROOT_TITLE = 'BMI'
ROOT_WIDTH = 300
ROOT_HEIGHT = 225
TEXT_ERR1 = 'Die Werte liegen außerhalb des Bereichs !'
TEXT_ERR2 = 'Bitte VERNÜNFTIGE Werte eingeben !'


def raeume_auf():
    koerpergewicht_entry.delete(0, 'end')
    koerpergroesse_entry.delete(0, 'end')
    koerpergewicht_entry.focus_set()
            

def berechne_bmi():
    try:
        error_text = TEXT_ERR2
        koerpergroesse = float(koerpergroesse_entry.get())
        koerpergewicht = float(koerpergewicht_entry.get())
        if not (0.50 <= koerpergroesse <= 2.28) or not (3 <= koerpergewicht <= 160):
             error_text = TEXT_ERR1
             raise ValueError
    except ValueError:
        raeume_auf()
        error_label.config(text=error_text)
    else:
        bmi = koerpergewicht/(koerpergroesse * koerpergroesse)
        bmi_anzeige_label.config(text=f'{bmi:.2f}')
        error_label.config(text='')


##HAUPTFENSTER
root = tk.Tk()
##root.iconbitmap(FAVICON)
root.title(f' {ROOT_TITLE}')
root.geometry(f'{ROOT_WIDTH}x{ROOT_HEIGHT}')


##WIDGETs
koerpergewicht_label = tk.Label(root, text='Gewicht in kg :  ', bg='pink')
koerpergroesse_label = tk.Label(root, text='Größe in m :  ', bg='pink')
bmi_wert_label = tk.Label(root, text='BMI-Wert :  ', bg='green', fg='white')
bmi_anzeige_label = tk.Label(root, bg='gray', fg='white')
error_label = tk.Label(root, fg='red', text='')

koerpergewicht_entry = tk.Entry(root)
koerpergroesse_entry = tk.Entry(root)

berechnen_button = tk.Button(root, text='berechnen', command=berechne_bmi, bg='yellow')


##LAYOUT
koerpergewicht_label.place(x=70, y=20, width=100, height=30)
koerpergewicht_entry.place(x=190, y=20, width=50, height=30)
koerpergroesse_label.place(x=70, y=60, width=100, height=30)
koerpergroesse_entry.place(x=190, y=60, width=50, height=30)
berechnen_button.place(x=70, y=100, width=100, height=30)
bmi_wert_label.place(x=70, y=140, width=100, height=30)
bmi_anzeige_label.place(x=190, y=140, width=50, height=30)
error_label.place(x=10, y=180, width=280, height=30)


##HAUPTPROGRAMM
if __name__ == "__main__" :
    root.mainloop()
Generell gilt, keine globalen Variablen zu verwenden. ety_xxx in `raeume_auf` kommen aus dem nichts, ebenso in `berechne_bmi`.
Jedes nicht triviale GUI-Programm braucht Klassendefinitionen.
d.h. alle unter '## WIDGETs' definierten Variablen sind global. Wie oder wo sollten diese 'deklariert' (?) werden? In den Funktionen oder in einr eigens geschriebenen Klasse? Ich habe doch die Klasse Tk() importiert, welche ihre Objekte (Label, Entry, Button, usw. ) mitbringt. Wird in den Dokus/Tuts, die ich bisher gelesen habe derart gehandhabt. Stehe momentan auf dem Schlauch ... (?)
`place` sollte man nicht benutzen, weil solche Fenster nur genau bei Deinem Rechner mit Deiner Bildschirmauflösung schön aussehen. Besser mit grid arbeiten. Dann wird die Anordnung automatisch richtig gemacht.
ok, das verstehe ich. Werde mal versuchen, es mit grid zu probieren. Der Packer dagegen kommt mir (momentan) etwas 'unseriös' daher ...

@ _blackjack_:
ok, verstehe. Würde ich Schriftgröße und Schriftart noch zusätzlich definieren, dann wäre das Problem wohl beseitigt ?
Aber ich weiß im Grunde, was du meinst. Grid ist dynamisch, place dagegen statisch ...

EDIT:
so, hier die entsprechenden Stellen mal mit fester Schriftgröße. Sollte bei dir jetzt auch passen:

Code: Alles auswählen

.
.
.
TEXT_ERR2 = 'Bitte VERNÜNFTIGE Werte eingeben !'
FONT_STANDARD = ('Arial', 9)
.
.
.
##WIDGETs
koerpergewicht_label = tk.Label(root, text='Gewicht in kg :  ', bg='pink', font=FONT_STANDARD)
koerpergroesse_label = tk.Label(root, text='Größe in m :  ', bg='pink', font=FONT_STANDARD)
bmi_wert_label = tk.Label(root, text='BMI-Wert :  ', bg='green', fg='white', font=FONT_STANDARD)
bmi_anzeige_label = tk.Label(root, bg='gray', fg='white', font=FONT_STANDARD)
error_label = tk.Label(root, fg='red', text='', font=FONT_STANDARD)

koerpergewicht_entry = tk.Entry(root, font=FONT_STANDARD)
koerpergroesse_entry = tk.Entry(root, font=FONT_STANDARD)

berechnen_button = tk.Button(root, text='berechnen', command=berechne_bmi, bg='yellow',
                             font=FONT_STANDARD)
.
.
.

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 12:41
von Sirius3
Alles was unter `##HAUPTFENSTER` steht gehört in eine Funktion, die üblicherweise `main` genannt wird, und im if ganz unten aufgerufen wird, nicht nur mainloop.

Damit sind die ganzen Widgets in den Funktionen nicht mehr verfügbar und müssen entweder als Parameter übergeben werden, oder eben das ganze als Klasse umgeschrieben werden.

Mal ohne Klasse:

Code: Alles auswählen

from functools import partial
import tkinter as tk

ROOT_TITLE = 'BMI'
ERROR_OUT_OF_RANGE = 'Die Werte liegen außerhalb des Bereichs !'
ERROR_NO_NUMBER = 'Bitte VERNÜNFTIGE Werte eingeben !'


def raeume_auf(koerpergewicht_entry, koerpergroesse_entry):
    koerpergewicht_entry.delete(0, 'end')
    koerpergroesse_entry.delete(0, 'end')
    koerpergewicht_entry.focus_set()
            

def berechne_bmi(koerpergewicht_entry, koerpergroesse_entry, bmi_anzeige_label, error_label):
    try:
        error_text = ERROR_NO_NUMBER
        koerpergroesse = float(koerpergroesse_entry.get())
        koerpergewicht = float(koerpergewicht_entry.get())
        if not (0.50 <= koerpergroesse <= 2.28 and 3 <= koerpergewicht <= 160):
             error_text = ERROR_OUT_OF_RANGE
             raise ValueError
    except ValueError:
        raeume_auf(koerpergewicht_entry, koerpergroesse_entry)
        error_label['text'] = error_text
    else:
        bmi = koerpergewicht/(koerpergroesse * koerpergroesse)
        bmi_anzeige_label['text'] = f'{bmi:.2f}'
        error_label['text'] = ''

def main():
    root = tk.Tk()
    root.title(ROOT_TITLE)

    tk.Label(root, text='Gewicht in kg :  ', bg='pink').grid(row=1,column=1)
    koerpergewicht_entry = tk.Entry(root)
    koerpergewicht_entry.grid(row=1, column=2)

    tk.Label(root, text='Größe in m :  ', bg='pink').grid(row=2,column=1)
    koerpergroesse_entry = tk.Entry(root)
    koerpergroesse_entry.grid(row=2, column=2)

    tk.Label(root, text='BMI-Wert :  ', bg='green', fg='white').grid(row=4,column=1)
    bmi_anzeige_label = tk.Label(root, bg='gray', fg='white')
    bmi_anzeige_label.grid(row=4,column=2)
    error_label = tk.Label(root, fg='red', text='')
    error_label.grid(row=5,column=1)

    tk.Button(root, text='berechnen',
        command=partial(berechne_bmi, koerpergewicht_entry, koerpergroesse_entry, bmi_anzeige_label, error_label),
        bg='yellow').grid(row=3,column=1)
    root.mainloop()

if __name__ == "__main__" :
    main()

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 13:31
von __blackjack__
@Perlchamp: Das festlegen eine Schriftart-Grösse ändert nichts am Problem. Die Grösse der Schriftart ist bei mir ja auch fest, halt durch die Systemeinstellungen. Das Problem ist das die Schriftgrösse in ”realen” Einheiten angegeben wird, die ist also überall gleich gross, aber die `place()`-Werte sind in Pixeln, also bei unterschiedlichen Systemen unterschiedlich gross, abhängig von Bildschirmgrösse und -auflösung. Und man zwingt Nutzern damit eine Schriftgrösse auf, die sie vielleicht gar nicht haben wollen, nicht lesen können, oder auf eine andere Art ungeeignet ist. Eine Schriftgrösse von 9 pt sind 3.175 mm. Ältere Menschen könnten das schon grenzwertig klein finden.

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 14:06
von Perlchamp
@ sirius3 :
danke für deine Mühe und sehr lieben Dank für das Posten des Codes - ich denke, ich habe heute sehr viel zu tun ...
mit grid zu arbeiten - gerade, wenn man in den Anfängen steckt - ist fast unmenschlich. Was für ein Sch... Aber ich funze mich da schon rein. Place() versteht man halt sofort und sieht gut aus - hatte gerade einmal 10 Minuten dafür gebraucht. Jetzt sitze ich bereits eine Weile *über* grid, und es sieht immer noch aus, als ob ein 2-jähriger ein paar (Puzzle)Teile auf den Boden geschmissen hat. Bei dir übrigens auch, Sirius3, aber das soll nicht despektierlich klingen, sondern mir ist es klar, dass es hier ums Prinzip geht, und du für sowas auch keine Zeit hast, warum auch - alles gut, kein Vorwurf, bitte dies NICHT falsch verstehen ! Die Funktionalität ist das Entscheidende, nicht das Design !

@ _blackjack_:
ok, verstehe. Wie gesagt: ich habe heute noch viiiiiiiiiiiiel zu lesen, dann schau' mer mal, ob und wann ich etwas Vernünftiges zuwege bringe ... dir natürlich auch vielen Dank

@ all:
Und ich bin dankbar dafür, dass es noch Menschen auf der heutigen Welt gibt, die uneigennützig anderen helfen, DANKE ! Und ich habe bereits eine Menge von euch lernen dürfen!

EDIT:
@ sirius3:
Verständnisfrage:
du hast einige Widgets ohne Bezeichner instanziiert. Weil sie nicht angesprochen werden ?

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 15:36
von snafu
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.

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 16:31
von __blackjack__
Wobei das Grid wie vieles in der Informatik bei 0 anfängt. Links oben ist also 0, 0 nicht 1, 1.

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 16:39
von Perlchamp
@ 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 ;-)

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 17:02
von __blackjack__
@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.

Re: Programmierstil

Verfasst: Samstag 2. März 2019, 17:36
von Perlchamp
@ _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) ...