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
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

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.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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}')
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Perlchamp: Wo wir bei Programmierstil sind: Was sollen denn diese `k`- und `ety_`-Präfixe bedeuten?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _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()
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ __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
Zuletzt geändert von Perlchamp am Freitag 1. März 2019, 20:12, 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 !
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ __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.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

du Weißt doch schon was try/except macht. Woher kommen denn nun die Exceptions, die du damit fängst?
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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. ;-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Um das mit dem `place()` mal praktisch zu demonstrieren – so sieht das bei mir aus:
Bild
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ 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)
.
.
.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ 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 ?
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei das Grid wie vieles in der Informatik bei 0 anfängt. Links oben ist also 0, 0 nicht 1, 1.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ 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: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _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 !
Antworten