Tkinter Eingabefeld

Fragen zu Tkinter.
Antworten
PythonTT
User
Beiträge: 5
Registriert: Sonntag 11. Juni 2017, 17:30

Hey, :)
(Ich bin grade am Programmieren lernen, also nicht zu streng sein :D )
Habe folgendes Problem. Schreibe gerade ein Umrechnungs-Programm, soweit hat alles eigentlich ganz gut funktioniert außer das ich es nicht hinbekomme das er mir ganz am Anfang noch 2 Eingabefelder nebeneinander anzeigt.
Das dritte und letzte Eingabefeld wir angezeigt. Danke schon mal im voraus für eure Hilfe.


Code: Alles auswählen

from tkinter import *

FAKTOR_g_e = float(110)            
FAKTOR_e_g = float(110)         
ausg1 = float()
ausg2 = float()
ausgf1 =float()
ausgf2 = float()

def button_kurs1():
    kurs_g = eingabefeld.get()
    kurs1 = float(kurs_g)
    wahl = variable.get()

    ausgabe.configure(text=message)

def button_kurs2():
    kurs_e = eingabefeld.get()
    kurs2 = float(kurs_g)
    wahl = variable.get()

    ausgabe.configure(text=message)

def button_action():
    betrag_int = eingabefeld.get()
    betrag = float(betrag_int)
    wahl = variable.get()
    if wahl == u1:
        ausg1 = int(betrag_int) / int(FAKTOR_g_e)
        ausgf1 = round(ausg1, 2)
        message = ausgf1, "€"
    elif wahl == u2:
        ausg2 = int(betrag_int) * int(FAKTOR_e_g)
        ausgf2 = round(ausg2, 0)
        message = ausgf2, "e*Gold"

    ausgabe.configure(text=message)


fenster = Tk()
fenster.title("e*Gold Rechner")

info = Label(fenster, justify = LEFT, font=("Helvetica", 16),
             text="""\
************* e*Gold Rechner *************
       1) Umrechnungsart wählen.
       2) e*Gold / Euro eingeben.
       3) Taste "Umrechnen" drücken.""")

u1 = "e*Gold in Euro"
u2 = "Euro in e*Gold"


variable = StringVar(fenster)
variable.set(u1) # default value

eingabefeld = Entry(fenster, bd=5, width=20)
eingabefeld = Entry(fenster, bd=5, width=20)
optionen = OptionMenu(fenster, variable, u1, u2)
optionen.configure(width = 40, font=("Helvetica", 16))
eingabefeld = Entry(fenster, bd=5, width=20)
label = Label(fenster, justify = LEFT, font=("Helvetica", 16), text="Ausgabe: ")
ausgabe = Label(fenster, justify = CENTER, font=("Helvetica", 16), text=" ")
run_button = Button(fenster,text="Umrechnen", font=("Helvetica", 16), command = button_action)

eingabefeld.grid(row = 0, column = 0, pady = 20)
eingabefeld.grid(row = 0, column = 0, pady = 20)
info.grid(row = 1, column = 0, columnspan = 3, pady = 20, padx = 50)
optionen.grid(row = 2, column = 0, columnspan = 3, pady = 20)
eingabefeld.grid(row = 3, column = 0, pady = 20)
run_button.grid(row = 3, column = 1, pady = 20)
label.grid(row = 4, column = 0, pady = 20)
ausgabe.grid(row = 4, column = 1, columnspan = 2, pady = 20)

fenster.mainloop()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Bevor ich Deinen Code durchsuche, habe ich ihn einfach mit meinem GuiDesigner geöffnet:

Bild

Du hast also einen Button, drei Entries und drei Label.

Entry 2 hat ein grid layout in row 3 und column 0
Entries 0 und 1 sind kursiv dargestell, das heißt sie haben kein Layout.
Da hast du wohl grid vergessen. Ich nehme an, dass es grid sein soll, weil alles andere auch grid hat.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Kann auch nicht funktionieren, dann da machst Du drei Eingabefelder:

Code: Alles auswählen

