Drop-Down Box Zahlen Fehler

Fragen zu Tkinter.
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hallo liebes Forum,

wie schaffe ich es denn in Python aus einem Drop-Down Menü Zahlen herauszubekommen?
Ich habe folgendes definiert:

Code: Alles auswählen

sar = IntVar(master)
sar.set("Auswählen")

profil = OptionMenu(master, sar, "2412", "2415", "2418", "4408", "4412", "4415", "4418")
profil.config(justify= RIGHT, anchor= N, padx=20, pady=10, font=("Arial",15))
profil.place(x=30,y=40)

profi=int(sar)
Nun will ich die vom Benutzer in der grafischen Oberfläche gewählten 4 Zahlenkombinationen als "profi" haben. Und natürlich als Integer zum weiterrechnen!

Dazu soll ich als zweiten Schritt (oder gleich als ersten, wenn es geht), die erste Zahl separieren, die Zweite separieren und die dritte/vierte zusammen separieren! Also bei 2412 z.B. 2 - 4 -12!

Ihr würdet mir damit sehr helfen!! :-)

Grüße, HTLEisenstadt
Zuletzt geändert von Anonymous am Dienstag 2. April 2013, 00:19, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@HTLEisenstadt: Tk kennt als Datentyp eigentlich nur Zeichenketten, darum ist das auch der Datentyp der bei der Python-Anbingung genutzt wird.

Da Du aus der Ziffernfolge Zahlen haben möchtest die aus einzelnen Ziffern bestehen, ist eine Zeichenkette ja gar nicht so schlecht, denn da kann man mit Index- beziehungsweise „slice”-Zugriff bequem auf die Ziffern zugreifen bevor man sie in Zahlen umwandelt.

Also ist `IntVar` der falsche Typ. Und `sar` kann man weder in eine Zahl, noch in eine Zeichenkette umwandeln. Letzteres geht zwar, aber damit bekommt man eine Zeichenkettendarstellung des Objekts und nicht den Wert der darin gespeichert ist. Den muss man mit der entsprechenden Methode abfragen.

Beim setzen des Wertes am Anfang stellt sich übrigens auch die Frage was Du bei einem `IntVar` erwartest wenn Du den Wert "Auswählen" setzt. Das ist weder eine ganze Zahl noch eine Zeichenkettendarstellung einer solchen.

Von der `place()`-Methode solltest Du Abstand nehmen. Damit kann man keine GUIs schreiben, die sich unter verschiedenen Anzeigebedingungen sinvoll verhalten. Das sieht in der Regel nur auf dem Rechner auf dem es geschrieben und getestet wurde ordentlich aus, beziehungsweise bei solchen mit sehr ählichen Rahmenbedingungen was Einstellungen und Hardware angeht.
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hallo BlackJack,

danke für deine Antwort...

Aber wie ist es dann möglich Zahlen da raus zu bekommen? Was soll ich verwenden?

Grüße HTLEisenstadt
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi HTLEisenstadt

Liefert das folgende skript was du erwartest?:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

try:
    #~~ For Python 2.x
    import Tkinter as tk
except ImportError:
    #~~ For Python 3.x
    import tkinter as tk

def get_profile():
    
    profile_sel = sar.get()
    profile_part_1 = int(profile_sel[0])
    profile_part_2 = int(profile_sel[1])
    profile_part_3 = int(profile_sel[2:])
    
    print(profile_part_1, profile_part_2, profile_part_3)
    
PROFILE = "2412", "2415", "2418", "4408", "4412", "4415", "4418"
app_win = tk.Tk()

sar = tk.StringVar()
sar.set("Auswählen")

profil = tk.OptionMenu(app_win, sar, "2412", "2415", "2418", "4408", "4412", "4415", "4418")
profil.config(justify= 'right', anchor= 'n', padx=20, pady=10, font=("Arial",15))
profil.pack()

button = tk.Button(app_win, text="Zeige Profil", command=get_profile)
button.pack(pady=2)

app_win.mainloop()
Gruß wuf :wink:
Take it easy Mates!
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hallo wuf,

danke dir, jetzt bin ich einen Schritt weiter, das meinte ich! :-)

Code: Alles auswählen

sar = tk.StringVar()
sar.set("Auswählen")

profil = tk.OptionMenu(app_win, sar, "2412", "2415", "2418", "4408", "4412", "4415", "4418")
profil.config(justify= RIGHT, anchor= N, padx=20, pady=10, font=("Arial",15))
profil.place(x=30,y=40)
Aber jetzt stehe ich vor folgendem Problem:

Also ich habe mal die Zahlen gesplittet, dh., wenn ich als Test printe, gibt er mir die Zahlen auch richtig aus!

Code: Alles auswählen

def get_zahl1():
    zahl1_sel = sar.get()
    zahl1 = int(zahl1_sel[0])
    print (zahl1)


def get_zahl2():
    zahl2 = int(sar.get()[1])
    print (zahl2)


def get_zahl3():
    zahl3 = int(sar.get()[2:])
    print (zahl3)
Das Printe ich dann:

Code: Alles auswählen

def ok():
    print "Profil:", (get_zahl1(), get_zahl2(), get_zahl3())
Alles Klar, es erscheinen die gewünschten Zahlen, die in der grafischen Oberfläche ausgewählt wurden, nur:

Jetzt will ich diese weitergeben in eine Rechnung:

Code: Alles auswählen

stelle1 = get_zahl1()
stelle2 = get_zahl2()
stelle3 = get_zahl3()


Doch es kommt folgende Fehlermeldung:

