Entry.get () не возвращает введенные пользователем значения - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь кодировать программу числовой интеграции на python, однако некоторые пользовательские вводы не сохраняются как переменные при использовании Entry.get().Как правильно использовать Entry.get()?

Я довольно новичок в кодировании и пытаюсь создать программу, которая вычисляет числовую интеграцию.Код для интеграции работает сам по себе, однако я пытаюсь создать пользовательский интерфейс, используя библиотеку tkinter.Я получаю следующую ошибку в данной строке:

finalValue = ((a-b)/n)*initialValue

ZeroDivisionError: float division by zero

Из этого я понял, что пользовательские значения не сохраняются в переменных, и, следовательно, n, a и b возвращают ноль.Я проверил это, напечатав переменные после ввода пользователя.Я думаю, что использовал Entry.get() неправильно, но я не уверен, как.Я также посмотрел на подобные проблемы и решения, но ни одна из них, кажется, не работает.


    def integrateNumerical(n, b, a):

        def f(x): #Defines the function to be integrated
             return eval(numericalFunction)

        initialValue = 0 #Sets the initial iterative value
        finalValue = 0 #Sets the final iterative value

        for i in range(1, n+1):
            initialValue = initialValue + f(b+((i-(1/2))*((a-b)/n)))

        finalValue = ((a-b)/n)*initialValue

    return finalValue

    def integrateNumericalWindow():

        window8 = Toplevel(window)
        window8.title("Numerical Integration")
        window8.geometry("400x400")

        iterationNumber = IntVar()
        upperBound = IntVar()
        lowerBound = IntVar()
        functionNumerical = StringVar()

        Label(window8, text = "").pack()
        Label(window8, text = "Number of iterations: ").pack()
        iterationNumberEntry = Entry(window8, textvariable = iterationNumber)
        iterationNumberEntry.pack()

        Label(window8, text = "").pack()
        Label(window8, text = "Upper bound: ").pack()
        upperBoundEntry = Entry(window8, textvariable = upperBound)
        upperBoundEntry.pack()

        Label(window8, text = "").pack()
        Label(window8, text = "Lower bound: ").pack()
        lowerBoundEntry = Entry(window8, textvariable = lowerBound)
        lowerBoundEntry.pack()

        Label(window8, text = "").pack()
        Label(window8, text = "Function: ").pack()
        functionNumericalEntry = Entry(window8, textvariable = functionNumerical)
        functionNumericalEntry.pack()

        global n
        global a
        global b
        global numericalFunction

        n = int(Entry.get(iterationNumberEntry))
        a = float(Entry.get(upperBoundEntry))
        b = float(Entry.get(lowerBoundEntry))
        numericalFunction = str(Entry.get(functionNumericalEntry))

        Label(window8, text = "").pack()
        Button(window8, text = "Integrate", width = 10, height = 1, bd = "0", fg = "#383a39", bg = "#a1dbcd", command = lambda : integrateNumerical(n, b, a)).pack()

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019
def integrateNumerical(n, b, a):

    def f(x): #Defines the function to be integrated
         return eval(numericalFunction)

    initialValue = 0 #Sets the initial iterative value
    finalValue = 0 #Sets the final iterative value

    for i in range(1, n+1):
        initialValue = initialValue + f(b+((i-(1/2))*((a-b)/n)))

    finalValue = ((a-b)/n)*initialValue

    return finalValue