eingabefeld = Entry(fenster, bd=5, width=20)
eingabefeld = Entry(fenster, bd=5, width=20)
optionen = OptionMenu(fenster, variable, u1, u2)
optionen.configure(width = 40, font=("Helvetica", 16))
eingabefeld = Entry(fenster, bd=5, width=20)
Und gibst allen drei den selben Namen. Wie willst Du dann darauf zugreifen?

Du musst da verschiedene Namen nehmen!!!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi PythonTT

Kannst du das folgende einmal ausprobieren?:

Code: Alles auswählen

rom tkinter import *
 
FAKTOR_g_e = float(110)            
FAKTOR_e_g = float(110)        
ausg1 = float()
ausg2 = float()
ausgf1 =float()
ausgf2 = float()
 
def button_kurs1():
    kurs_g = eingabefeld.get()
    kurs1 = float(kurs_g)
    wahl = variable.get()
 
    ausgabe.configure(text=message)
 
def button_kurs2():
    kurs_e = eingabefeld.get()
    kurs2 = float(kurs_g)
    wahl = variable.get()
 
    ausgabe.configure(text=message)
 
def button_action():
    betrag_int = eingabefeld.get()
    betrag = float(betrag_int)
    wahl = variable.get()
    if wahl == u1:
        ausg1 = int(betrag_int) / int(FAKTOR_g_e)
        ausgf1 = round(ausg1, 2)
        message = ausgf1, "€"
    elif wahl == u2:
        ausg2 = int(betrag_int) * int(FAKTOR_e_g)
        ausgf2 = round(ausg2, 0)
        message = ausgf2, "e*Gold"
 
    ausgabe.configure(text=message)
 
 
fenster = Tk()
fenster.title("e*Gold Rechner")

u1 = "e*Gold in Euro"
u2 = "Euro in e*Gold"

variable = StringVar(fenster)
variable.set(u1) # default value
 
eingabefeld = Entry(fenster, bd=5, width=20)
eingabefeld.grid(row = 0, column = 0, pady = 20)

eingabefeld = Entry(fenster, bd=5, width=20)
eingabefeld.grid(row = 0, column = 1, pady = 20)
 
info = Label(fenster, justify = LEFT, font=("Helvetica", 16),
             text="""\
************* e*Gold Rechner *************
      1) Umrechnungsart wählen.
      2) e*Gold / Euro eingeben.
      3) Taste "Umrechnen" drücken.""")
info.grid(row = 1, column = 0, columnspan = 3, pady = 20, padx = 50)
 
optionen = OptionMenu(fenster, variable, u1, u2)
optionen.grid(row = 2, column = 0, columnspan = 3, pady = 20)
optionen.configure(width = 40, font=("Helvetica", 16))

eingabefeld = Entry(fenster, bd=5, width=20)
eingabefeld.grid(row = 3, column = 0, pady = 20)

label = Label(fenster, justify = LEFT, font=("Helvetica", 16), text="Ausgabe: ")
label.grid(row = 4, column = 0, pady = 20)

ausgabe = Label(fenster, justify = CENTER, font=("Helvetica", 16), text=" ")
ausgabe.grid(row = 4, column = 1, columnspan = 2, pady = 20)

run_button = Button(fenster,text="Umrechnen", font=("Helvetica", 16), command = button_action)
run_button.grid(row = 3, column = 1, pady = 20) 

 
fenster.mainloop()
Gruss wuf :wink:
Take it easy Mates!
PythonTT
User
Beiträge: 5
Registriert: Sonntag 11. Juni 2017, 17:30

Alfons Mittelmeyer hat geschrieben:Kann auch nicht funktionieren, dann da machst Du drei Eingabefelder:

Code: Alles auswählen

eingabefeld = Entry(fenster, bd=5, width=20)
eingabefeld = Entry(fenster, bd=5, width=20)
optionen = OptionMenu(fenster, variable, u1, u2)
optionen.configure(width = 40, font=("Helvetica", 16))
eingabefeld = Entry(fenster, bd=5, width=20)
Und gibst allen drei den selben Namen. Wie willst Du dann darauf zugreifen?

