[Python-de] Numpy-Array aus TkInter-Entrys belegen

Peter Otten __peter__ at web.de
Do Dez 15 17:48:42 CET 2011


Jan Harnisch wrote:

> Hallo Peter,
> 
> und danke für die schnelle Antwort!

Bitte!

>> Um die Werte in das GUI zurückzuschreiben:
>>
>> for v, x in zip(entry_val, a):
>>      v.set(a)
>         ^^^^^^^^
> (fürs Archiv: das hier muss v.set(x) heißen).

Oops.
 
>> Beantwortet das deine Frage? Falls nicht, erläutere bitte nochmal
>> genauer, wo numpy ins Spiel kommt.
> 
> Vielen Dank; du hast mir perfekt weitergeholfen.
> Vielleicht doch noch ein paar Worte zum Hintergrund der Sache: Letztlich
> geht es hier um eine Strömungsberechnung. Ich habe einen in momentan 16
> Abschnitte unterteilten Strömungskanal, der von seiner Grundgeometrie
> her immer ähnlich aussieht. Einige Abmessungen jedes Abschnitts sollen
> vom Benutzer vorgegeben werden (dafür die Entrys), und in Abhängigkeit
> davon werden dann ein paar andere Abmessungen optimiert.
> Da ich die Optimierungsergebnisse auf die Konsole ausgeben kann, muss
> ich nicht mal unbedingt was ins GUI zurückschreiben. Ist aber trotzdem
> schön und bringt natürlich zusätzlichen Komfort.
> Nochmal danke und schönen Gruß

Ich hab noch was Interessantes gefunden, sogenannte "ufunc"s, und in dein 
Beispielprogramm eingebaut:

from numpy import *
from Tkinter import *

root = Tk()

setvalues = frompyfunc(lambda var, value: var.set(value), 2, 1)
getvalues = frompyfunc(lambda var: var.get(), 1, 1)

def add_up():
    total = getvalues(entry_val).sum()
    print total

def add_one():
    a = getvalues(entry_val)
    print "vorher", a
    setvalues(entry_val, a + 1)
    print "nachher", getvalues(entry_val)

Label(root, text="Summand1").grid(row=0, sticky=E)
Label(root, text="Summand2").grid(row=1, sticky=E)

entry_val = [DoubleVar(), DoubleVar()]
setvalues(entry_val, 42)

Entry(root, textvariable=entry_val[0]).grid(row=0, column=1)
Entry(root, textvariable=entry_val[1]).grid(row=1, column=1)

Button(root, text="Summe", command=add_up).grid(row=2, sticky=W)
Button(root, text="1 addieren", command=add_one).grid(row=3, sticky=W)

root.mainloop()



Mehr Informationen über die Mailingliste python-de