Формула квадрата Ньютона с использованием tkinter/использования кнопки для вычислений несколько раз

Я новичок в питоне. Мой вопрос: могу ли я использовать одну кнопку «Оценить» несколько раз, чтобы вычислить мой ответ? В частности, проект заключается в реализации формулы Ньютона в tkinter. Если ввод равен 0, текстовое поле AssessmentVar вычисляется как результат 0. Если ввод является положительным числом, я должен иметь возможность обрабатывать число несколько раз, используя мою кнопку оценки в качестве цикла. Я легко смог получить окончательный результат, используя вложенный цикл while. Однако попытка повторно использовать кнопку оценки для постепенного перехода к алгоритму кажется невозможной. Я пробовал все. самое близкое, что я подошел, это установить мой inputVar для репликации моей оценкиVar, но это, очевидно, приведет к логической ошибке, поскольку ввод должен оставаться постоянным. Кроме того, я попытался установить глобальную переменную для оценки, но python не позволит мне манипулировать оценкой, и моя inputVar возвращает глобальное значение. Начальное значение оценки должно быть 1. Если у кого-то есть какой-либо вклад, мы будем очень признательны. Вот мой код

'''
Created on Nov 11, 2015

@author: lz206729
'''

from tkinter import *



class newtonGUI(Frame):





    def __init__(self):
    #Sets up window
        Frame.__init__(self)
        self.master.title("Newton's Square")
        self.grid(column = 0, row = 0)

    #Label and field for number input   
        self._inputLabel = Label(self, text = "Input a positive number to square: ")
        self._inputLabel.grid(row = 0, column = 0)
        self._inputVar = DoubleVar()
        self._inputEntry = Entry(self, textvariable = self._inputVar)
        self._inputEntry.grid(row = 0, column = 1)

    #Displays the common square root
        self._estimateLabel = Label(self, text = "The estimate is : ")
        self._estimateLabel.grid(row = 1, column = 0)
        self._estimateVar = DoubleVar()
        self._estimateEntry = Entry(self, textvariable = self._estimateVar)
        self._estimateEntry.grid(row = 1, column = 1)

    #Button that computes the input
        self._estimateButton = Button(self, text = "Estimate", command = self._newtonSquare)
        self._estimateButton.grid(row = 4, column = 0)


    #Button that resets text boxes
        self._resetButton = Button(self, text = "Reset", command = self._reset)
        self._resetButton.grid(row = 4, column = 1)





    def _newtonSquare(self):
        tolerance = 0.000001
        estimate = 1
        x = self._inputVar.get()

        if x == 0:
            self._estimateVar.set(x / 2)
        else:
            while True:
                estimate = (estimate + x / estimate)/2
                difference = abs(x - estimate **2)
                if difference <= tolerance:
                    break

            self._estimateVar.set(estimate)



    def _reset(self):
        self._inputVar.set(0)
        self._estimateVar.set(0)
        self._estimateButton.config(state='normal')



def main():
    newtonGUI().mainloop()
main()

person Lucas Zimmerman    schedule 14.11.2015    source источник
comment
Квадрат Ньютона?! Какой ты гений?   -  person Jonah Fleming    schedule 15.11.2015


Ответы (2)


Ваша цель и проблема не ясны, но вот что, я думаю, вы хотите, основываясь на «кнопке оценки, чтобы постепенно входить в алгоритм».

from tkinter import *

class newtonGUI(Frame):
    def __init__(self, master):
        #Set up frame
        Frame.__init__(self, master)
        self.master.title("Newton's Squareroot")
        self.grid(column = 0, row = 0)

        #Label and field for number input   
        self._inputLabel = Label(self, text = "Input a positive number")
        self._inputLabel.grid(row = 0, column = 0)
        self._inputVar = DoubleVar()
        self._inputVar.set(1.0)
        self._inputEntry = Entry(self, textvariable = self._inputVar)
        self._inputEntry.grid(row = 0, column = 1)

        #Display the common square root
        self._estimateLabel = Label(self, text = "Square root estimate")
        self._estimateLabel.grid(row = 1, column = 0)
        self._estimateVar = DoubleVar()
        self._estimateVar.set(1.0)
        self._estimateEntry = Label(self, textvariable = self._estimateVar)
        self._estimateEntry.grid(row = 1, column = 1)

        #Button that computes the input
        self._estimateButton = Button(self, text = "Estimate", command = self._newtonSquare)
        self._estimateButton.grid(row = 4, column = 0)

        #Button that resets text boxes
        self._resetButton = Button(self, text = "Reset", command = self._reset)
        self._resetButton.grid(row = 4, column = 1)

    def _newtonSquare(self):
        val = self._inputVar.get()
        est = self._estimateVar.get()
        if val <= 0.0:
            self._estimateVar.set(0.0)
        else:
            self._estimateVar.set((est + val / est) / 2)

    def _reset(self):
        self._inputVar.set(1.0)
        self._estimateVar.set(1.0)

def main():
    root = Tk()
    newtonGUI(root)
    root.mainloop()
main()
person Terry Jan Reedy    schedule 15.11.2015

Спасибо, определенно направил меня в правильном направлении. Я даже не думал о том, чтобы установить мои начальные значения равными единице. Сначала код выполнял только значение общего квадрата, поэтому я повозился с ним. Спасибо еще раз. Вот итоговая программа.

from tkinter import *

class newtonGUI(Frame):
    def __init__(self, master):
        #Set up frame
        Frame.__init__(self, master)
        self.master.title("Newton's Squareroot")
        self.grid(column = 0, row = 0)

        #Label and field for number input   
        self._inputLabel = Label(self, text = "Input a positive number")
        self._inputLabel.grid(row = 0, column = 0)
        self._inputVar = DoubleVar()
        self._inputVar.set(1.0)
        self._inputEntry = Entry(self, textvariable = self._inputVar)
        self._inputEntry.grid(row = 0, column = 1)

        #Display the common square root
        self._estimateLabel = Label(self, text = "Square root estimate")
        self._estimateLabel.grid(row = 1, column = 0)
        self._estimateVar = DoubleVar()
        self._estimateVar.set(1.0)
        self._estimateEntry = Label(self, textvariable = self._estimateVar)
        self._estimateEntry.grid(row = 1, column = 1)

        #Button that computes the input
        self._estimateButton = Button(self, text = "Estimate", command = self._newtonSquare)
        self._estimateButton.grid(row = 4, column = 0)

        #Button that resets text boxes
        self._resetButton = Button(self, text = "Reset", command = self._reset)
        self._resetButton.grid(row = 4, column = 1)

    def _newtonSquare(self):
        value = self._inputVar.get()
        estimate = self._estimateVar.get()
        tolerance = 0.000001

        if value <= 0.0:
            self._estimateVar.set(0.0)
        else:
            estimate = (estimate + value / estimate) / 2
            difference = abs(value - estimate **2)
            if difference <= tolerance:
                self._estimateVar.set(estimate)
                self._estimateButton.config(state = 'disabled')
            else:
                self._estimateVar.set(estimate)

    def _reset(self):
        self._inputVar.set(1.0)
        self._estimateVar.set(1.0)

def main():
    root = Tk()
    newtonGUI(root)
    root.mainloop()
main()
person Lucas Zimmerman    schedule 16.11.2015