Tkinter 练习

刚接触python gui ,先用tkinger练下手

#!/usr/bin/python
# -*- coding: UTF-8 -*-

#学习简单GUI,练习写个计算器小程序,利用eval
#仅用来熟悉Tkinter和python 不做过多复杂功能
from tkinter import *

class App(object):

    #构造函数初始化.在构造函数中用self.来创建属性并初始化....
    #类下面只能有函数,区分C++
    #类的成员函数第一个参数必须是self
    #类的属性/数据成员要用self.xxxx来声明和初始化
    def __init__(self,master):
        print(master.title() + ':loading')

        #grid方格大小设置
        for r in range(0,6):
            master.grid_rowconfigure(r,pad = 50)
        for c in range(0,3):
            master.grid_columnconfigure(c,pad = 50)

        #按键
        btnText = (
            ('1','2','3'),
            ('4','5','6'),
            ('7','8','9'),
            ('0','+','-'),
            ('*','/','=')
        )

        # 直接写函数只能每个按钮写一个函数,代码很难接受
        # 如果要使用command, lambda 可以做到函数传递函数
        # 也就是同一函数经过lambda 和lambda 的参数包装后 ,不同参数进入生成不同函数形态
        # 就可以做到不用一个BUTTON就写一条函数 ,而是一个"生成函数的函数"解决问题

        # 在下面问题中 lambda 生成的函数都会带着参数调用(指向)同一个函数self.btnClick
        # ------------------------------------------------------------------------------
        # 正确写法 command = (lambda t = btnText[r][c]:self.btnClick(t))
        # 正确写法中 lambda 有一个参数 t ,会根据不同参数生成不同函数 ,返回值与参数相关
        # 可以正确输出跟参数相关的返回值
        # ------------------------------------------------------------------------------
        # 错误写法 command = (lambda :self.btnClick(btnText[r][c]))
        # 错误写法中 lambda 没有参数, 那么只会生成一条函数,所有按钮都指向同一函数
        # 导致最终输出的返回值只有一个(也就是最后一次调用函数的状态)
        # ------------------------------------------------------------------------------

        for r in range(0,5):
            for c in range(0,3):
                b = Button(master,text = btnText[r][c],
                           command = (lambda t = btnText[r][c]:self.btnClick(t)))
                b.grid(row = r + 1,column = c)
                # 这只是个熟悉GUI的练习,使用command
                # 另一种方法使用 bind 绑定按键 和 传递参数 比command更容易扩展

        #标签
        #这里翻车了,记得python对象的属性/数据成员,在构造函数中用self.XXXX声明和初始化
        self.labelTextVar = StringVar() #要改变数据并同步到画面上用Tkinter自带变量类型
        self.labelTextVar.set('testLabel')
        self.lab1 = Label(master,textvariable = self.labelTextVar)
        self.lab1.grid(row = 0,column = 0,columnspan = 3) #列跨度3


    #事件处理函数
    def btnClick(self,t):
        print('click:' + t)

        if t=='=':
            #正则表达式测试输入是否合法
            reMatchRes = re.match(r'^([0-9]{1,}[\+\-\*\/]{1}){1,}[0-9]{1,}$',
                        self.labelTextVar.get())
            if reMatchRes is not None:
                calcRes = eval(self.labelTextVar.get())
                self.labelTextVar.set(calcRes)
                print('re match succes: calc = ' + str(calcRes))
            else:
                self.labelTextVar.set('')
                print('re match fail: clear label')
        else:
            self.labelTextVar.set(self.labelTextVar.get() + t)


#-----------------------------------------------------------------------------------------
root = Tk()
root.title('"title:calcTest"')

app = App(root)
root.mainloop()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值