Traceback (most recent call last):
File "C:\Users\xxxxxxxxxxxx\Desktop\profilumstroemung_GH_02.py", line 315, in <module>
stelle1 = get_zahl1() #float(input("Profilwölbung in %: "))
File "C:\Users\xxxxxxxxxxx\Desktop\profilumstroemung_GH_02.py", line 25, in get_zahl1
zahl1 = int(zahl1_sel[0])
ValueError: invalid literal for int() with base 10: 'A'
>>>

Warum nimmt er mir dann auf einmal das "A" von "Auswählen"???? und nicht mehr die Zahl?

Grüße HTLEisenstadt
BlackJack

@HTLEisenstadt: Weil zu dem Zeitunkt wo Du die `stelle*`-Namen definierst, der Benutzer anscheinend noch keinen Eintrag ausgewählt hat.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi HTLEisenstadt

Es ist so wie BlackJack angedeutet hat. Das OptionMenu ist ein DropDownMenu. Also zuerst den MenuButton 'Auswählen' betätigen und dein gewünschtes Profil aus der DropDownListe auswählen. Dann solte das Wort 'Auswählen' im auf dem OptionMenuButton durch die ausgewählte Profil-Nr. ersetzt werden. Dann den Button 'Zeige Profil' aktivieren. Nun sollte die gesplittete Profil-Nr. auf deine Konsole ausgegeben werden. OK.

Hier das zusammengeflickte Skript ohne jede Optimierung und Kosmetik auf deine Vorgaben abgestimmt für den nächsten Versuch:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

try:
    #~~ For Python 2.x
    import Tkinter as tk
except ImportError:
    #~~ For Python 3.x
    import tkinter as tk

CHOICE = "Auswaehlen"

def get_zahl1():
    #zahl1_sel = sar.get()
    #zahl1 = int(zahl1_sel[0])
    #print (zahl1)
    return int(sar.get()[0])

def get_zahl2():
    #zahl2 = int(sar.get()[1])
    #print (zahl2)
    return int(sar.get()[1])

def get_zahl3():
    #zahl3 = int(sar.get()[2:])
    #print (zahl3)
    return int(sar.get()[2:])

def ok():
    
    if sar.get() == CHOICE:
        print("Bitte zuerst ein Profil auswaehlen!")
        return
    
    stelle1 = get_zahl1()
    stelle2 = get_zahl2()
    stelle3 = get_zahl3()

    print("Profil:", stelle1, stelle2, stelle3)
        
#def get_profile():
    
    #profile_sel = sar.get()
    #profile_part_1 = int(profile_sel[0])
    #profile_part_2 = int(profile_sel[1])
    #profile_part_3 = int(profile_sel[2:])
    
    #print(profile_part_1, profile_part_2, profile_part_3)
    
PROFILE = "2412", "2415", "2418", "4408", "4412", "4415", "4418"
app_win = tk.Tk()

sar = tk.StringVar()
sar.set(CHOICE)

profil = tk.OptionMenu(app_win, sar, "2412", "2415", "2418", "4408", "4412", "4415", "4418")
profil.config(justify= 'right', anchor= 'n', padx=20, pady=10, font=("Arial",15))
profil.pack()

button = tk.Button(app_win, text="Zeige Profil", command=ok) #get_profile)
button.pack(pady=2)

app_win.mainloop()
Gruß wuf :wink:
Take it easy Mates!
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hallo wuf und BlackJack,

vielen vielen Dank für euer Bemühen!

Ich habe trotzdem ein kleies, aber großer Problem und zwar immer noch die Fehlermeldung:

Traceback (most recent call last):
File "C:\Users\xxxxxxxxxxxx\Desktop\profilumstroemung_GH_02.py", line 315, in <module>
stelle1 = get_zahl1() #float(input("Profilwölbung in %: "))
File "C:\Users\xxxxxxxxxxx\Desktop\profilumstroemung_GH_02.py", line 25, in get_zahl1
zahl1 = int(zahl1_sel[0])
ValueError: invalid literal for int() with base 10: 'A'
>>>

Ich weiß leider auch nicht weiter! Seit Tagen probiere ich nun, wobei ich sagen muss, dass ich nicht unbedingt der Python-Spezialist bin. Ich möchte jedoch lernen... Das Programm habe ich mit etwas Hilfe großteils selber geschrieben, eben mit dem Durchlesen von Tutorials. Nun stehe ich aber wirklich an und auf Google finde ich auch nichts. Ich habe die .py-Datei auf Google-Drive gestellt:

https://docs.google.com/file/d/0B2Wf43S ... sp=sharing

Hier der Code so:

Code: Alles auswählen

import scipy as sp
import numpy as np
import math
import csv
from scipy import linalg
from scipy import mat
import matplotlib.pyplot as plt
from pylab import *
from Tkinter import *
from tkMessageBox import *
import Tkinter as tk


#--------------------------------------------------------Definitionen für Zeichenumwandlung---------------------------------------


CHOICE = "Auswählen"

def get_profile():
    profile_sel = sar.get()
    profile_part_1 = int(profile_sel[0])
    profile_part_2 = int(profile_sel[1])
    profile_part_3 = int(profile_sel[2:])
    print (profile_part_1,profile_part_2,profile_part_3)

def get_zahl1():
    #zahl1_sel = sar.get()
    #zahl1 = int(zahl1_sel[0])
    #print (zahl1)
    return int(sar.get()[0])

#stell1 = get_zahl1()

def get_zahl2():
    #zahl2 = int(sar.get()[1])
    #print (zahl2)
    return int(sar.get()[1])

#stell2 = get_zahl2()