Du musst da verschiedene Namen nehmen!!!
Ist mir auch aufgefallen, weiß auch nicht wie ich das übersehen habe.
Kennst du vll ein Drag&Drop Gui builder? also nicht wie bei dir wo man alles einstellen muss, sondern lediglich z.B.: entry field reinziehen und dann nur größe bestimmen.

Komme mit dem GUI coden nicht so ganz klar
PythonTT
User
Beiträge: 5
Registriert: Sonntag 11. Juni 2017, 17:30

wuf hat geschrieben:Hi PythonTT

Kannst du das folgende einmal ausprobieren?:

Code: Alles auswählen

rom tkinter import *
 
FAKTOR_g_e = float(110)            
FAKTOR_e_g = float(110)        
ausg1 = float()
ausg2 = float()
ausgf1 =float()
ausgf2 = float()
 
def button_kurs1():
    kurs_g = eingabefeld.get()
    kurs1 = float(kurs_g)
    wahl = variable.get()
 
    ausgabe.configure(text=message)
 
def button_kurs2():
    kurs_e = eingabefeld.get()
    kurs2 = float(kurs_g)
    wahl = variable.get()
 
    ausgabe.configure(text=message)
 
def button_action():
    betrag_int = eingabefeld.get()
    betrag = float(betrag_int)
    wahl = variable.get()
    if wahl == u1:
        ausg1 = int(betrag_int) / int(FAKTOR_g_e)
        ausgf1 = round(ausg1, 2)
        message = ausgf1, "€"
    elif wahl == u2:
        ausg2 = int(betrag_int) * int(FAKTOR_e_g)
        ausgf2 = round(ausg2, 0)
        message = ausgf2, "e*Gold"
 
    ausgabe.configure(text=message)
 
 
fenster = Tk()
fenster.title("e*Gold Rechner")

u1 = "e*Gold in Euro"
u2 = "Euro in e*Gold"

variable = StringVar(fenster)
variable.set(u1) # default value
 
eingabefeld = Entry(fenster, bd=5, width=20)
eingabefeld.grid(row = 0, column = 0, pady = 20)

eingabefeld = Entry(fenster, bd=5, width=20)
eingabefeld.grid(row = 0, column = 1, pady = 20)
 
info = Label(fenster, justify = LEFT, font=("Helvetica", 16),
             text="""\
************* e*Gold Rechner *************
      1) Umrechnungsart wählen.
      2) e*Gold / Euro eingeben.
      3) Taste "Umrechnen" drücken.""")
info.grid(row = 1, column = 0, columnspan = 3, pady = 20, padx = 50)
 
optionen = OptionMenu(fenster, variable, u1, u2)
optionen.grid(row = 2, column = 0, columnspan = 3, pady = 20)
optionen.configure(width = 40, font=("Helvetica", 16))

eingabefeld = Entry(fenster, bd=5, width=20)
eingabefeld.grid(row = 3, column = 0, pady = 20)

label = Label(fenster, justify = LEFT, font=("Helvetica", 16), text="Ausgabe: ")
label.grid(row = 4, column = 0, pady = 20)

ausgabe = Label(fenster, justify = CENTER, font=("Helvetica", 16), text=" ")
ausgabe.grid(row = 4, column = 1, columnspan = 2, pady = 20)

run_button = Button(fenster,text="Umrechnen", font=("Helvetica", 16), command = button_action)
run_button.grid(row = 3, column = 1, pady = 20) 

 
fenster.mainloop()
Gruss wuf :wink:
Wenn ich dass so mit dem Code versuche, closed sich das Fenster sofort.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi PythonTT

Sorry! In der ersten Zeile ging bei der copy -> paste Aktion etwas verloren:
Falsch:

Code: Alles auswählen

rom tkinter import *
Richtig:

Code: Alles auswählen

from tkinter import *
Gruss wuf :wink:
Take it easy Mates!
PythonTT
User
Beiträge: 5
Registriert: Sonntag 11. Juni 2017, 17:30

wuf hat geschrieben:Hi PythonTT

