kleines Rechenprogramm

Fragen zu Tkinter.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

yipyip hat geschrieben:Hallo mathi,
ich weiss, dass dieses Thema ein harter Brocken ist,...

Deshalb war ich auch so wagemutig, Dir
mein Verständnis vom sogenannten "Model View Controller Pattern"
zu zeigen, in der Hoffnung, dass Du (nach einiger Zeit)
etwas damit anfangen kannst.
yipyip
Hallo yipyip, auf dein Programm spielte ich an, es wird eine Weile dauern bis ich da durch steige. Vielen Dank für erklärung, damit bringst Du dämmerung ins Schwarz :-)
kaytec hat geschrieben:Hallo mathi !

Evt. hilft dir das:
Hallo kaytec, ich bin begeistert :D :shock: :lol: , das ist die Funktionalität, die ich mir vorgestellt habe.

@all:
Mensch, ich muß schon sagen, solch eine Gemeinschaft ist wirklich genial.
Die nächste Zeit habe ich sicher einiges vor mir .... und freue mich drauf.
abgdf

@yipyip
"Model View Controller Pattern"
Hey, danke dafür!
Hab' schon lange einen Weg gesucht, GUI und "Engine" sauber zu trennen. So könnte auch das endlich klappen!

Viele Grüße
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

abgdf hat geschrieben:Hab' schon lange einen Weg gesucht, GUI und "Engine" sauber zu trennen. So könnte auch das endlich klappen!
pygtkmvc könnte für dich dann interessant sein; wenn ich Lunars Talk richtig in Erinnerung habe, bietet Qt da auch etwas von Haus aus an.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo mathi !

Ich bin froh, wenn ich dir helfen konnte. Diese fachlichen Diskussionen sind sehr hilfreich, doch oft verstehe ich nur einen Bruchteil davon.

wer, wie, was - wer nicht postet der bleibt dumm :lol:.

gruss frank
abgdf

Hallo mathi,

ich hab' Deinen eigenen Code von oben nochmal so umgeformt, daß er objektorientiert und Tkinter-mäßig etwas mehr Sinn ergibt. Ist für Dich zum Vergleichen und Lernen, die Programmfunktion ist nicht implementiert (wie in Deinem Code ja auch nicht). Das hatte kaytec ja auch schon gemacht.

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import Tkinter
import Tkconstants 

class Main:
      
    def __init__(self):

        self.root = Tkinter.Tk()
        self.root.title("Bemessung")

        self.menuobj = Tkinter.Menu(self.root)
        self.root.config(menu = self.menuobj)
        self.progmenu = Tkinter.Menu(self.menuobj)

        self.menuobj.add_cascade(label = "Programm", menu = self.progmenu)
        self.progmenu.add_command(label = "Interpolation", command = self.interpolation)
        self.progmenu.add_separator()

        self.textfenster = Tkinter.Text(self.root)
        self.textfenster.pack()

        self.labeltext = Tkinter.Label(self.root, text = "Programmhinweise")
        self.labeltext.pack()

        self.lab=Tkinter.Label(self.root, text = '   ')
        self.lab.pack(side = Tkconstants.LEFT)
       
        self.eingabe = Tkinter.Entry(self.root, width = 60)
        self.eingabe.pack(side = Tkconstants.LEFT)
        self.eingabe.bind("<Return>", self.Ok)
        self.eingabe.focus()

        self.but = Tkinter.Button(self.root,
                                  text = "Ok",
                                  command = self.Ok)
        self.but.pack(side = Tkconstants.LEFT)     

        self.root.mainloop()

    def Ok(self, *events):

        xGet = self.eingabe.get()
        self.textfenster.insert(Tkconstants.END, xGet)
 
    def interpolation(self):

        self.textfenster.insert(Tkconstants.END, "\ngegeben: x | gesucht: y ")
        self.eingabe.focus()
        self.labeltext.config(text = "Gib den Wert ein")
        self.lab.config(text = "Wert X1 mit X1 < x: ")

myapp = Main()
HTH

@Leonidas: Auch Dir danke für den Link!

Viele Grüße
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

@ abgdf
Vielen Dank :D

@kaytec

ich habe auf der Grundlage Deines Codes mal versucht, einfach mal meine "Iteration" auszuprobieren:

Code: Alles auswählen

class Interpolation(object):
    
        
    def __init__(self):
        self.variablen = {"X1" : 0, "X2" : 0,"Y1" : 0, "Y2" : 0,"x" : 0}
        
    def __iter__(self):
        return iter(self.variablen.items())
        
    def __len__(self):
        return len(self.variablen)
        
    def set_variablen(self, key, value):
        self.variablen[key] = value
        
    def evaluate(self):
        x=self.variablen["x"]
        Y2=self.variablen["Y2"]
        X1=self.variablen["X1"]
        Y1=self.variablen["Y1"]
        X2=self.variablen["X2"]
        
        y=(x-X1)*(Y2-Y1)/(X2-X1)+Y1
        return y
