@ 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)
.
.
.