Sorry! In der ersten Zeile ging bei der copy -> paste Aktion etwas verloren:
Gruss wuf :wink:
Hat funktioniert. :)

Habe allerdings ein anderes Problem wenn ich das Programm laufen lasse und auf rechnen drücke, ist "kurs1" nicht defi, aber das ist er doch? (Zeile 28)

Code: Alles auswählen

from tkinter import *

KURSF = int()
ausg1 = float()
ausg2 = float()
ausgf1 =float()
ausgf2 = float()

def button_kurs1():
    kurs_g = eingabefeld1.get()
    kurs1 = int(kurs_g)
    wahl = variable.get()

    ausgabe.configure(text=message)

def button_kurs2():
    kurs_e = eingabefeld2.get()
    kurs2 = float(kurs_e)
    wahl = variable.get()

    ausgabe.configure(text=message)

def button_action():
    betrag_int = eingabefeld.get()
    betrag = float(betrag_int)
    wahl = variable.get()
    if wahl == u1:
        KURSF = int(kurs1) / int(kurs2)
        ausg1 = int(betrag_int) / int(KURSF)
        ausgf1 = round(ausg1, 2)
        message = ausgf1, "€"

    elif wahl == u2:
        ausg2 = int(betrag_int) * int(FAKTOR_e_g)
        ausgf2 = round(ausg2, 0)
        message = ausgf2, "e*Gold"

    ausgabe.configure(text=message)


fenster = Tk()
fenster.title("e*Gold Rechner")

info = Label(fenster, justify = LEFT, font=("Helvetica", 16),
             text="""\
************* e*Gold Rechner *************
       1) Umrechnungsart wählen.
       2) e*Gold / Euro eingeben.
       3) Taste "Umrechnen" drücken.""")

u1 = "e*Gold in Euro"
u2 = "Euro in e*Gold"


variable = StringVar(fenster)
variable.set(u1) # default value

eingabefeld1 = Entry(fenster, bd=5, width=20)
eingabefeld2 = Entry(fenster, bd=5, width=20)
optionen = OptionMenu(fenster, variable, u1, u2)
optionen.configure(width = 40, font=("Helvetica", 16))
eingabefeld = Entry(fenster, bd=5, width=20)
label = Label(fenster, justify = LEFT, font=("Helvetica", 16), text="Ausgabe: ")
ausgabe = Label(fenster, justify = CENTER, font=("Helvetica", 16), text=" ")
run_button = Button(fenster,text="Umrechnen", font=("Helvetica", 16), command = button_action)

eingabefeld1.grid(row = 0, column = 0, pady = 20)
eingabefeld2.grid(row = 0, column = 1, pady = 20)
info.grid(row = 1, column = 0, columnspan = 3, pady = 20, padx = 50)
optionen.grid(row = 2, column = 0, columnspan = 3, pady = 20)
eingabefeld.grid(row = 3, column = 0, pady = 20)
run_button.grid(row = 3, column = 1, pady = 20)
label.grid(row = 4, column = 0, pady = 20)
ausgabe.grid(row = 4, column = 1, columnspan = 2, pady = 20)

fenster.mainloop()
Zuletzt geändert von Anonymous am Sonntag 11. Juni 2017, 22:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

PythonTT hat geschrieben: Kennst du vll ein Drag&Drop Gui builder? also nicht wie bei dir wo man alles einstellen muss, sondern lediglich z.B.: entry field reinziehen und dann nur größe bestimmen.

Komme mit dem GUI coden nicht so ganz klar
Also außer meinem GuiDesigner weiß ich keinen der grid kann. Aber wie kommst Du darauf, dass man bei meinem GuiDesigner alles einstellen muß und da Drag&Drop nicht geht. Du kennst Dich nur nicht damit aus.

Was glaubst Du was zu sehen ist, wenn man hier den Button auswählt, 5 Zeilen 3 Spalten einstellt und auf Show drückt?

Bild

So sieht dann die GUI aus:

Bild

Und was passiert, wenn man dann entry 0 auswählt und auf GRID drückt?

