これで一応動くと思うわ!
Python
1### 該当のソースコード
2
3import sympy as sym
4
5from tkinter import *
6from tkinter import ttk
7from tkinter import messagebox as mb
8
9class gui():
10 def __init__(self, master=None):
11
12 la1 = ttk.Label(root, text ='ax^2 + bx + c = 0')
13 la1.pack()
14
15 la2 = ttk.Label(root, text ='Enter values for a, b and c:')
16 la2.pack()
17
18 la3 = ttk.Label(root, text ='a =')
19 la3.pack()
20 self.en3 = ttk.Entry(root)
21 self.en3.pack()
22
23 la4 = ttk.Label(root, text ='b =')
24 la4.pack()
25 self.en4 = ttk.Entry(root)
26 self.en4.pack()
27
28 la5 = ttk.Label(root, text ='c =')
29 la5.pack()
30 self.en5 = ttk.Entry(root)
31 self.en5.pack()
32
33 computebutton = ttk.Button(root, text ='Compute', command = self.compute)
34 computebutton.pack()
35
36 helpbu = ttk.Button(root, text ='Help', command = self.help_button)
37 helpbu.pack()
38
39 quitbu = ttk.Button(root, text ='Quit', command = self.quit_button)
40 quitbu.pack()
41
42 self.la6 = ttk.Label(root, text ='x = ')
43 self.la6.pack()
44
45 def compute(self):
46 a = self.en3.get()
47 b = self.en4.get()
48 c = self.en5.get()
49 sym.init_printing()
50 a, b, c, x = sym.symbols("{} {} {} x".format(a, b, c))
51 ans = sym.solveset(a*x**2 + b*x + c, x)
52 self.la6.configure(text = "x = " + str(ans))
53 print(type(ans))
54
55 def help_button(self):
56 mb.showinfo('Help', 'You can only enter integers.')
57
58 def quit_button(self):
59 root.destroy()
60
61if __name__ == '__main__':
62 root = Tk()
63 root.title("Quadratic Equations Calculator")
64 root.geometry('400x400+0+0')
65 gui(root)
66 root.mainloop()
67
追記:
sym.solveset() の戻り値は数式みたいだから eval() で計算してみたわ。
でもこのコードだと解が虚数のときは解けないわ。
整数のみで表示する方法だけれど、float型の変数が整数かどうかをis_integer()で調べて、Trueの場合はint型に変換してみたわ。
Classを使った理由は見やすくするためよ。
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import sympy as sym
from numpy import sqrt
def isOk(diff):
if not diff.encode('utf-8').isdigit():
# 妥当でない(半角数字でない)場合はFalseを返却
return False
# 妥当(半角数字である)の場合はTrueを返却
return True
root = Tk()
tcl_isOk = root.register(isOk)
root.title("Quadratic Equations Calculator")
root.geometry('400x400')
la1 = ttk.Label(root, text ='ax^2 + bx + c = 0')
la1.pack(pady=20)
la2 = ttk.Label(root, text ='Enter values for a, b and c:')
la2.pack(pady=20)
la3 = ttk.Label(root, text ='a =')
la3.pack()
en3 = ttk.Entry(root, validate='key', validatecommand=(tcl_isOk, '%S'))
en3.pack()
la4 = ttk.Label(root, text ='b =')
la4.pack()
en4 = ttk.Entry(root, validate='key', validatecommand=(tcl_isOk, '%S'))
en4.pack()
la5 = ttk.Label(root, text ='c =')
la5.pack()
en5 = ttk.Entry(root, validate='key', validatecommand=(tcl_isOk, '%S'))
en5.pack()
def compute_button():
a = en3.get()
b = en4.get()
c = en5.get()
c = -1
#sym.init_printing()
a, b, c, x = sym.symbols("{} {} {} x".format(a, b, c))
ans = sym.solveset(a*x**2 + b*x + c, x)
ans_1 = eval(str(list(ans)[0]))
ans_2 = eval(str(list(ans)[1]))
if ans_1.is_integer():
la6.configure(text = "x = " + str(int(ans_1)))
else:
la6.configure(text = "x = " + str(ans_1))
if ans_1.is_integer():
la6.configure(text = "x = " + str(int(ans_2)))
else:
la6.configure(text = "x = " + str(ans_2))
computebutton = ttk.Button(root, text ='Compute', command = compute_button)
computebutton.pack()
def help_button():
messagebox.showinfo('Help', 'You can only enter integers.')
helpbutton = ttk.Button(root, text ='Help', command = help_button)
helpbutton.pack(pady=3)
def quit_button():
root.destroy()
quitbutton = ttk.Button(root, text ='Quit', command = quit_button)
quitbutton.pack(pady=3)
la6 = ttk.Label(root, text ='x = ')
la6.pack()
la7 = ttk.Label(root, text ='x = ')
la7.pack()
root.mainloop()