我正在努力应对这个小应用程序。我找了很多论坛并回答,但我找不到合适的答案。
我在代码中标记了我遇到的问题:
第一个问题是我找不到在ttk条目小部件中输出结果的方法。
第二个问题是如何根据检查的无线电按钮执行不同的代码。
第三个问题是如何使用更好的语法编写程序?
代码:
from tkinter import ttk
from tkinter import *
from tkinter import messagebox
class main_window:
def __init__(self, master = None):
self.frame1 = ttk.Frame(master)
self.frame1.pack()
master.title('Calculation program')
master.resizable(False, False)
master.configure(background='blue')
self.radiob1 = ttk.Radiobutton(self.frame1, value="M", text="Molar (M)")
self.radiob1.grid(column=0, row=1, sticky="nw", padx=25)
self.radiob2 = ttk.Radiobutton(self.frame1, value="mM", text="milliMolar (mM)")
self.radiob2.grid(column=0, row=2, sticky="nw", padx=25)
self.mol_weight = ttk.Entry(self.frame1, width=24, font=('Arial', 10))
self.mol_weight.grid(row=0, column=3, padx=3, pady=5)
self.amount = ttk.Entry(self.frame1, width=24, font=('Arial', 10))
self.amount.grid(row=1, column=3, padx=3, pady=5)
self.results = ttk.Entry(self.frame1, width=15, font=('Cambria', 10))
self.results.grid(row=6, column=3, padx=5, pady=5)
ttk.Label(self.frame1, text='Molecular Weight:').grid(row=0, column=1, padx=0, pady=3, sticky='w')
ttk.Label(self.frame1, text='Amount:').grid(row=1, column=1, padx=0, pady=3, sticky='w')
ttk.Label(self.frame1, text='Results').grid(row=5, column=3, padx=0, pady=6, sticky='s')
ttk.Button(self.frame1, text='Calculate',
command=self.calculate).grid(row=4, column=0, padx=5, pady=5, sticky='e')
ttk.Button(self.frame1, text='Clear',
command=self.clear).grid(row=4, column=1, padx=5, pady=5, sticky='w')
def calculate(self):
if self.radiob1.SELECTED??:
return self.molare()
elif self.radiob2.SELECTED??:
return self.millimolar
else:
messagebox.showinfo(title="No good, you have to select one!")
messagebox.showinfo(title='Calculations', message='Calculations Completed!')
def molare(self):
a = self.mol_weight.get()
b = self.amount.get()
ans = a + b
self.results["Results"] = "Is: " + ans [???]
def millimolar(self):
a = self.mol_weight.get()
b = self.amount.get()
ans = a - b
self.results["Results"] = "Is: " + ans [???]
def clear(self):
self.mol_weight.delete(0, 'end')
self.amount.delete(0, 'end')
self.radiob1.DESELECT() ??
self.radiob2.DESELECT()??
def main():
root = Tk()
Main_window = main_window(root)
root.mainloop()
if __name__ == "__main__":
main()
答案 0 :(得分:0)
1)要将文本放入Entry小部件,请使用insert
方法:
entry.delete(0, "end") # clear entry
entry.insert(0, "my text") # insert new text
2)将StringVar与您的radiobuttons关联,并使用其get
方法知道选择了哪个按钮
import tkinter as tk
from tkinter import ttk
def callback():
if var.get() == "r1":
print("r1 is selected")
elif var.get() == "r2":
print("r2 is selected")
else:
print("None")
root = tk.Tk()
var = tk.StringVar(root, value="")
ttk.Radiobutton(root, variable=var, value="r1", text="r1").pack()
ttk.Radiobutton(root, variable=var, value="r2", text="r2").pack()
ttk.Button(root, text="print", command=callback).pack()
root.mainloop()
要清除单选按钮选择,您可以执行var.set("")
。
3)这是一个相当主观的问题。首先,类名通常是大写的。就个人而言,我将Main
类继承自tk.Tk
:
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
# window configuration
self.title('Calculation program')
#...
# widgets
ttk.Label(self, text="example").grid()
#...
self.mainloop()
if __name__ == "__main__":
Main()
而且,正如评论中所说,a
和b
在进行计算之前应该转换为float或int,然后执行"Is %d" % ans
或任何其他furas命题在评论中。
我建议你使用这个网站:http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html来获取每个tkinter / ttk小部件的所有选项和方法的列表。