Как вернуть множественное значение из функции в другую с помощью поля ввода tkinter? (ValueError: не удалось преобразовать строку в float:) - PullRequest
0 голосов
/ 22 января 2020

Я действительно новичок в tkinter и python, и я пытаюсь создать GUI с помощью tkinter. Пример просто вычислить умножение и сложение двух чисел и возврат, и я застрял с генерацией результата, когда я не могу преобразовать строку для ввода (что означает, что нет ввода). Итак, как я могу вернуть эти 2 значения другой функции?

import tkinter as tk

'''OS'''
root = tk.Tk()
root.title("Simple Box")
operator=""

canvas = tk.Canvas(root, height=400,width=500,bg="White")
canvas.pack()

frame=tk.Frame(root, bg="Light Blue")
frame.place(relwidth=0.9,relheight=0.9, relx=0.05, rely=0.05)
'''Variable '''
num1= tk.StringVar()
num2= tk.StringVar()

''' function'''
def operation1():
    global number1, number2
    multi_add =tk.Tk()
    multi_add.title("Multiplication and Addition")

    tk.Label(multi_add, font =("Helvetica", 20),
             text="Enter the first number:").grid(row=0)
    tk.Label(multi_add, font =("Helvetica", 20),
             text="Enter the second number").grid(row=1)

    number1=tk.Entry(multi_add, textvariable = num1).grid(row=0, column=1)
    number2=tk.Entry(multi_add, textvariable = num2).grid(row=1, column=1)

    return num1, num2 


def result():
    num3 = float(num1.get()) + float(num2.get())
    num4 = float(num1.get()) * float(num2.get())
    print("the result is ",num3 ,"and", num4)

'''buttons'''
result=tk.Button(frame, text="Result", font=('airal', 30 ,'bold'), height="1"
                 ,width="6", padx=10,pady=5, fg="Black",
                 bg="yellow", command= result)
result.place(x=300 , y=305)

op1=tk.Button(frame, text="operation 1", height="2", width="10", padx=10,
             pady=5, fg="Black", bg="yellow", command = operation1)
op1.place(x = 17, y = 310)


root.mainloop()

TraceBackError:

D Исключение в обратном вызове Tkinter: Traceback (последний вызов был последним): File "/ Библиотека / Каркасы / Python .рамка / Версии / 3.7 / lib / python3 .7 / tkinter / init .py ", строка 1705, при возврате вызова self.fun c (* args ) Файл "/ Users / Pozzphut / Desktop / Project Python / FigureFunction Transfer.py", строка 37, в результате num3 = float (num1.get ()) + float (num2.get ()) ValueError: не удалось преобразовать строку в float:

1 Ответ

0 голосов
/ 22 января 2020

Вот решение:

Если вы используете .grid() в той же строке, то number1 и number2 вернут None, и мы не сможем получить данные.

Изменения сделаны следующим образом:

    number1=tk.Entry(multi_add, textvariable = num1)
    number2=tk.Entry(multi_add, textvariable = num2)
    number1.grid(row=0, column=1)
    number2.grid(row=1, column=1)

и

def result():
    num3 = float(number1.get()) + float(number2.get())
    num4 = float(number1.get()) * float(number2.get())

Вот весь код:

import tkinter as tk

'''OS'''
root = tk.Tk()
root.title("Simple Box")
operator=""

canvas = tk.Canvas(root, height=400,width=500,bg="White")
canvas.pack()

frame=tk.Frame(root, bg="Light Blue")
frame.place(relwidth=0.9,relheight=0.9, relx=0.05, rely=0.05)
'''Variable '''
num1= tk.StringVar()
num2= tk.StringVar()

''' function'''
def operation1():
    global number1, number2
    multi_add =tk.Tk()
    multi_add.title("Multiplication and Addition")

    tk.Label(multi_add, font =("Helvetica", 20),
             text="Enter the first number:").grid(row=0)
    tk.Label(multi_add, font =("Helvetica", 20),
             text="Enter the second number").grid(row=1)

    number1=tk.Entry(multi_add, textvariable = num1)
    number2=tk.Entry(multi_add, textvariable = num2)
    number1.grid(row=0, column=1)
    number2.grid(row=1, column=1)

def result():
    num3 = float(number1.get()) + float(number2.get())
    num4 = float(number1.get()) * float(number2.get())
    print("the result is ",num3 ,"and", num4)

'''buttons'''
result=tk.Button(frame, text="Result", font=('airal', 30 ,'bold'), height="1"
                 ,width="6", padx=10,pady=5, fg="Black",
                 bg="yellow", command= result)
result.place(x=300 , y=305)

op1=tk.Button(frame, text="operation 1", height="2", width="10", padx=10,
             pady=5, fg="Black", bg="yellow", command = operation1)
op1.place(x = 17, y = 310)


root.mainloop()

и второй подход

Нет необходимости объявлять переменные num1 и num2:

import tkinter as tk

'''OS'''
root = tk.Tk()
root.title("Simple Box")
operator=""

canvas = tk.Canvas(root, height=400,width=500,bg="White")
canvas.pack()

frame=tk.Frame(root, bg="Light Blue")
frame.place(relwidth=0.9,relheight=0.9, relx=0.05, rely=0.05)

''' function'''
def operation1():
    global number1, number2
    multi_add =tk.Tk()
    multi_add.title("Multiplication and Addition")

    tk.Label(multi_add, font =("Helvetica", 20),
             text="Enter the first number:").grid(row=0)
    tk.Label(multi_add, font =("Helvetica", 20),
             text="Enter the second number").grid(row=1)

    number1=tk.Entry(multi_add)
    number2=tk.Entry(multi_add)
    number1.grid(row=0, column=1)
    number2.grid(row=1, column=1)

def result():
    num3 = float(number1.get()) + float(number2.get())
    num4 = float(number1.get()) * float(number2.get())
    print("the result is ",num3 ,"and", num4)

'''buttons'''
result=tk.Button(frame, text="Result", font=('airal', 30 ,'bold'), height="1"
                 ,width="6", padx=10,pady=5, fg="Black",
                 bg="yellow", command= result)
result.place(x=300 , y=305)

op1=tk.Button(frame, text="operation 1", height="2", width="10", padx=10,
             pady=5, fg="Black", bg="yellow", command = operation1)
op1.place(x = 17, y = 310)


root.mainloop()
...