LINUX.ORG.RU

python3. Ошибка.

 ,


0

0

Вот решил учить питон, и написать программу для решения дискриминанта. Python\Tk.
------------------------------------------------------
Traceback (most recent call last):
File «work/pydisc.py», line 32, in <module>
btn = tkinter.Button(text = «Discrim», command = discrim(arg_a, arg_b, arg_c)).pack()
File «work/pydisc.py», line 7, in discrim
float(dis = (b ** 2) - (4 * a * c))
TypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'int
------------------------------------------------------


import math
import tkinter

def discrim(a, b, c):
	float(dis = (b ** 2) - (4 * a * c))
	if (dis == 0):
		x = (-b) / (2 * a)
		print("один корень\n" + "x: " + str(x))
	elif (dis > 0):
		x_one = (-b + math.sqrt(dis)) / (2 * a)
		x_two = (-b - math.sqrt(dis)) / (2 * a)
		print("x1: " + str(x_one) + "\n")
		print("x2: " + str(x_two) + "\n")
	else:
		print("нет вещественного решения\n")

root = tkinter.Tk()
root.geometry("500x500")
root.title("PyDiscrim")

tkinter.Label(text = "Заполните поля\n и нажмите на кнопку").pack(side = "top")

tkinter.Label(text = "a: ").pack(side = "top")
arg_a = tkinter.Entry(background = 'white', foreground = 'black').pack(side = "top")
tkinter.Label(text = "b: ").pack(side = "top")
arg_b = tkinter.Entry(background = 'white', foreground = 'black').pack(side = "top")
tkinter.Label(text = "c: ").pack(side = "top")
arg_c = tkinter.Entry(background = 'white', foreground = 'black').pack(side = "top")

btn = tkinter.Button(text = "Discrim", command = discrim(arg_a, arg_b, arg_c)).pack()

root.mainloop()
[\code]

★★

Последнее исправление: cetjs2 (всего исправлений: 2)

btn = tkinter.Button(text = "Discrim", command = discrim(arg_a, arg_b, arg_c)).pack()

Мне кажется, это не совсем то, чего ты хотел. Первое, что произойдёт при исполнении этой строчки — вызовется discrim(arg_a, arg_b, arg_c), а там в этот момент в лучшем случае какие-то хэндлы пустых текстовых полей. Впрочем, я не специалист по Tkinter.

proud_anon ★★★★★
()
Ответ на: комментарий от daniilArch

Во-первых, dis = float((b ** 2) - (4 * a * c))
Во-вторых, я tkinter не умею, но в arg_a = tkinter.Entry ты переменной присваеваешь либо объект виджета, либо ничего (видимо, ничего). Тебе надо получать значения из полей по нажатию на кнопку, понимаешь?

fludardes ★★
()
Ответ на: комментарий от daniilArch

«Решать дискриминант» слишком косноязычно.

float(dis = (b ** 2) - (4 * a * c))

Ты наставил лишних скобок. К тому же, ты присвоил значение переменной dis, но от того, что ты взял float - ничего не поменялось.

nikolnik ★★★
()
btn = tkinter.Button(text = "Discrim", command = discrim(arg_a, arg_b, arg_c)).pack()

Вместо этого явно надо

btn = tkinter.Button(text = "Discrim", command = discrim)
btn.pack()

А значения полей в discrim так как ты хочешь не передашь.

curufinwe ★★★★★
()
Ответ на: комментарий от curufinwe

А каким образом передать аргументы в дискрим?

daniilArch ★★
() автор топика

Во-первых, у тебя функция discrim вызывается сразу при создании кнопки. В твоём случае нужно использовать лямбду.

Во-вторых, ты пытался передавать Entry, а не текст из них, как аргумент.

В-третьих, ты не привёл значения к float.

В-четвёртых, ты присвоил arg_a, arg_b и arg_c результат выполнения pack().

Вроде, так.

import math
import tkinter

def discrim(a, b, c):
    dis = (b ** 2) - (4 * a * c)
    if (dis == 0):
        x = (-b) / (2 * a)
        print("один корень\n" + "x: " + str(x))
    elif (dis > 0):
        x_one = (-b + math.sqrt(dis)) / (2 * a)
        x_two = (-b - math.sqrt(dis)) / (2 * a)
        print("x1: " + str(x_one) + "\n")
        print("x2: " + str(x_two) + "\n")
    else:
        print("нет вещественного решения\n")

root = tkinter.Tk()
root.geometry("500x500")
root.title("PyDiscrim")

tkinter.Label(text = "Заполните поля\n и нажмите на кнопку").pack(side = "top")

tkinter.Label(text = "a: ").pack(side = "top")
arg_a = tkinter.Entry(root)
arg_a.pack(side = "top")
tkinter.Label(text = "b: ").pack(side = "top")
arg_b = tkinter.Entry(root)
arg_b.pack(side = "top")
tkinter.Label(text = "c: ").pack(side = "top")
arg_c = tkinter.Entry(root)
arg_c.pack(side = "top")

btn = tkinter.Button(text = "Discrim", command = lambda: discrim(float(arg_a.get()), float(arg_b.get()), float(arg_c.get()))).pack()

root.mainloop()
Ceiling_QB ★★★★
()
Ответ на: комментарий от Ceiling_QB

Да, код не стал поправлять. ТС, старайся писать аккуратнее, тогда самому будет понятней, что пишешь. В качестве отступа, кстати, в Python приняты четыре пробела, а не таб.

Ceiling_QB ★★★★
()
Ответ на: комментарий от Ceiling_QB

Спасибо. Я потом настрою таб на 4 пробела. Просто первый день ковыряюсь с tk.

daniilArch ★★
() автор топика
Ответ на: комментарий от Ceiling_QB

Надо просто использовать лямбду.

Не надо.

man tkinter.DoubleVar, tkinter.Entry (опция textvariable)

metrokto ★★
()
Последнее исправление: metrokto (всего исправлений: 1)
Ответ на: комментарий от fludardes

Кмк, не аргументы в discrim передавать, а внутри самой ф-ции discrim запрашивать содержимое текстбоксов.

Стесняюсь спросить, чо? Значит если нужно будет в 3-х местах из 9 разных полей посчитать дискриминант, то нужно будет написать 3 разных функции? Вы либо шутите, либо имеете ввиду некую промежуточную функцию, которая прочитает значение и затем уже вызовет злополучную discrim. Верно?

anonymous
()
Ответ на: комментарий от anonymous

Да, крайне идиотское предложение, признаю. На скорую руку написал. Но я ТСу его ошибку объяснить пытался, а не всё по полочкам разложить.

fludardes ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.