def get_zahl3():
    #zahl3 = int(sar.get()[2:])
    #print (zahl3)
    return int(sar.get()[2:])

#stell3 = get_zahl3()
    
def get_alpha():
    #alpha_sel = xar.get()
    #alpha = int(xar.get())
    #print (alpha)
    return int(xar.get())

#alp = get_alpha()

def get_panel():
    #panel_sel = var.get()
    #panel = int(var.get())
    #print (panel)
    return int(var.get())

#pan = get_panel()

#------------------------------------------------------------------------------------------------------------
#-----------------------------  Grafische Eingabe---------------------------------------------
#-------------------------------------------------------------------------------------------------------
#---------------------------------------Def_ok!----------------------------

def ok():
    if sar.get() == CHOICE:
        print("Bitte zuerst Profil auswählen!")
        return

    stell1 = get_zahl1()
    stell2 = get_zahl2()
    stell3 = get_zahl3()
    alpha = get_alpha()
    panel = get_panel()
    print (stell1, stell2, stell3, alp, pan)
    
    plot (xp,cp)
    xlabel('x-Achse')
    ylabel('y-Achse')
    title(r'Profil')

    show()
#
#    print "Profil:", (get_zahl1(), get_zahl2(), get_zahl3())
 #   print "Anstellwinkel:", (get_alpha())
#    print "Panels:", (get_panel())

#--------------------------------------------Kopfzeile--------------------------------------------


app_win = tk.Tk()
app_win.geometry('700x600+300+100')
app_win.resizable(width=FALSE, height=FALSE)
app_win.title(u'PROFILBERECHNUNG ©Becherer/Fiorista/Huber/Sen')

#---------------------------------------------------------Profilauswahl-------------------------------------------------

sar = tk.StringVar()
sar.set(CHOICE)

profil = tk.OptionMenu(app_win, sar, "2412", "2415", "2418", "4408", "4412", "4415", "4418")
profil.config(justify= RIGHT, anchor= N, padx=20, pady=10, font=("Arial",15))
profil.place(x=30,y=40)

#-------------------------------------------------------------------Panelauswahl---------------------------------------------------
var = tk.StringVar()
var.set(CHOICE)