Bild

Das passiert dann:

Bild

Entry 0 erscheint dann in Zeile 0 Spalte 0 und Du ziehst es dann mit der Maus dorthin, wo Du es haben willst.

Ist das Deiner Meinung nach kein Drag&Drop?

PS: wenn ich wüßte, wonhin Du es haben willst, hätte ich es ja tun können
PythonTT
User
Beiträge: 5
Registriert: Sonntag 11. Juni 2017, 17:30

Alfons Mittelmeyer hat geschrieben:Ist das Deiner Meinung nach kein Drag&Drop?
Ist es. Hat nur im ersten Moment, indem ich flüchtig auf deinen ersten Screen geschaut habe, nicht so ausgesehen. :)

Gibst du das Tool auch weiter?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi PythonTT

Habe dein Skript einmal genauer angeschaut. Da hat es einige schwerwiegende Programmierfehler drin. Die Kurse 'kurs1' bzw. 'kurs2' werden in den Subroutinen 'button_kurs1' bzw 'button_kurs2' erzeugt aber in deinem Skript werden diese Subroutinen ja gar nie aufgerufen. Es tut mir leid aber ich möchte dir nicht die Basic's der Pythonprogrammierung beibringen. Du musst noch einmal über die Bücher der Python-Programmierung gehen.

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

