如何在tkinter中的条目窗口小部件中输出结果

时间:2017-01-18 21:40:18

标签: python function python-3.x tkinter radio-button

我正在努力应对这个小应用程序。我找了很多论坛并回答,但我找不到合适的答案。

我在代码中标记了我遇到的问题:

  • 第一个问题是我找不到在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()

1 个答案:

答案 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()   

而且,正如评论中所说,ab在进行计算之前应该转换为float或int,然后执行"Is %d" % ans或任何其他furas命题在评论中。

我建议你使用这个网站:http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html来获取每个tkinter / ttk小部件的所有选项和方法的列表。