panel = tk.OptionMenu(app_win, var, "1", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120", "130", "140", "150", "160", "170", "180", "190", "200")
panel.config(justify= RIGHT, anchor=W, padx=20, pady=10, font=("Arial",15))
panel.place(x=30, y=160)

#----------------------------------------------------------------Anstellwinkelauswahl-----------------------------------------------
xar = tk.StringVar()
xar.set(CHOICE)

alpha = tk.OptionMenu(app_win,  xar, "-30", "-25", "-20", "-15", "-10", "-5", "-1", "0", "+1", "+5", "+10", "+15", "+20", "+25", "+30", "+35", "+40", "+45", "+50", "+55", "+60")
alpha.config(justify= RIGHT, anchor=E, padx=20, pady=10,font=("Arial",15))
alpha.place(x=320,y=40)

#---------------------------------------------------------------Texte vor den Radiobuttons---------------------------------------

w = Label(app_win, text="NACA-Profil:")
w.config(font=("Arial",15, 'bold underline'))
w.place(x=30, y=10)

w = Label(app_win, text=u"Anstellwinkel in °:")
w.config(font=("Arial",15, 'bold underline'))
w.place(x=320, y=10)

w = Label(app_win, text="Anzahl der Panels:")
w.config(font=("Arial",15, 'bold underline'))
w.place(x=30, y=130)

#--------------------------------------------------------------Trennstriche------------------------------------------------

w = Label(app_win, text="_____________________________________________________________")
w.config(font=("Arial",15, 'bold'))
w.place(x=10, y=215)

#------------------------------------------------------------------Checkbutton-----------------------------------------------------

va = IntVar()
va.set(0)
vb = IntVar()
vb.set(0)
vc = IntVar()
vc.set(0)
vd = IntVar()
vd.set(0)
ve = IntVar()
ve.set(0)

Label(app_win, text="""Auswahl:""", padx = 20, font=("Arial",20, 'bold')).place(x=30, y=250)

tk.Checkbutton(app_win, text="Zeige Profil", padx = 20, font=("Arial",15), variable=va).place(x=30, y=300)
Checkbutton(app_win, text="Zeige Druckverteilung (cp)", padx = 20, font=("Arial",15), variable=vb).place(x=30, y=340)
Checkbutton(app_win, text="Zeige Auftriebsverteilung (cl)", padx = 20, font=("Arial",15), variable=vc).place(x=30, y=380)
Checkbutton(app_win, text="Zeige Profil mit Druckverteilung", padx = 20, font=("Arial",15), variable=vd).place(x=30, y=420)
Checkbutton(app_win, text="Ausdruck der Druck- und Auftriebsbeiwerte", padx = 20, font=("Arial",15), variable=ve).place(x=30, y=460)

    
#--------------------------------------------------------------------Knöpfe-------------------------------------------------
button = Button(app_win, text="OK", command=ok)
button.config(font=("Arial",15, 'bold'), padx=20, pady=10)
button.place(x=430, y=530)

def callback():
    if askyesno('Beenden', 'Wirklich beenden?'):
       raise SystemExit
    else:
        command=ok
       
Button(text='Beenden', command=callback, font=("Arial",15, 'bold'), padx=20, pady=10).place(x=530, y=530)




#-------------------------------------------------------------------MouseOVER--------------------------------------------------------

b = Button(app_win, text='I', background='green', font=("Arial",25, 'bold'), padx=8, pady=1)
b.place(x=220, y=22)

def enterB(event):
    b.configure(text='Auswählen eines 4-stelligen NACA-Profils,\nbezogen auf die Profilsehne:\n1.Ziffer: Profilnwölbung in %\n2.Ziffer: Wölbungsrücklage in Zehntel\n3. und 4.Ziffer: Max. Profildicke in %', background='white', font=("Arial",10))

def leaveB(event):
    b.configure(text='I', background='green', font=("Arial",25,'bold'), padx=8, pady=1)

b.bind('<Enter>', enterB)
b.bind('<Leave>', leaveB)


c = Button(app_win, text='I', background='green', font=("Arial",25, 'bold'), padx=8, pady=1)
c.place(x=500, y=22)

def enterC(event):
    c.configure(text='Auswahl des Winkels zwischen\nder Profilsehne und des\nfrei anströmenden Mediums.', background='white', font=("Arial",10))

def leaveC(event):
    c.configure(text='I', background='green', font=("Arial",25,'bold'), padx=8, pady=1)

c.bind('<Enter>', enterC)
c.bind('<Leave>', leaveC)

d = Button(app_win, text='I', background='green', font=("Arial",25, 'bold'), padx=8, pady=1)
d.place(x=220, y=142)

def enterD(event):
    d.configure(text='Auswahl der Genauigkeit, mit dem\ndas gewünschte Profil gezeichnet und\nberechnet werden soll. Panel=1 bedeutet,\n dass das Profil mit nur einer Geraden\n gezeichnet wird. Die Berechnung erfolgt\nhier mit einer dünnen Platte. Panel=100 bedeutet,\n dass das Profil aus 100 kleinen Geraden\n zusammengesetzt ist.', background='white', font=("Arial",10))

def leaveD(event):
    d.configure(text='I', background='green', font=("Arial",25,'bold'), padx=8, pady=1)

d.bind('<Enter>', enterD)
d.bind('<Leave>', leaveD)

#------------------------------------------------------------------------------------------------------------------------------------------------------
#------------------------------------------------RECHENPROGRAMM--------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------------------------------------------------------------                                    

#---------------------------Definition der Funktion-----------------------------
def F_PSI(L,x,y):
    if abs(y) > 1.e-15:
        z = 1./(4.*math.pi)*(2*y*math.atan((L-x)/y)+2*y*math.atan(x/y)+(L-x)*math.log(math.pow((L-x),2)+math.pow(y,2)) + x*math.log(math.pow(x,2)+math.pow(y,2))-2*L)
        return z
    else:
        z = 1./(2.*math.pi)*((L-x)*math.log(abs(L-x)) + x*math.log(abs(x))-L)
        return z
#---------------------------Definition u(x,y) ----------------------------------
def F_uq(L,x,y):
    if abs(y) > 1.e-15:
        z=1./(2.*math.pi)*(math.atan((L-x)/y)+math.atan(x/y))
    else:
        z=1./2.
#    if (i == 0 ) and (j == 0):
#        print("i = ",i,"  j = ",j,"  z = ",z,"  x = ",x,"  y = ",y,"  L = ",L)
    return z
#---------------------------Definition v(x,y) ----------------------------------
def F_vq(L,x,y):
    if (abs(y) < 1.e-15):
        y = 0.
    if abs(y) > 1.e-15:
        z=1./(4.*math.pi)*(math.log(math.pow((L-x),2)+math.pow(y,2)) - math.log(math.pow(x,2)+math.pow(y,2)))
    else:
        z=1./(2.*math.pi)*(math.log(L-x) - math.log(x))
    return z
#--------------------------DRUCKEN----------------------------------------------
def drucken():

    writer = csv.writer(open("baudaten.csv", "wb"), delimiter = ";")
    writer.writerow(["i", "xp", "yp", "xs", "ys"])


#   2.AUSGABE IN DATEI - Kommapunkt durch Beistrich ersetzt

    for i in range(0,N+1,1):
        xstringp = "%s" % xp[i]
        ystringp = "%s" % yp[i]
        xstrings = "%s" % xs[i]
        ystrings = "%s" % ys[i]
        xstringp=xstringp.replace(".", ",")
        ystringp=ystringp.replace(".", ",")
        xstrings=xstrings.replace(".", ",")
        ystrings=ystrings.replace(".", ",")
        baudaten = ([i, xstringp, ystringp, xstrings, ystrings])  
        writer.writerow(baudaten)
    del baudaten

    writer = csv.writer(open("dicke.csv", "wb"), delimiter = ";")
    writer.writerow(["i", "xs", "yd"])

    for i in range(0,N+1,1):
        dicke = ([i, xs[i], yd[i]])
        writer.writerow(dicke)
    del dicke

    writer = csv.writer(open("skelett.csv", "wb"), delimiter = ";")
    writer.writerow(["i", "xs", "ys"])

    for i in range(0,N+1,1):
        xxxx = ([i, xs[i],ys[i]])
        writer.writerow(xxxx)
    del xxxx

    return
#--------------------------DRUCKEN DRUCKVERTEILUNG -----------------------------------------
def druckenP():

    writer = csv.writer(open("druckverteilung.csv", "wb"), delimiter = ";")
    writer.writerow(["i", "xm", "ym", "w", "cp"])


#   2.AUSGABE IN DATEI - Kommapunkt durch Beistrich ersetzt

    for i in range(0,N,1):
        xstringp = "%s" % xp[i]
        ystringp = "%s" % yp[i]
        xmstring = "%s" % xm[i]
        ymstring = "%s" % ym[i]
        wstring = "%s" % w[i]
        cpstring = "%s" % cp[i]

        
        xmstring=xmstring.replace(".", ",")
        ymstring=ymstring.replace(".", ",")
        wstring=wstring.replace(".", ",")
        cpstring=cpstring.replace(".", ",")
        druckverteilung = ([i, xmstring, ymstring, wstring, cpstring])  
        writer.writerow(druckverteilung)
    del druckverteilung

    writer = csv.writer(open("dicke.csv", "wb"), delimiter = ";")
    writer.writerow(["i", "xs", "yd"])

    for i in range(0,N+1,1):
        dicke = ([i, xs[i], yd[i]])
        writer.writerow(dicke)
    del dicke

    writer = csv.writer(open("skelett.csv", "wb"), delimiter = ";")
    writer.writerow(["i", "xs", "ys"])

    for i in range(0,N+1,1):
        xxxx = ([i, xs[i],ys[i]])
        writer.writerow(xxxx)
    del xxxx5

    return


#---------------------------Eingabe des Benutzers-------------------------------
stelle1 = stell1 #float(input("Profilwölbung in %: "))
stelle2 = stell2 #float(input("Wölbungsrücklage in 10-%: "))
stelle3 = stell3 #float(input("Profildicke in % (zweistellig): "))
alpha = alpha #float(input("Anstellwinkel alpha[°] = "))
# --------------Umrechnen der Eingaben------------------------------------------
alpha = alpha*math.pi/180
f=stelle1/100.
xf=stelle2/10.
d=stelle3/100.
#---------------NACA-Dickenverteilung-------------------------------------------
a0=1.4845
a1=-0.63
a2=-1.758
a3=1.4215
a4=-0.5075
#---------------Testausgabe-----------------------------------------------------
print "Ihr Profil lautet: NACA", stelle1, stelle2 , stelle3
N= panel #input("Anzahl der Panels =  ")
N=int (N)
#-----------------------------Definition von Feldern-----------------------------
xs=np.zeros((N+1),dtype=np.float)   #   N Panels bedeutet (N+1) Eckpunkte 
ys=np.zeros((N+1),dtype=np.float)   
xp=np.zeros((N+1),dtype=np.float)
yp=np.zeros((N+1),dtype=np.float)
yd=np.zeros((N+1),dtype=np.float)
xm=np.zeros((N+1),dtype=np.float)
ym=np.zeros((N+1),dtype=np.float)
tx=np.zeros((N+1),dtype=np.float)
ty=np.zeros((N+1),dtype=np.float)
nx=np.zeros((N+1),dtype=np.float)
ny=np.zeros((N+1),dtype=np.float)
Lj=np.zeros((N+1),dtype=np.float)
b =np.zeros((N+1),dtype=np.float)
gamma =np.zeros((N+1),dtype=np.float)
u = np.zeros((N+1),dtype=np.float)  #   u-Komponente der Geschwindigkeit
v = np.zeros((N+1),dtype=np.float)  #   v-Komponente der Geschwindigkeit
w = np.zeros((N+1),dtype=np.float)  #   Betrag der Geschwindigkeit
cp = np.zeros((N+1),dtype=np.float)  #   Druck
M_PSI=np.zeros((N+1, N+1))
M_PSI=np.matrix(M_PSI)

#---------------------------Berechnung der Profilpunkte------------------------

for i in range(0,N+1,1):                    #   Aenderung auf N 
    xs[i]=(1+math.cos(2*math.pi*i/N))/2   #   plus Schließung xp[N]=xp[0] yp[N]=yp[0]
    if xs[i]<xf:
        ys[i]=f*(2.*xs[i]/xf-math.pow((xs[i]/xf),2))
        tg=2.*f/xf*(1-xs[i]/xf)
    else:
        ys[i]=f*(1-math.pow((xs[i]-xf)/(1-xf),2))
        tg=-2.*f*(xs[i]-xf)/math.pow((1-xf),2)
    cos=1/math.sqrt(1+tg*tg)
    sin=tg*cos
    yd[i]=d*(a0*math.sqrt(xs[i])+a1*xs[i]+a2*math.pow(xs[i],2)+a3*math.pow(xs[i],3)+
         a4*math.pow(xs[i],4))
    if (i>(N/2)):
        xp[i]=xs[i]+yd[i]*sin
        yp[i]=ys[i]-yd[i]*cos
    else:
        xp[i]=xs[i]-yd[i]*sin
        yp[i]=ys[i]+yd[i]*cos

#   Schließung des Profils
    xp[0]=1.
    yp[0]=0.
    xp[N] = xp[0]
    yp[N] = yp[0]

drucken()
#------------------------------Berechnung der Panelgroeszen---------------------
for i in range(0,N,1): 
    xm[i]=(xp[i+1]+xp[i])/2.
    ym[i]=(yp[i+1]+yp[i])/2.
    Lj[i]=math.sqrt(math.pow((xp[i]-xp[i+1]),2)+math.pow((yp[i]-yp[i+1]),2))
    tx[i]=(xp[i]-xp[i+1])/Lj[i]
    ty[i]=(yp[i]-yp[i+1])/Lj[i] 
    nx[i]=-ty[i]
    ny[i]=tx[i]

#------------------------------Belegung der Gleichungsmatrix--------------------
for i in range(0,N,1):
    for j in range (0,N,1):
        xq = (xm[i]-xp[j+1])*tx[j]+(ym[i]-yp[j+1])*ty[j]
        yq = (xm[i]-xp[j+1])*nx[j]+(ym[i]-yp[j+1])*ny[j]
        M_PSI[i,j] = F_PSI(Lj[j],xq,yq)
M_PSI[N,0] = 1.
M_PSI[N,N-1]=1.

for i in range(0,N,1):
    M_PSI[i,N] = -1.

for i in range(0,N,1):
    b[i]= math.sin(alpha)*xm[i]-math.cos(alpha)*ym[i]

b=np.transpose(np.matrix(b))

gamma = M_PSI.I*b


#------------------------------TEST TEST----------------------------------------

for i in range(0,N,1):
    print("i=",i,"   gamma=",gamma[[i]])
gamma = np.matrix(gamma)

#------------------------------Berechnung Geschwindigkeit ---------------------

for i in range(0,N,1):
    u[i] = math.cos(alpha)
    v[i] = math.sin(alpha)
    for j in range(0,N,1):
        xq = (xm[i]-xp[j+1])*tx[j]+(ym[i]-yp[j+1])*ty[j]
        yq = (xm[i]-xp[j+1])*nx[j]+(ym[i]-yp[j+1])*ny[j]
        uq = F_uq(Lj[j],xq,yq)
        vq = F_vq(Lj[j],xq,yq)
        u[i] = u[i] + gamma[[j]]*(uq*tx[j] + vq*nx[j])
        v[i] = v[i] + gamma[[j]]*(uq*ty[j] + vq*ny[j])

for i in range(0,N,1):
    print("i=",i,"   u=",u[i],"    v=",v[i])


for i in range(0,N,1):
    w[i] = math.sqrt(math.pow(u[i],2) + math.pow(v[i],2))
    cp[i] = 1. - math.pow(w[i],2)

    

for i in range(0,N,1):
    print("i=",i,"   w=",w[i],"    cp=",cp[i])

druckenP()


app_win.mainloop()
Vielleicht könntet Ihr den Fehler finden und mir mitteilen?!?
Bzw. generell mir Fehler und Verbesserungsvorschläge mitteilen, damit das Programm das ich für die Schule brauche rechtzeitig fertig wird.

Ich würde mich über Antworten freuen. :|

Grüße, HTLEisenstadt
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi HTLEisenstadt

Dein Skript ist leider zu komplex für mich. Habe auch nicht alle Module installiert um das Skript auszuführen. Aber eine andere Frage. Wirft mein Skript:
http://www.python-forum.de/viewtopic.ph ... 30#p237730
bei dir auch eine Exception (Fehlermeldung)?

Gruss wuf :wink:
Take it easy Mates!
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hei wuf,

trotzdem Danke! :-)