[quote="PythonTT"Gibst du das Tool auch weiter?[/quote]
Findest Du hier: https://github.com/AlfonsMittelmeyer/py ... -messaging
Dabei grünen Button drücken.

Aber das OPtionMenu kann ich leider nicht mit speichern. Da ist für die Optionen ja gar kein Datentyp festgelegt. Könnte alles möglich drin sein, auch Referenzen auf Objekte. Das kann ich leider nicht generieren.

Könnte aber nachdenken, dass ich das für manche Datentypen tun könnte und müßte nachdenken wie. Denn das wäre etwas Neues, etwa einen + Button , um die Optionen zu erweitern.

Mußt eben Dein Optionsmenü vorerst in den Code wieder einfügen.

Ich habe hier mal Deine GUi ohne die richtigen Variablennamen generiert. Das Optionsmenü mußt Du noch irgendwo einfügen, aber am Besten nicht im Gui Teil:

Code: Alles auswählen

# -*- coding: utf-8 -*-

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

#import DynTkInter as tk # for GuiDesigner

import appcode

# Application definition ============================

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.call_code = 'appcode.init'
        self.title('e*Gold Rechner')
        # widget definitions ===================================
        self.button = tk.Button(self,name='#0_button',text='Umrechnen', font='Helvetica 16')
        self.button.grid(column=1, row=3, pady=20)
        self.entry = tk.Entry(self,name='#1_entry',bd=5)
        self.entry_2 = tk.Entry(self,name='#2_entry_2',bd=5)
        self.entry_3 = tk.Entry(self,name='#3_entry_3',bd=5)
        self.entry_3.grid(row=3, pady=20)
        self.label = tk.Label(self,name='#4_label',text='************* e*Gold Rechner *************\n      1) Umrechnungsart wählen.\n      2) e*Gold / Euro eingeben.\n      3) Taste "Umrechnen" drücken.', font='Helvetica 16', justify='left')
        self.label.grid(padx=50, row=1, columnspan=3, pady=20)
        self.label_2 = tk.Label(self,name='#5_label_2',text='Ausgabe: ', font='Helvetica 16', justify='left')
        self.label_2.grid(row=4, pady=20)
        self.label_3 = tk.Label(self,name='#6_label_3',text=' ', font='Helvetica 16')
        self.label_3.grid(column=1, row=4, columnspan=2, pady=20)
        # call Code ===================================
        appcode.init(self)

if __name__ == '__main__':
    #Application().mainloop('guidesigner/Guidesigner.py') # for GuiDesigner
    Application().mainloop()
Und in dieses Modul schreibt Du Deinen Code und auch das OptionMenu. Das hier ist nur ein Teil von Deinem Code, damit Du einen Eindruck gewinnst, wie das etwa zu implementieren wäre

appcode.py

Code: Alles auswählen

# -*- coding: utf-8 -*-

# for store access by closures to a local variable
class Var:
    def __init__(self,value = None):
        self.value = value


# here in should be your code. I took a closure,
# because I think you are not used to take a class
def init(self):

    # variable = StringVar(self) # sorry ganz bestimmt nicht

    def button_action(self = self):
        betrag_int = self.eingabefeld.get() # bitte Namen in der Gui anpassen
        betrag = float(betrag_int)
        wahl = variable.get()
        if wahl == u1:
            ausg1 = int(betrag_int) / int(FAKTOR_g_e)
            ausgf1 = round(ausg1, 2)
            message = ausgf1, "€"
        elif wahl == u2:
            ausg2 = int(betrag_int) * int(FAKTOR_e_g)
            ausgf2 = round(ausg2, 0)
            message = ausgf2, "e*Gold"
     
        self.ausgabe.configure(text=message) # bitte Namen in der Gui anpassen
Also self benützen, um auf die Root und auch auf Deine Widgets zuzugreifen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Ach so, die Optionen sind wohl nur Strings, die dann als Menü dargestellt werden. Dann wäre doch eine Implementierung denkbar.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@PythonTT: versuche aussagekräftige Namen zu finden. FAKTOR_g_e sagt nur, dass es sich um einen Faktor handelt, aber nicht, wofür. Dass es ein Faktor ist, sieht man spätestens, wenn damit irgendetwas multipliziert wird. Womit wir beim nächsten Problem sind: FAKTOR_g_e und FAKTOR_e_g sind identisch, nur dass das eine davon nicht als Faktor verwendet wird. Würde die Konstante UMRECHNUNG_GOLD_EURO heißen, dann wäre gleich klar, wofür sie gut ist und wie man damit EURO in GOLD umrechnen kann.
Sternchenimporte sind böse, Variablen "deklariert" man nicht, die Zeilen mit ausg1-ausgf2 sind also überflüssig, button_kurs1 und button_kurs2 funktionieren so nicht und werden auch nicht gebraucht. In button_action, warum wandelst Du alles in "int" um, um dann doch eine Fließkommadivision zu machen? betrag wird gar nicht verwendet und was das _int an betrag_int zu bedeuten hat, ist hoffentlich nicht, dass der Wert später einmal in ein int umgewandelt wird?

@Alfons Mittelmeyer: Dein Code ist für jemanden, der Python noch nicht so gut kann, absolut unverständlich, für jemanden, der Python kann, der Horror. Argumente außerhalb einer Klassen-Methode self zu nennen ist sehr sehr verwirrend. Bei eine Funktion init mit internen Funktionen so zu tun, als würde man damit eine Klasse definieren ist noch viel schlimmer. Das ist unausgereift, nicht testbar, nicht wartbar und dürfte noch an viel mehr Stellen zu Problemen führen. Das zeigt auch die Klasse Var, die für nichts anderes da zu sein scheint, als zukünftig Probleme zu machen.

Also, stell Dein Programm mal vom Kopf auf die Beine. Das Hauptprogramm sollte nicht aus automatisch generiertem Code bestehen, der dann den User-Code aufruft, sondern genau umgekehrt. Schau Dir mal an, wie das bei Qt gemacht wird. Die load_ui-Funktion wird vom __init__ der selbst geschriebenen Klasse aus aufgerufen und initalisiert die GUI. Bei automatisch generiertem Code ist es auch nicht so schlimm, wenn da etwas Vodoo gemacht wird, weil das liest sowieso niemand und man kann relativ gut testen, dass dieses Vodoo auch funktioniert.

Code: Alles auswählen

# -*- coding: utf-8 -*-
try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

#import DynTkInter as tk # for GuiDesigner

# Application definition ============================
def init_app(self):
    self.title('e*Gold Rechner')
    # widget definitions ===================================
    self.button = tk.Button(self,name='#0_button',text='Umrechnen', font='Helvetica 16')
    self.button.grid(column=1, row=3, pady=20)
    self.entry = tk.Entry(self,name='#1_entry',bd=5)
    self.entry_2 = tk.Entry(self,name='#2_entry_2',bd=5)
    self.entry_3 = tk.Entry(self,name='#3_entry_3',bd=5)
    self.entry_3.grid(row=3, pady=20)
    self.label = tk.Label(self,name='#4_label',text='************* e*Gold Rechner *************\n      1) Umrechnungsart wählen.\n      2) e*Gold / Euro eingeben.\n      3) Taste "Umrechnen" drücken.', font='Helvetica 16', justify='left')
    self.label.grid(padx=50, row=1, columnspan=3, pady=20)
    self.label_2 = tk.Label(self,name='#5_label_2',text='Ausgabe: ', font='Helvetica 16', justify='left')
    self.label_2.grid(row=4, pady=20)
    self.label_3 = tk.Label(self,name='#6_label_3',text=' ', font='Helvetica 16')
    self.label_3.grid(column=1, row=4, columnspan=2, pady=20)

Code: Alles auswählen

# -*- coding: utf-8 -*-
try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

import gui

OPTIONS = ["e*Gold in Euro", "Euro in e*Gold"]
UMRECHNUNG_EURO_GOLD = 110

class Application(tk.Tk):
    def __init__(self, **kwargs):
        tk.Tk.__init__(self, **kwargs)
        gui.init_app(self)
        self.button.configure(command=self.button_action)
        self.option = tk.StringVar(self)
        self.option.set(OPTIONS[0])
        optionen = tk.OptionMenu(self, self.option, *OPTIONS)
        optionen.grid(row = 2, column = 0, columnspan = 3, pady = 20)

    def button_action(self):
        betrag = float(self.entry_3.get())
        wahl = self.option.get()
        if wahl == OPTIONS[0]:
            betrag /= UMRECHNUNG_EURO_GOLD
            einheit= "e*Gold"
        elif wahl == OPTIONS[1]:
            betrag *= UMRECHNUNG_EURO_GOLD
            einheit = "Euro"
        message = "{:.2f} {}".format(betrag, einheit)
        self.label_3.configure(text=message)

if __name__ == '__main__':
    Application().mainloop()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@PythonTT: Deine GUI ist eh viel zu kompliziert und dadurch benutzerunfreudlich. Warum soll der Benutzer zuerst eine Umrechnungsart auswählen und wie weiß er, dass dazu ein Option Menü da ist und er da umständlich auswählen muss. Und warum muss er nach seiner Eingabe nochmals einen OK Button drücken?

Mach einfach zwei Eingabelder und wenn er da die Enter Taste drückt. Dann gibst das auch im anderen Eingabeld aus:

Code: Alles auswählen

# -*- coding: utf-8 -*-

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

# === general grid table definition =================
def grid_general_rows(container,rows,**kwargs):
    for row in range(rows):
        container.rowconfigure(row,**kwargs)

def grid_general_cols(container,columns,**kwargs):
    for column in range(columns):
        container.columnconfigure(column,**kwargs)


class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        # general grid definition ==============================
        grid_general_rows(self,6, minsize = 0, pad = 20, weight = 1)
        grid_general_cols(self,4, minsize = 10, pad = 14, weight = 1)
        # widget definitions ===================================
        self.egold = tk.Label(self,text='e*Gold:', font='Helvetica 16')
        self.egold.grid(sticky='e', column=1, padx=10, row=4)
        self.egold_eingabe = tk.Entry(self,bd=5)
        self.egold_eingabe.grid(column=2, row=4)
        self.euro = tk.Label(self,text='Euro:', font='Helvetica 16')
        self.euro.grid(sticky='e', column=1, padx=10, row=3)
        self.euro_eingabe = tk.Entry(self,bd=5)
        self.euro_eingabe.grid(column=2, row=3)
        self.titel = tk.Label(self,text='e*Gold - Euro Rechner', font='Helvetica 20 underline')
        self.titel.grid(column=1, columnspan=2, row=1)

if __name__ == '__main__':
    Application().mainloop()
Antworten