如何在Tkinter中定义组合框类以创建简单的计算

时间:2013-06-07 15:59:42

标签: python combobox tkinter

尝试使用Classes在tkinter中使用组合框创建简单计算时遇到问题。对我来说这很棘手,很难理解!希望你能帮助我。

提前致谢。

埃克托。

这是我的代码:

from Tkinter import *
import ttk
from ttk import Combobox

root= Tk()
root.minsize(550,450)
root.maxsize(560,460)
root.title('myAPP')

class Calculation:
    def __init__(self, parent):
        self.parent = parent
        self.Value1()
        self.Value2()
        self.Result()

        Label(self.parent,text='Num 1').grid(column=2, row=5,sticky=W,pady=3)
        Label(self.parent,text='Num 2').grid(column=2, row=6,sticky=W,pady=3)
        Label(self.parent,text='result').grid(column=9,row=9,sticky=W,pady=3)

        self.msg =Label(self.parent,text='Sum of 2 number')
        self.msg.grid(row=3,column=1,columnspan=2)

        self.Button =Button(text='Calculate',width=8,command =self.Result)
        self.Button.grid(row=9,column=2,padx=2,pady=3)

    def Value1(self):
        self.field1 = StringVar()
        self.field1 = ttk.Combobox(self.parent, textvariable= self.field1)
        self.field1['values'] = ('5', '6', '7')
        self.field1.grid(column=3, row=5)

    def Value2(self):
        self.field2 = StringVar()
        self.field2 = ttk.Combobox(self.parent, textvariable=self.field2)
        self.field2['values'] = ('1', '2', '3')
        self.field2.grid(column=3, row=6)

    def Result(self):
        self.entry = StringVar()
        self.entry = ttk.Entry(self.parent, textvariable = self.entry)
        #self.entry = field1 + field2 ----> Here is the problem I have!
        self.entry.grid(column=3, row=9)

#End Code
if __name__ == '__main__':
    app = Calculation (root) 
    root.mainloop()

3 个答案:

答案 0 :(得分:1)

from Tkinter import *
import ttk

root= Tk()
root.minsize(550,450)
root.maxsize(560,460)
root.title('myAPP')

class Calculation:
    def __init__(self, parent):
        self.parent = parent
        self.Value1()
        self.Value2()
        self.Result()

        Label(self.parent,text='Num 1').grid(column=2, row=5, sticky=W, pady=3)
        Label(self.parent,text='Num 2').grid(column=2, row=6, sticky=W, pady=3)
        Label(self.parent,text='result').grid(column=9,row=9, sticky=W, pady=3)

        self.msg = Label(self.parent,text='Sum of 2 number')
        self.msg.grid(row=3,column=1,columnspan=2)

    def Value1(self):
        self.field1_value = StringVar()
        self.field1_value.trace('w', self.Calc)
        self.field1 = ttk.Combobox(self.parent, textvariable=self.field1_value)
        self.field1['values'] = ('5', '6', '7')
        self.field1.grid(column=3, row=5)

    def Value2(self):
        self.field2_value = StringVar()
        self.field2_value.trace('w', self.Calc)
        self.field2 = ttk.Combobox(self.parent, textvariable=self.field2_value)
        self.field2['values'] = ('1', '2', '3')
        self.field2.grid(column=3, row=6)

    def Result(self):
        self.entry = StringVar()
        self.entry = ttk.Entry(self.parent, textvariable=self.entry)
        self.entry.grid(column=3, row=9)

    def Calc(self, *args):
        self.entry.delete(0, END)
        try:
            value = int(self.field1.get()) + int(self.field2.get())
        except ValueError:
            self.entry.insert(0, 'Input numbers.')
        else:
            self.entry.insert(0, str(value))

if __name__ == '__main__':
    app = Calculation(root) 
    root.mainloop()

我将Result方法拆分为两个方法:Result,Calc

  • Result():创建一个显示总和的条目小部件。这只被调用一次(当创建Calculation对象时。)
  • Calc():计算总和并显示它。单击“计算”按钮时会调用此方法。

修改   - 删除按钮。   - 将textvariable(field1_value,field2_value)附加到组合框。   - 当变量更改(= comboxbox值更改)时,使用StringVar.trace

调用Calc()

答案 1 :(得分:0)

我认为这是你想要完成的事情:

from Tkinter import *
import ttk
from ttk import Combobox

class Calculation(object):
    def __init__(self, parent):
        self.parent = parent
        self.create_widgets()

    def create_widgets(self):
        self.msg = Label(self.parent, text='Sum of 2 numbers:')
        self.msg.grid(row=3, column=1, columnspan=2)

        Label(self.parent, text='Num 1').grid(row=5, column=2, sticky=W, pady=3)
        self.number1 = IntVar()
        self.widget1 = ttk.Combobox(self.parent, textvariable=self.number1)
        self.widget1['values'] = '5', '6', '7'
        self.widget1.grid(row=5, column=3)

        Label(self.parent, text='Num 2').grid(row=6, column=2, sticky=W, pady=3)
        self.number2 = IntVar()
        self.widget2 = ttk.Combobox(self.parent, textvariable=self.number2)
        self.widget2['values'] = '1', '2', '3'
        self.widget2.grid(row=6, column=3)

        self.button = Button(text='Calculate', command=self.calculate_result)
        self.button.grid(row=9, column=2, padx=2, pady=3)
        self.result = StringVar()
        self.widget3 = ttk.Entry(self.parent, textvariable=self.result)
        self.widget3.grid(row=9, column=3)
        Label(self.parent, text='result').grid(row=9, column=9, sticky=W, pady=3)

    def calculate_result(self):
        self.result.set(self.number1.get() + self.number2.get())

if __name__ == '__main__':
    root= Tk()
    root.minsize(550, 450)
    root.maxsize(560, 460)
    root.title('myAPP')
    app = Calculation(root)
    root.mainloop()

我还强烈建议您阅读并开始遵循PEP 8 -- Style Guide for Python Code中的建议,特别是有关代码中实体命名的建议。另外,我认为如果你在关键字参数的排序和它们的间距方面更加一致,那么它将是你编码风格的一个很大的改进。在早期建立正确的事情是很好的,这样他们就会成为你以后甚至不必考虑做的习惯。

答案 2 :(得分:0)

您的界面代码将分为两部分:将在初始化时运行的小部件描述以及应用程序的动态行为。

您已经拥有GUI的描述。对于该行为,在按钮上定义command是一个良好的开端,但此代码看起来不像您的Result方法(创建条目)。在此方法(称为回调)中,您将操纵现有对象:读取comboxbox的值,设置条目的新值...例如(改编自falsetru's answer

self.button  = Button(... , command=self.calcultate)

def calculate(self):
    self.entry.delete(0, END)
    value = int(self.field1.get()) + int(self.field2.get())
    self.entry.insert(0, str(value))

还有其他方法可以定义应用程序的行为,例如,您可以将variables与值(条目,组合框......)关联到窗口小部件,并在修改此变量后立即触发操作:

self.number1 = IntVar()
self.field1 = ttk.Combobox(self.parent, textvariable=self.number1)


self.number1.trace("w", self.calculate) 

(请注意,我选择使用IntVar来避免需要int()解析前一个解决方案。)

为避免用户在组合框中输入非数字时出错,您可以在读取值时捕获异常,或使用验证命令禁止非数字输入。

def ensure_digit(candidate_string):
    return candidate_string.isdigit()

self.field1.config(validate = "key", validatecommand =(self.field1.register(ensure_digit),  "%S"))