Nein, das Skript ist bei mir Fehlerfrei! Warum denn?

Grüße, HTLEst.
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Nochmal eine kurze Frage:

-Wie bekomme ich denn die Zahl aus dem Drop-Down-Menü, sodass ich sie als neue Variable schreiben kann? Also wenn ich z.b. aus 4415 den ersten 4er will, wie bekomme ich den, dass die variable ihn annimmt, wenn ich z.B. stelle1 = ......... schreibe und stelle1 somit den Wert z.B. 4 hat. Also ein Integer. Ich bekomme das nicht hin, denn auf deine Art wuf, geht das leider nicht.... (Oder ich stelle mich nur blöd an?)

Grüße, HTLEst.

Edit:

Er gibt mir zwar dann bei der Definition (wenn ich die als print definiere) die Werte gespalten auf (4, 4, 15).
Ich kann jedoch nicht damit weiterrechnen bzw. die da rausholen?!?
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

HTLEisenstadt hat geschrieben:Nochmal eine kurze Frage:

-Wie bekomme ich denn die Zahl aus dem Drop-Down-Menü, sodass ich sie als neue Variable schreiben kann? Also wenn ich z.b. aus 4415 den ersten 4er will, wie bekomme ich den, dass die variable ihn annimmt, wenn ich z.B. stelle1 = ......... schreibe und stelle1 somit den Wert z.B. 4 hat. Also ein Integer. Ich bekomme das nicht hin, denn auf deine Art wuf, geht das leider nicht.... (Oder ich stelle mich nur blöd an?)

