Variable aus class holen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
LavaDo
User
Beiträge: 5
Registriert: Freitag 6. Oktober 2017, 08:19

Hallo zusammen.

Ich bin neu in der Welt der Programmierer und muss für meine Ausbildung einen Versuch programmieren.
Mein Plan ist es, wenn das Programm startet ein GUI zu öffnen in das man seine Werte eingeben kann und dann per Button die Simulation startet.
Das ganze läuft über VPython und ich benutze die wx Lib.

Code: Alles auswählen

import wx

class Abfrage(wx.Frame):

    def __init__(self,parent):

        wx.Frame.__init__(self, parent, size=(480,350))
        panel = wx.Panel(self)

        self.info0 = wx.StaticText(self, label=("In diesem Fenster kannst du deine Werte eingeben,"),pos=(10,10))
        self.info1 = wx.StaticText(self, label=("mit denen die Stokesimulation laufen soll. Dabei ist zu beachten,"),pos=(10,30))
        self.info2 = wx.StaticText(self, label=("dass die Zahlen mit einem Punkt anstelle eines Kommas eingegeben werden."),pos=(10,50))
        self.info1 = wx.StaticText(self, label=("Wird dies nicht eingehalten, so kann die Simulation nicht beginnen."),pos=(10,70))
        self.Text = wx.StaticText(self, label=("Bitte gib deine Werte hier ein:"), pos=(10,100))
        self.Aktuell = wx.StaticText(self, label=("Eingegebene Werte:"),pos=(270,110))
        self.nF = wx.StaticText(self, label=("dynamische Viskosität:"), pos=(10,130))
        self.mK = wx.StaticText(self, label=("Masse Kugel:"), pos=(10,160))
        self.dK = wx.StaticText(self, label=("Durchmesser Kugel:"), pos=(10,190))
        self.pF = wx.StaticText(self, label=("Dichte Flüssigkeit:"), pos=(10,220))
        self.v0 = wx.StaticText(self, label=("Anfangsgeschwindigkeit:"), pos=(10,250))
        self.y0 = wx.StaticText(self, label=("Anfangshöhe:"), pos=(10,280))

        self.txtnF = wx.TextCtrl(self,value=(""),pos=(160,128),size=(100,20))
        self.txtmK = wx.TextCtrl(self,value=(""),pos=(160,158),size=(100,20))
        self.txtdK = wx.TextCtrl(self,value=(""),pos=(160,188),size=(100,20))
        self.txtpF = wx.TextCtrl(self,value=(""),pos=(160,218),size=(100,20))
        self.txtv0 = wx.TextCtrl(self,value=(""),pos=(160,248),size=(100,20))
        self.txty0 = wx.TextCtrl(self,value=(""),pos=(160,278),size=(100,20))

        self.aknF = wx.StaticText (self,label="0.0",pos=(270,128))
        self.akmK = wx.StaticText (self,label="0.0",pos=(270,158))
        self.akdK = wx.StaticText (self,label="0.0",pos=(270,188))
        self.akpF = wx.StaticText (self,label="0.0",pos=(270,218))
        self.akv0 = wx.StaticText (self,label="0.0",pos=(270,248))
        self.aky0 = wx.StaticText (self,label="0.0",pos=(270,278))

        self.akButton = wx.Button (self,wx.ID_ANY,label=("Überprüfen"), pos=(380,193), size=(80,30))
        self.akButton.Bind (wx.EVT_BUTTON,self.Aktualiseren)
        self.uebButton = wx.Button (self,wx.ID_ANY,label=("Übernehmen"), pos=(380,233), size=(80,30))
        self.okButton = wx.Button (self,wx.ID_ANY,label=("Starten"), pos=(380,273), size=(80,30))
        self.okButton.Bind (wx.EVT_BUTTON,self.Schliessen)
        
        self.Show()

        
    def Aktualiseren(self, evt):    

        ##################################################
        try:
            if float(self.txtnF.GetValue())== True:
                self.aknF.SetLabel ("1.0")
            else:
                self.aknF.SetLabel (self.txtnF.GetValue())
        except:

            self.aknF.SetLabel ("Keine Zahl")
        ##################################################
        try:
            if float(self.txtmK.GetValue())== True:
                self.akmK.SetLabel ("1.0")
            else:
                self.akmK.SetLabel (self.txtmK.GetValue())
        except:

            self.akmK.SetLabel ("Keine Zahl")
        ##################################################
        try:
            if float(self.txtdK.GetValue())== True:
                self.akdK.SetLabel ("1.0")
            else:
                self.akdK.SetLabel (self.txtdK.GetValue())
        except:

            self.akdK.SetLabel ("Keine Zahl")
        ##################################################      
        try:
            if float(self.txtpF.GetValue())== True:
                self.akpF.SetLabel ("1.0")
            else:
                self.akpF.SetLabel (self.txtpF.GetValue())
        except:

            self.akpF.SetLabel ("Keine Zahl")
        ##################################################
        try:
            if float(self.txtv0.GetValue())== True:
                self.akv0.SetLabel ("1.0")
            else:
                self.akv0.SetLabel (self.txtv0.GetValue())
        except:

            self.akv0.SetLabel ("Keine Zahl")
        ##################################################
        try:
            if float(self.txty0.GetValue())== True:
                self.aky0.SetLabel ("1.0")
            else:
                self.aky0.SetLabel (self.txty0.GetValue())
        except:

            self.aky0.SetLabel ("Keine Zahl")
        ##################################################


    def Schliessen(self, evt):

        self.Close(True)
   