def integrateNumericalWindow():

    window8 = tk.Toplevel()
    window8.title("Numerical Integration")
    window8.geometry("400x400")

    iterationNumber = tk.IntVar()
    upperBound = tk.IntVar()
    lowerBound = tk.IntVar()
    functionNumerical = tk.StringVar()

    tk.Label(window8, text = "").pack()
    tk.Label(window8, text = "Number of iterations: ").pack()
    iterationNumberEntry = tk.Entry(window8, textvariable = iterationNumber)
    iterationNumberEntry.pack()

    tk.Label(window8, text = "").pack()
    tk.Label(window8, text = "Upper bound: ").pack()
    upperBoundEntry = tk.Entry(window8, textvariable = upperBound)
    upperBoundEntry.pack()

    tk.Label(window8, text = "").pack()
    tk.Label(window8, text = "Lower bound: ").pack()
    lowerBoundEntry = tk.Entry(window8, textvariable = lowerBound)
    lowerBoundEntry.pack()

    tk.Label(window8, text = "").pack()
    tk.Label(window8, text = "Function: ").pack()
    functionNumericalEntry = tk.Entry(window8, textvariable = functionNumerical)
    functionNumericalEntry.pack()

    global n
    global a
    global b
    global numericalFunction

    n = int(tk.Entry.get(iterationNumberEntry))
    a = float(tk.Entry.get(upperBoundEntry))
    b = float(tk.Entry.get(lowerBoundEntry))
    numericalFunction = str(tk.Entry.get(functionNumericalEntry))

    tk.Label(window8, text = "").pack()
    tk.Button(window8, text = "Integrate", width = 10, height = 1, bd = "0", fg = "#383a39", bg = "#a1dbcd", command = lambda : integrateNumerical(n, b, a)).pack()
    window8.mainloop()

Использование:

import tkinter as tk
integrateNumericalWindow()
0 голосов
/ 18 февраля 2019

get () - метод объекта, созданного Entry.Вы называете его как метод объекта следующим образом.

n = int(iterationNumberEntry.get())
a = float(upperBoundEntry.get())
b = float(lowerBoundEntry.get())
numericalFunction = str(functionNumericalEntry.get())

Ваш пример не завершен, поэтому я не смог проверить это.Вам нужно включить

window8.mainloop()

Вероятно, 4 получателя должны быть включены в integrateNumeric.тогда они будут запускаться при нажатии кнопки.

HTH

Редактировать: дальнейшее объяснение после прочтения комментария

Я пытался заставить его работать на основе того, что у вас былосделано выше.Я не уверен, что он делает то, что вы хотите.

from tkinter import *

def integrateNumericalWindow():

    window8 = Tk()
    window8.title("Numerical Integration")
    window8.geometry("400x400")

    iterationNumber = IntVar()   
    upperBound = IntVar()
    lowerBound = IntVar()
    functionNumerical = StringVar()

    Label(window8, text = "").pack()
    Label(window8, text = "Number of iterations: ").pack()
    iterationNumberEntry = Entry(window8, textvariable = iterationNumber)
    iterationNumberEntry.pack()

    Label(window8, text = "").pack()
    Label(window8, text = "Upper bound: ").pack()
    upperBoundEntry = Entry(window8, textvariable = upperBound)
    upperBoundEntry.pack()

    Label(window8, text = "").pack()
    Label(window8, text = "Lower bound: ").pack()
    lowerBoundEntry = Entry(window8, textvariable = lowerBound)
    lowerBoundEntry.pack()

    Label(window8, text = "").pack()
    Label(window8, text = "Function: ").pack()
    functionNumericalEntry = Entry(window8, textvariable = functionNumerical)
    functionNumericalEntry.pack()

    Label(window8, text = "").pack()

    Label(window8, text="Result :").pack()
    result=Label(window8, text="None")
    result.pack()

    # I've moved the command function to here so it can 'see' all the variables it needs
    def integrateNumerical():
        # The 4 Entry widgets are read in this function when the button is clicked.
        n = int(iterationNumberEntry.get())
        a = float(upperBoundEntry.get())
        b = float(lowerBoundEntry.get())
        numericalFunction = str(functionNumericalEntry.get())

        def f(x): #Defines the function to be integrated
            return eval(numericalFunction)

        print(n, a, b, numericalFunction, f(3.0) )

        initialValue = 0 #Sets the initial iterative value
        finalValue = 0 #Sets the final iterative value

        for i in range(1, n+1):
            initialValue = initialValue + f(b+((i-(1/2))*((a-b)/n)))

        finalValue = ((a-b)/n)*initialValue

        result.configure(text=str(finalValue)) # Set a label with the result instead of returning a result.
        # return finalValue

    Button(window8, text = "Integrate", width = 10, height = 1, bd = "0", fg = "#383a39", 
    bg = "#a1dbcd", command=integrateNumerical).pack()

    window8.mainloop()

integrateNumericalWindow()

Надеюсь, это проясняет, что я имел в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...