Grüße, HTLEst.
Hi,

dein Problem ist der Scope. Du definierst die Variablen stell1, stell2 und stell3 innerhalb einer Funktion. Auf diese kann nicht von außerhalb zugegriffen werden. Also erstmal: KEIN 'global' verwenden.
Entweder du definierst sie ganz oben direkt und sauber als Variable, dann haben sie automatisch den globalen Scope oder du holst dir unten nochmal die Eingaben über get_zahl1() usw.

EDIT:
Du verwendest anscheinend die Funktion get_profile(). Diese liefert ein Array/eine Liste zurück.

Code: Alles auswählen

>>> stellen = get_profile()
>>> stellen[0]
1
>>> stellen[1]
2
>>> stellen[2]
34
LG Maik
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Entweder du definierst sie ganz oben direkt und sauber als Variable, dann haben sie automatisch den globalen Scope oder du holst dir unten nochmal die Eingaben über get_zahl1() usw.
Genau das ist ja das Problem, wenn ich unten wieder get_zahl1() usw.... eingebe kommt ja diese Fehlermeldung:

Traceback (most recent call last):
File "C:\Users\xxxxxxxxxxxx\Desktop\programm_LH1.py", line 330, in <module>
stelle1 = get_zahl1() #float(input("Profilwölbung in %: "))
File "C:\Users\xxxxxxxxxxxxxx\Desktop\programm_LH1.py", line 23, in get_zahl1
return int(sar.get()[0])
ValueError: invalid literal for int() with base 10: 'A'

Da übernimmt er jetzt auf einmal den Buchstaben "A" von "Auswählen", aber warum??
Sirius3
User
Beiträge: 18229
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo HTLEisenstadt,

