TKInter hilfe mein Programm funktioniert nich :(

Fragen zu Tkinter.
Antworten
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@wuf
Sagtest du nicht, du brauchst die RadioButtons nicht wirklich :mrgreen:

Andere Fehler wären zB.
- ein Tk-Toplevel in dem FlächenRechner zu erzeugen und diesen nicht als Frame zu implementieren. (So kann mann ihn nur für diese eine Anwendung nutzen)
- self.v.set(0) - bringt gar nicht, du musst schon "self.v.set(self.radio_button_data[0][0])" oder "self.v.set('One') nutzen. (dem entsprechend solltest du auch über das gesetzte self.v.set('Two') nach denken)
- in "calculate" ist es ziemlich unsinnig das Ergebnis immer wieder mit ".get()" zu holen, da jedes dieser gets eine Tk-interaktion ist und somit ein etwas teurer Zugriff, ich würde hier auch ein Wörterbuch nehmen
- In den Berechnungs-Methoden kannst du auch gleich das Ergebnis zurückgeben brauchst die Variable nicht
- Zudem würde ich die Methoden als normale Funktionen schreiben, da diese allgemein gültig sind und die Parameter entsprechen übergeben
- und natürlich eine richtige "if __name__ == '__main__':" ein bauen
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

@Xynon1 Besten Dank für deine Anregungen.

Gruß wuf :wink:
Take it easy Mates!
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Eventuell kannst du dir noch mal die ganzen "pack()"-Aufrufe ansehen und dort einen gemeinsamen Nenner finden und diesen als Standard in einem Wörterbuch definieren.

Code: Alles auswählen

frame_style = dict(side='top', fill='both', expand='no', padx=10,  pady=10)
label_style = dict(side='top', fill='x', padx=5, pady=5)

self.frame_entry_a.pack(frame_style)
self.label_remark_a.pack(label_style)
self.frame_entry_b.pack(frame_style)
self.label_remark_b.pack(label_style)
self.frame_result.pack(frame_style)

#und wenn es doch mal leicht abweicht
self.label_remark_x.pack(label_style, side="left")
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Xynon1

Nach einfliessen lassen deiner interessanten und hilfreichen Anregungen entstand ein nächster Wurf des 'Flächenrechner':

Code: Alles auswählen

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

import Tkinter as tk
from math import *

NAME = 'Flächenrechner'
FONT_NAME = ('Arial' ,20)
LABEL_AUSWAHL = 'Wovon möchten Sie die Fläche berechnet haben?'

LABEL_EINGABE_A = 'Eingabe-A:'
REMARK_ENTRY_A =\
'''Geben Sie hier ein :
    Bei Rechteck, Parallelogramm, Quadrat und Dreieck die Unterkante
    und für den Kreis den Radius.'''
    
LABEL_EINGABE_B = 'Eingabe-B:'
REMARK_ENTRY_B =\
'''Geben Sie hier ein :
    Bei Rechteck die Seitenkante, bei Dreieck
    und Parallelogramm die Höhe.'''
BUTTON_NAME = 'Berechnen'
LABEL_RESULT = 'Berechnungs-Ergebnis'

class FlaechenRechner(tk.Frame):
    
    def __init__(self, app, calc_nr, **keys):
     
        tk.Frame.__init__(self, app, **keys)
        
        label_frm_prop = dict(relief='groove', bd=2, bg=self['bg'],
            pady=5)
        label_frm_style = dict(side='top', fill='both', expand='no',
            padx=10, pady=10)
            
        label_rem_prop = dict(bg=self['bg'], justify='left',
            anchor='nw', fg='brown')
        label_rem_style = dict(side='top', fill='x', padx=5, pady=5)
        
        entry_prop = dict(width=20, bg='white', bd=1, highlightthickness=0)
        entry_style = dict(side='top', anchor='center', padx=5, pady=5)
        
        # Titel
        self.name = tk.Label(self,
            text=NAME+'-'+str(calc_nr), font=FONT_NAME, fg='green', bg='gray40',
            bd=4, padx=10, highlightthickness=0, relief='raised')
        self.name.pack(side='top', pady=10)
      
        self.label_auswahl = tk.Label(None, text=LABEL_AUSWAHL,
            fg='blue', bg=self['bg'])
        self.label_auswahl.pack()

        self.umrandung = tk.LabelFrame(self, label_frm_prop,
            labelwidget=self.label_auswahl)
        self.umrandung.pack(label_frm_style)

        self.v = tk.StringVar()

        self.radio_button_data = [
            ['One', 'Dreieck'],
            ['Two', 'Quadrat'],
            ['Three', 'Rechteck'],
            ['Four', 'Kreis'],
            ['Five', 'Parallelogramm']
            ]
            
        # Erstelle alle Auswahl-Radiobuttons
        self.radio_buttons = list()
        for value, text in self.radio_button_data:
            radio_button = tk.Radiobutton(self.umrandung, value=value,
                text=text,variable=self.v)
            radio_button.pack(side='top', anchor='nw', padx=10)
            self.radio_buttons.append(radio_button)
            
        # Eingabe-A
        self.label_entry_a = tk.Label(None, text=LABEL_EINGABE_A, fg='blue',
            bg=self['bg'])
        self.label_entry_a.pack()

        self.frame_entry_a = tk.LabelFrame(self, label_frm_prop,
            labelwidget=self.label_entry_a)
        self.frame_entry_a.pack(label_frm_style)

        self.label_remark_a = tk.Label(self.frame_entry_a, label_rem_prop,
            text=REMARK_ENTRY_A)
        self.label_remark_a.pack(label_rem_style)
        
        self.entry_a = tk.Entry(self.frame_entry_a, entry_prop)
        self.entry_a.pack(entry_style)
        self.entry_a.insert(0, 0.0)
        
        # Eingabe-B
        self.label_entry_b = tk.Label(None, text=LABEL_EINGABE_B, fg='blue',
            bg=self['bg'])
        self.label_entry_b.pack()

        self.frame_entry_b = tk.LabelFrame(self, label_frm_prop,
            labelwidget=self.label_entry_b)
        self.frame_entry_b.pack(label_frm_style)

        self.label_remark_b = tk.Label(self.frame_entry_b, label_rem_prop,
            text=REMARK_ENTRY_B)
        self.label_remark_b.pack(label_rem_style)
        
        self.entry_b = tk.Entry(self.frame_entry_b, entry_prop)
        self.entry_b.pack(entry_style)
        self.entry_b.insert(0, 0.0)
        
        # Ergebnis
        self.label_result_frame = tk.Label(None, text=LABEL_RESULT, fg='blue',
            bg=self['bg'])
        self.label_result_frame.pack()

        self.frame_result = tk.LabelFrame(self, relief='groove', bd=2,
            bg=self['bg'], labelwidget=self.label_result_frame, pady=5)
        self.frame_result.pack(side='top', fill='both', expand='no', padx=10,
            pady=10)

        self.result = tk.StringVar()
        self.result.set(0.0)
        
        self.label_result = tk.Label(self.frame_result, highlightthickness=0,
            bd=1, relief='sunken', bg='white',textvariable=self.result,
            width=20)
        self.label_result.pack(side='top', pady=5)

        # Befehl: Berechnen
        self.button_calculate = tk.Button(self, text=BUTTON_NAME,
            command = self.calculate)
        self.button_calculate.pack(side='top', pady=5)

        # Setze den Radiobutton für die Quadratberechnung
        self.v.set('Two')
 
    def calculate(self):
 #       self.v.get()
        if self.v.get() =="One":
            ergebnis = self.dreiecksberechnung()
        if self.v.get() == "Two":
            ergebnis = self.quadratsberechnung()
        if self.v.get() == "Three":
            ergebnis = self.rechtecksberechnung()
        if self.v.get() == "Four":
            ergebnis = self.kreisberechnung()
        else:
            ergebnis = self.parallelogrammberechnung()
           
        self.result.set(ergebnis)
        
    def dreiecksberechnung(self):
        print 1
        d = float(self.entry_a.get() )* float(self.entry_a.get()) * 0.5
        return d

    def quadratsberechnung(self):
        print 2
        q = float(self.entry_a.get()) * float(self.entry_a.get())
        return q

    def rechtecksberechnung(self):
        print 3
        r = float(self.entry_a.get()) * float(self.entry_b.get())
        return r

    def kreisberechnung(self):
        print 4
        k = 3.14 * float(self.entry_a.get()) * float(self.entry_a.get())
        return k

    def parallelogrammberechnung(self):
        print 5
        p = float(self.entry_a.get()) * float(self.entry_b.get())
        return p

if __name__ == '__main__':
 
    app = tk.Tk()
    app.title('Flächenrechner-Plattform')
      
    rechner_1 = FlaechenRechner(app, 1)
    rechner_1.pack(side='left')
    
    rechner_2 = FlaechenRechner(app, 2)
    rechner_2.pack(side='left')

    
    app.mainloop()
BEMERKUNG: Habe die mathematische Umgebung belassen wie sie ist.

Besten Dank! Gruß wuf :wink:
Take it easy Mates!
domaniel
User
Beiträge: 4
Registriert: Mittwoch 4. Mai 2011, 12:15

boah danke leute ihr seit meine rettung

vielen vielen dank (: nochmal
Antworten