app = wx.App(False)
Abfrage(None)
app.MainLoop()
Jetzt möchte ich dass der Code der darauf folgt Werte es der GUI bekommt die ich hier reingestellt habe.

Als Beispiel: Der Text bzw. die Zahl in self.txtnF soll als Wert für die Variable nF gespeichert werden.


Außerdem gehe ich davon aus, dass die Funtion "Aktualisieren" um einiges einfacher geschrieben werden kann. Jedoch weiß ich noch nicht genau wie ich das mache.

Vielen Dank schonmal. :D
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@LavaDo: warum hast Du um die meisten lateralen Strings Klammern gesetzt? Die sind unnötig. Alle `StaticText` müssen nicht an Attribute gebunden werden, weil Du nie wieder darauf zugreifen mußt. Du solltest Dir angewöhnen, sprechendere Namen zu verwenden. Klar, in Formeln werden oft einbuchstabige Variablen mit Subskripte genommen, beim Programmieren ist das aber anders. mK ist weniger gut lesbar als masse_kugel und was das Präfix ak bedeuten soll, weißt Du wahrscheinlich in einer Woche selbst nicht mehr.

In Aktualiseren ist ein Schreibfehler und nach Konvention sollten Funktionen klein geschrieben werden. Du hast 6 mal den selben Code mit kleinen Änderungen kopiert, das bedeutet, Du muß die Fehler die Du in den 8 Zeilen gemacht hast, an jeweils 6 Stellen korrigieren. Um soetwas zu vermeiden, schreibt man eine Funktion, die 6 mal mit den Parametern, die den Unterschied der Kopien ausmacht, aufgerufen wird, bei Dir also:

Code: Alles auswählen

aktualisiere_label(self.txtnF, self.akNf)
Was denkst Du, wann die Umwandlung eines Strings in eine Zahl den Wert True ergibt? Logisch gesehen nie, in Python, wenn der String "1.0" war. Das ist dann aber kein Sonderfall, den man per if abprüfen müßte. Nackte `except`s sollst Du niemals nie verwenden, die Fangen dir nämlich jeden Fehler ein, auch wenn eine Variable falsch geschrieben wurde, oder ein Attribut nicht existiert, was aber Programmierfehler sind, die Du durch das except aber nicht finden kannst. Exceptions sollten immer so konkret wie möglich abgefangen werden, hier also nur der ValueError, falls der eingegebene Text keine Zahl ist.

Code: Alles auswählen

def aktualisiere_label(textctrl, label):
    try:
        value = float(textctrl.GetValue())
    except ValueError:
        label.SetLabel("Keine Zahl")
    else:
        label.SetLabel(str(value))
Zeile 108: es ist seltsam, dass `Abfrage` an keine Variable gebunden wird, so sieht es aus, als ob es gar nicht gebraucht wird.

Zu Deiner eigentlichen Frage: Du weißt, wie man Variablen Werte zuweist, und wie man aus einem Textfeld eine Zahl macht. Wo kommst Du dabei nicht weiter?
LavaDo
User
Beiträge: 5
Registriert: Freitag 6. Oktober 2017, 08:19

Sirius3 hat geschrieben: Zu Deiner eigentlichen Frage: Du weißt, wie man Variablen Werte zuweist, und wie man aus einem Textfeld eine Zahl macht. Wo kommst Du dabei nicht weiter?
Vielen Dank für die Antwort.

Mein Problem liegt jetzt dabei dass ich die Zahlen die ich mit dieser GUI in das Label dazu packe später brauche.
Also ich wollte mit diesem GUI eine Abfrage starten und mit der Eingaben dann im späteren Programm die Werte laufen lassen.

Beispiel:
Ich frage ab:
Masse der Kugel
Und Durchmesser der Kugel

Aus diesen Zwei Werten muss ich dann das Volumen der Kugel und die Dichte ausrechnen.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@LavaDo: Du hast 3 Knöpfe, "Überprüfen", "Übernehmen" und "Starten". Bei Starten wird das Fenster geschlossen und MainLoop verlassen. Das ist für GUI-Programme ungewöhnlich. Normalerweise gibt es bei solchen Programmen ein großes Feld, wo Ergebnisse dargestellt werden, rechts oder unten einen Streifen, wo man seine Parameter eingeben kann und einen Knopf "Starten". Beim Drücken werden erst die eingegebenen Werte überprüft und bei Fehlern eine Meldung angezeigt. Sonst wird mit der Rechnung gestartet, eventuell gibt es einen Fortschrittsbalken und wenn die Rechnung fertig ist, wird im großen Feld das Ergebnis dargestellt.
LavaDo
User
Beiträge: 5
Registriert: Freitag 6. Oktober 2017, 08:19

@Sirius3
Ich würde ja gerne machen, dass sich dann ein neues Fenster öffnet in dem ich quasi den Versuch simuliere.
Das erste Fenster ist nur dafür da um die Werte abzufragen.

Soll ich dir den kompletten Code reinstellen damit du auch das folgende Programm siehst?
Antworten