das was Du gepostet hast ist kein lauffähiges Programm. Du mischst den Auswahldialog und Programmlogik (get_zahl1, usw.) mit Dingen die sofort und zwischen den Funktionen ausgeführt werden.

Auf Modulebene sollten nur Konstanten, Funktionen und Klassen definiert werden, keine Variablen oder gar Funktionsaufrufe. Das einzige was überhaupt ausgeführt werden sollte ist am Ende ein

Code: Alles auswählen

if __name__=='__main__':
    main()
Dann benutze keine globalen Variablen! Packe alles, was mit Deinem Dialog zu tun hat in eine Dialog-Klasse. In __init__ werden die ganzen Dropdowns erzeugt, die StringVars in self.sar usw. geschrieben.
Dann sind get_zahl1 (wirklich kein schöner Name) Klassen-Methoden, die aber nur innerhalb des ok-Button-Callbacks benutzt werden sollten. Darin wird dann auch eine Plot-Funktion aufgerufen, die als Paramter stelle123, alpha, usw. erhält und nicht über globale Variablen.

PS: Die dels sind überflüssig.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi HTLEisenstadt

Es gibt noch einige Fehlerchen in deinem Skript:

A)
alp und pan existieren nicht und müssen alpha und panel heissen

Code: Alles auswählen

def ok():
    if sar.get() == CHOICE:
        print("Bitte zuerst Profil auswählen!")
        return
    print(sar.get(), CHOICE)

    stell1 = get_zahl1()
    stell2 = get_zahl2()
    stell3 = get_zahl3()
    alpha = get_alpha()
    panel = get_panel()
    #print (stell1, stell2, stell3, alp, pan)
    print (stell1, stell2, stell3, alpha, panel)
B)
Wenn der Anschlagwinkel und Anzahl Panels abgefragt werden und bei denen nichts ausgewählt ist müssen deren Werte auch auf das vorhandensein des Wortes 'Auswählen' überprüft werden da es sich nicht in ein Integer umgewandeln lässt also:

Code: Alles auswählen

def get_alpha():
    #alpha_sel = xar.get()
    #alpha = int(xar.get())
    #print (alpha)
    if xar.get() == CHOICE:
        print("Bitte einen Anstellwinkel auswählen!")
        return

    return int(xar.get())

Code: Alles auswählen

def get_panel():
    #panel_sel = var.get()
    #panel = int(var.get())
    #print (panel)
    if var.get() == CHOICE:
        print("Bitte die Anzahl der Panels auswählen!")
        return

    return int(var.get())
C)
Eventuell funk auch noch die ewig wiederkehrende Unicode Klausel rein. Da müsste CHOICE angepasst werden:

Code: Alles auswählen

#CHOICE = "Auswählen"
CHOICE = u"Auswählen"
D)
Das folgende hat auch schon unser Kollege daemonTutorials angedeutet:

Code: Alles auswählen

stelle1 = stell1 #float(input("Profilwölbung in %: "))
stelle2 = stell2 #float(input("Wölbungsrücklage in 10-%: "))
stelle3 = stell3 #float(input("Profildicke in % (zweistellig): "))
alpha = alpha #float(input("Anstellwinkel alpha[°] = "))
stell1, stell2, stell3, alpha existieren noch nicht!

Eventuell wird das Skript noch weitere Fehler enthalten. Aber bevor weitergeschaut werden kann müssen die erwähnten zuerst eliminiert werden.

Gruß und gute Nacht wuf :wink:
Take it easy Mates!
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hallo sirius3 und wuf,

