Fehlermeldung Python Jupyter Programm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Hallo,

in folgendem Programm erhalte ich eine Fehlermeldung, wenn ich button1 oder button2 aktiviere.



Code: Alles auswählen

from sympy.matrices import *
from sympy.printing import *
from IPython.display import display, HTML, Math, Latex, clear_output
from ipywidgets import widgets
from random import randint
from sympy import *
from builtins import str
from copy import deepcopy
import numpy as np


text1 = widgets.Text()
 
button1 = widgets.Button(description="Auswerten")
button2 = widgets.Button(description="Neue Aufgabe")


x=[] 
#x[0] = Matrix()
#x[1] = Matrix()
#x[2] = Matrix()
 
latexWidget = widgets.Latex()
a_text=""

taskWidget = widgets.HTML()
anzahl_matrizen=0
 
mhbox1 = widgets.HBox((taskWidget, latexWidget))
mhbox2 = widgets.HBox((button1, button2))
 
def init_vectors(b, matrix_1, anzahl_1, matrix_2):
        w=widgets.Textarea(
               description='Matrix', 
               value = str(matrix_1),
            )
        display(w)
        global x, anzahl_matrizen, text1
        anzahl_matrizen=0;
        for u in range(anzahl_1):
          copy_matrix=deepcopy(matrix_1)
          x.append(copy_matrix)
        
        if isinstance(matrix_2,Matrix):
              x.append(matrix_2)
        for u in range(anzahl_1):
           anzahl_matrizen=anzahl_matrizen+1
           for i in range(matrix_1.shape[1]):
              for j in range(matrix_1.shape[0]):
                   x[u][j,i]=randint(-10,10)      
        
        #w=widgets.Textarea(
               #description='Matrix', 
               #value = str(x[0]),
            #)
        #display(w)
        #w=widgets.Textarea(
               #description='Matrix', 
               #value = str(x[1]),
            #)
        #display(w)
        if isinstance(matrix_2,Matrix):
             anzahl_matrizen+=1 
             for i in range(matrix_2.shape[1]):
                for j in range(matrix_2.shape[0]):
                    x[anzahl_1][j,i]=randint(-10,10) 
        #w=widgets.Textarea(
               #description='Matrix', 
               #value = str(x[anzahl_1]),
            #)
        #display(w)
        text1.value = ""
        display_task()
        #w=widgets.Textarea(
               #description='Matrix', 
               #value = str(anzahl_matrizen),
            #)
        #display(w)
 
def display_task():
        global x, anzahl_matrizen, latexWidget
        a=[]
        #w=widgets.Textarea(
               #description='Matrix', 
               #value = str(anzahl_matrizen),
            #)
        #display(w)
        clear_output()
        for i in range(anzahl_matrizen):
           b=latex(x[i])
           b=b.replace("left[", "left(")
           b=b.replace("right]", "right)")
           a.append(b)
        
        str1="$\langle" 
        for i in range(anzahl_matrizen):
            str1=str1+a[i]+", "
 
        str1 += "\\rangle$"
        latexWidget.value = str1
 
def evaluate(b, aufgabe):
        global x,text1
        u_wert=1
        if aufgabe=="Lineare Unabhängigkeit":
            n_matrix_gesamt=np.matrix([x[0],x[1],x[2]]).astype(float)
            #w=widgets.Textarea(
               #description='Matrix', 
               #value = str(n_matrix_gesamt),
            #)
            #display(w)
            u_wert=1
            if np.linalg.det(n_matrix_gesamt)==0:
               u_wert=2
            else:
               u_wert=1  
        #z = x.dot(y)
 
        clear_output()
        display_task()
 
        #if "{0}".format(z) == text1.value:
                #display(HTML("<b><font color='green'>Richtig</font></b>"))
        #else:
                #display(HTML("<b><font color='red'>Falsch</font></b>"))
        if "{0}".format(u_wert) == text1.value:
                display(HTML("<b><font color='green'>Richtig</font></b>"))
        else:
                display(HTML("<b><font color='red'>Falsch</font></b>"))
 
def exec_la_scalar(aufgabentext, matrix1, anzahl1, matrix2, aufgabe):
        
        taskWidget.value = "<b>{0}</b>".format(aufgabentext)
        init_vectors(button1, matrix1, anzahl1, matrix2)
        button2.on_click(init_vectors(button1, matrix1, anzahl1, matrix2))
        button1.on_click(evaluate(button1, aufgabe))
        display(widgets.VBox((mhbox1, text1, mhbox2)))
Die Fehlermeldung lautet: TypeError Traceback (most recent call last)
TypeError: 'NoneType' object is not callable

auch wird meine Textarea zweimal ausgegeben, von Beginn an. Das dürfte nicht sein, weil anfangs die init_vectors Funktion nur einmal aktiviert wird. Irgendwo wird ein nicht typisiertes Objekt übergeben, aber ich weiß nicht wo.
Zuletzt geändert von Anonymous am Donnerstag 9. Juni 2016, 09:15, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Brando: irgendwie scheinst Du beratungsresistent zu sein, und Tipps einfach zu ignorieren. Damit will ich Dich nicht ärgern, sondern umgekehrt: wenn Du nicht sauber programmierst, wirst Du immer wieder in Probleme reinlaufen, die Du dann dadurch versuchst zu "reparieren" indem Du eine Zeile hinzufügst. Wie schon das letze mal geschrieben, ist init_vectors eigentlich ein Dreizeiler. Das meiste gehört da sowieso nicht rein, weil es nichts initalisiert sonder etwas darstellt. on_click erwartet wahrscheinlich eine Funktion und nicht None.
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Bei der Entwicklung des Codes soll ich mich an ein Template halten. Daher diese Form. Das on_click eine Funktion erwartet ist doch erfüllt. Es werden die Funktionen init_vectors bzw. evaluate übergeben. Diese sind kein NoneType.
BlackJack

@Brando: Es gibt in Python keine nicht typisierten Objekte. Python ist dynamisch aber streng typisiert. *Jeder* Wert hat einen Typ.

Du übergibst bei beiden `on_click()`-Methoden `None` als Wert weil das nun der Rückgabewert der Funktionsaufrufe ist die Du dort ausführst. Sowohl `init_vectors()` als auch `evaluate()` geben `None` zurück. `on_click()` erwartet eine Funktion oder Methode. Und das ist *nicht* erfüllt.

Wirklich helfen kann man Dir nicht wenn Du darauf bestehst nicht vernünftig und sauber programmieren zu dürfen. :K Denn hier gilt das gleiche wie bei anderen GUI-Rahmenwerken: objektorientierte Programmierung ist der sich anbietende Ansatz. Womit man auch gleich die ``global``-Anweisungen loswerden würde, die in einem sauberen Programm genau so wenig zu suchen haben wie Sternchen-Importe, die Unmengen an Namen ins Modul holen die man dort nicht braucht, und hier sogar ganz praktisch mindestens eine Namenskollision verursachen.
Antworten