bis auf eine ungeordnete Abfrage der einzelnen Variablen funktioniert es zumindest erst einmal.

jetzt meine Fragen:
1.) warum würfelt __iter__ alles durcheinander?:

Code: Alles auswählen

IDLE 2.6      
>>> variablen = {"X1" : 0, "X2" : 0,"Y1" : 0, "Y2" : 0,"x" : 0}
>>> variablen.items()
[('X2', 0), ('Y1', 0), ('X1', 0), ('x', 0), ('Y2', 0)]
>>> 
2.) an welcher Stelle werden __iter__ und __len__ verarbeitet?
dort werden zwar Werte zurückgegeben: len(self.variablen) ergibt 5
aber ich verstehe nicht wo die Werte gebraucht werden, da sie keiner variablen oder Funktion zugeordnet scheinen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mathi hat geschrieben:1.) warum würfelt __iter__ alles durcheinander?:
Weil ``self.variablen.items()`` die Items ungeordnet ausgibt, weil ``self.variablen`` ein Dict ist und dies per Definition ungeordnet ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo mathi

Antwort zu deiner 2. Frage. So wie ich es gecheckt habe:

Code: Alles auswählen

# Skriptname kleines_rechenprogramm_01_01.py (wuf)

class Interpolation(object):


    def __init__(self):
        self.variablen = {"X1" : 0, "X2" : 0,"Y1" : 0, "Y2" : 0,"x" : 0}

    def __iter__(self):
        return iter(self.variablen.items())

    def __len__(self):
        return len(self.variablen)

    def set_variablen(self, key, value):
        self.variablen[key] = value

    def evaluate(self):
        x=self.variablen["x"]
        Y2=self.variablen["Y2"]
        X1=self.variablen["X1"]
        Y1=self.variablen["Y1"]
        X2=self.variablen["X2"]

        y=(x-X1)*(Y2-Y1)/(X2-X1)+Y1
        return y

#`~~ Instanz der Klasse Interpolation
interpolation = Interpolation()

print
print "Instanz =", interpolation
print

#~~ 1. Variante: Iteration ueber das Klassen-Attribut 'variablen'
for variable in interpolation.variablen.iteritems():
    print "1.", variable
print

#~~ 2. Variante: Iteration ueber das Klassen-Attribut 'variablen'
#      Die def __iter__ befaehigt, dass die Instanz 'interpolation'
#      der Klasse 'Interpolation' iterierbar wird
for variable in interpolation:
    print "2.",variable
print

#~~ 1. Variante: Ermittlung der Anzahl Elemente im Attribut 'variablen'
#
print "1. Anzahl Elemente im Dictionary 'variable'", len(interpolation.variablen)
print

#~~ 2. Variante: Ermittlung der Anzahl Elemente im Attribut 'variablen'
#      Die def __len__ ermoeglicht es die Instanz 'interpolation' der
#      Klasse direkt auf die Anzahl Elemente im Attribut (Dictionary)
#      'variablen' zu ermitteln
print "2. Anzahl Elemente im Dictionary 'variable'", len(interpolation)
print
Näheres siehe Kommentar im Code-Snippet.

Gruss wuf :wink:
Zuletzt geändert von wuf am Donnerstag 30. Oktober 2008, 00:31, insgesamt 1-mal geändert.
Take it easy Mates!
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo mathi !

Versuche mal das:

Code: Alles auswählen

for variablen in sorted(self.operation):
            self.variablen.append(variablen[0])
gruss frank
Konrad Wenzel
User
Beiträge: 15
Registriert: Freitag 3. Oktober 2008, 17:19

Die Standardfunktion eval() würde ich in Verbindung mit tk.Entry() verwenden,
<kann z.B. x*x +2*x direkt auswerten> um den Dialog zu straffen
-- wn --
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Konrad Wenzel hat geschrieben:Die Standardfunktion eval() würde ich in Verbindung mit tk.Entry() verwenden,
<kann z.B. x*x +2*x direkt auswerten> um den Dialog zu straffen
Wenn man der alleinige Anwender ist und weiß, was man tut: Ja.
Ansonsten sollte man eval() eher mit Vorsicht genießen, weil dadurch ggf. auch nicht gewollter Python-Code ausgeführt wird.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

BlackJack hat geschrieben:Die Numpad-Eingabe und Anzeige aller Eingabefelder schliessen sich ja nicht gegenseitig aus. Du kannst die Eingabetaste ja an die `Entry`-Exemplare binden und mit "gehe zum nächsten `Entry`" belegen.

Wenn da 16 einzelne Berechnungsprogramme unter einer GUI zusammen gefasst werden sollen, spricht das übrigens auch für OOP.
Hallo, ich habe mich entschlossen Deinem Rat zu folgen und genau das zu tun.

Habe mich die letzten Tage mit der erstellung der Masken beschäftigt.
Da ich mit wxPython arbeiten möchte, denke ich ein neuer Thread im entspr. Forum wäre angebracht.

http://www.python-forum.de/viewtopic.ph ... 115067[url]
[/url]
Antworten