danke für eure zahlreichen Antworten! Freu mich darüber...
Das das Programm nicht lauffähig ist mir klar, aber es soll ja noch werden... (hoffentlich).
Das folgende hat auch schon unser Kollege daemonTutorials angedeutet:
Code:
stelle1 = stell1 #float(input("Profilwölbung in %: "))
stelle2 = stell2 #float(input("Wölbungsrücklage in 10-%: "))
stelle3 = stell3 #float(input("Profildicke in % (zweistellig): "))
alpha = alpha #float(input("Anstellwinkel alpha[°] = "))
stell1, stell2, stell3, alpha existieren noch nicht!
Durch was soll ich dass denn ersetzten?
Wenn ich es mit dem get_zahl1() ersetzte, dann greift es wieder auf das "A" zurück! "ValueError: invalid literal for int() with base 10: 'A'"!
Genau an dem hänge ich jetzt schon Tage... :(

Für diese Art von Binding gibt es leider auch keine wirklichen Tutorials die mir bekannt sind..?

Grüße und gute Nacht, HTLEst.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Guten Morgen HTLEisenstadt

Bei dieser Zeile:

Code: Alles auswählen

stelle1 = stell1 #float(input("Profilwölbung in %: "))
nehme ich an, dass du den auskommentierten Teil:

Code: Alles auswählen

#float(input("Profilwölbung in %: "))
der Zeile als Tastatureingabe einkommentieren wirst sobald das Skript erste Zeichen von Lauffähigkeit zeigt. Richtig? Also in der Zwischenzeit möchtest du diesen auskommentierten Teil ersetzen durch die Variable:

Code: Alles auswählen

stell1
Damit du aber diese Variable so verwenden kannst muss sie zuerst vorhanden sein und einen Wert zugewiesen bekommen wie folgt:

Code: Alles auswählen

#---------------------------Eingabe des Benutzers-------------------------------
stell1 = 10.0
stell2 = 10.0
stell3 = 10.0
alpha = 100.0

stelle1 = stell1 #float(input("Profilwölbung in %: "))
stelle2 = stell2 #float(input("Wölbungsrücklage in 10-%: "))
stelle3 = stell3 #float(input("Profildicke in % (zweistellig): "))
alpha = alpha #float(input("Anstellwinkel alpha[°] = "))
Oder du kannst die Werte direkt ohne neue Variablen zu kreieren zuweisen wie:

Code: Alles auswählen

#---------------------------Eingabe des Benutzers-------------------------------
stelle1 = 10.0 #float(input("Profilwölbung in %: "))
stelle2 = 10.2 #float(input("Wölbungsrücklage in 10-%: "))
stelle3 = 10.0 #float(input("Profildicke in % (zweistellig): "))
alpha = 100.0 #float(input("Anstellwinkel alpha[°] = "))
Aber dies sind jetzt wirklich Programmierbasics. Da musst du vielleicht nochmals über die Bücher (Tutorials) gehen. :wink:

Der bellende Hund in deinem Skript:

Code: Alles auswählen

Traceback (most recent call last):
File "C:\Users\xxxxxxxxxxxx\Desktop\programm_LH1.py", line 330, in <module>
stelle1 = get_zahl1() #float(input("Profilwölbung in %: "))
File "C:\Users\xxxxxxxxxxxxxx\Desktop\programm_LH1.py", line 23, in get_zahl1
return int(sar.get()[0])
ValueError: invalid literal for int() with base 10: 'A'
Diese Exception könnte entstehen da hier etwas schief läuft:

Code: Alles auswählen

def ok():
    if sar.get() == CHOICE:
        print("Bitte zuerst Profil auswählen!")
        return
Bei mir wirft dies eine Exception, die folgende Warnung enthält:

Code: Alles auswählen

num_splitter_03_01.py:81: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  if sar.get() == CHOICE:
Da mein Skript:

Code: Alles auswählen

# -*- coding: utf-8 -*-
codiert ist.

Versuchte herauszufinden was hier das Problem ist und ergänzte den Code-Abschnitt mit:

Code: Alles auswählen

 
    print(sar.get(), CHOICE)
zu:

Code: Alles auswählen

    if sar.get() == CHOICE:
        print("Bitte zuerst Profil auswählen!")
        return
    print(sar.get(), CHOICE)
Hiermit wurde die Exception mit Klartext erweitert:

Code: Alles auswählen

num_splitter_03_01.py:81: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
  if sar.get() == CHOICE:
(u'Ausw\xe4hlen', 'Ausw\xc3\xa4hlen')
und zwar mit:

Code: Alles auswählen

(u'Ausw\xe4hlen', 'Ausw\xc3\xa4hlen')
Diese sagt aus, dass der Vergleich:

Code: Alles auswählen

if sar.get() == CHOICE:
in die Hose gehen muss.

Um dieses Problem zu beheben machte ich folgende Änderung:

Code: Alles auswählen

#CHOICE = "Auswählen"
CHOICE = u"Auswählen"
Und siehe da der Hund beruhigte sich.

Hoffe dir hiermit ein wenig weitergeholfen zu haben.

Gruß wuf :wink:
Take it easy Mates!
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Schönen Vormittag wuf,
Bei dieser Zeile:
Code:
stelle1 = stell1 #float(input("Profilwölbung in %: "))
nehme ich an, dass du den auskommentierten Teil:
Code:
#float(input("Profilwölbung in %: "))
der Zeile als Tastatureingabe einkommentieren wirst sobald das Skript erste Zeichen von Lauffähigkeit zeigt. Richtig?
Nein, ich möchte als "stelle1" einfach die vom Benutzer ausgewählte Zahl aus dem Dropdown-Menü übernehmen!? :?
Das heißt, eine Zahl (Integer), mit der ich weiter rechnen kann, die mit dem Drop-Down ausgewählt wird.

Der Benutzer soll sein Profil (z.B. 4415) auswählen, dieses soll dann gesplittet werden und IMMER DIE ERSTE ZAHL soll als stelle1 übernommen werden, die ZWEITE ZAHL als stelle2 etc... :cry:

Tut mir leid wenn ich das wirklich so undeutlich erkläre....

Also im Prinzip etwas ganz simples, dachte ich zumindest?!?
Jedoch ist dann auf einmal stelle1 keine Zahl mehr, sondern entweder ein Wert vom Wort "Auswählen" oder eine Funktion, mit der ich nicht weiterrechnen kann!

Grüße, HTLEst.
Sirius3
User
Beiträge: 18229
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo HTLEisenstadt,

weil der Code

Code: Alles auswählen

stelle1 = stell1
usw.
direkt auf Modulebene ist, wird er sofort ausgeführt.
Du mußt das ganze Zeug zum Plotten in eine Funktion schreiben, die erst beim Click auf OK aufgerufen wird. (Siehe mein Posting oben!)

Grüße
Sirius
HTLEisenstadt
User
Beiträge: 28
Registriert: Mittwoch 30. Januar 2013, 16:40

Hallo HTLEisenstadt,

weil der Code
Code:
stelle1 = stell1
usw.

direkt auf Modulebene ist, wird er sofort ausgeführt.
Du mußt das ganze Zeug zum Plotten in eine Funktion schreiben, die erst beim Click auf OK aufgerufen wird. (Siehe mein Posting oben!)

Grüße
Sirius
Ahhhh, jetzt hab ichs geschnallt! :) D.h. ich muss das ganze Rechenprogramm in der definition von OK (def ok():) schreiben!??

Finde ich logisch, aber warum bin ich da bitte nicht draufgekommen... :oops:

Grüße und vielen Dank Sirius3!
Antworten