学习笔记(50):Python实战编程-Frame

立即学习:https://edu.csdn.net/course/play/19711/343112?utm_source=blogtoedu

1.Frame:是内嵌布局管理器,针对不同功能的组件进行区域划分,在各自的区域内可以使用不同的布局,但是总的frame布局方式还是一致的

 

 2.以计算器为例

步骤:

1)将组件划分成不同的frame

2)对每一个frame内部的组件进行布局

3)对组件进行事件的绑定

4)最终实现的是一级计算的简单计算器

 

知识点:

1)tkinter.Entry():单行输入文本框

2)tkinter.Text():多行输入文本框

3)event.widget["text"]:获取绑定了该事件的组件上面的文本

4)正则表达式的匹配与分割

5)tkinter.StringVar()

 

完整代码

import tkinter
import re

class Mainwindow():
    #------------在构造方法中创建窗体--------------
    def __init__(self):
        #----------定义窗体-----------
        self.root = tkinter.Tk()
        self.root.geometry("240x300")
        self.root.maxsize(300,300)
        self.root.title("linlianqin计算器")
        self.input_frame()#显示输入区域
        self.button_fram()#显示按钮组区域
        self.root.mainloop()

    #--------------创建各个部分的区域显示,frame----------------
    def input_frame(self):#定义数字输入显示区域,实现功能的显示
        self.inputframe = tkinter.Frame(self.root,width = 20)#文本输入区域创建
        self.content = tkinter.StringVar()#为了修改
        #Entry组件是单行输入的文本输入框,而text是多行输入文本框
        #在文本输入区域进行Entry组件的创建
        self.entry = tkinter.Entry(self.inputframe,textvariable = self.content ,
                                   font = ("微软雅黑",20),fg = "#000000")
        self.clean = False#用于给输入框清0的标记
        self.entry.pack(fill = "x",expand = 1)
        self.inputframe.pack(side = "top")

    def button_fram(self):#定义数字及运算符按钮区域
        #创建按钮组件区域
        self.buttonframe = tkinter.Frame(self.root)
        self.button_list = [[],[],[],[]]
        self.button_list[0].append( tkinter.Button(self.buttonframe,width = 3,text = "1",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[0].append( tkinter.Button(self.buttonframe,width = 3,text = "2",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[0].append( tkinter.Button(self.buttonframe,width = 3,text = "3",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[0].append( tkinter.Button(self.buttonframe,width = 3,text = "+",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[1].append( tkinter.Button(self.buttonframe,width = 3,text = "4",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[1].append( tkinter.Button(self.buttonframe,width = 3,text = "5",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[1].append( tkinter.Button(self.buttonframe,width = 3,text = "6",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[1].append( tkinter.Button(self.buttonframe,width = 3,text = "-",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[2].append( tkinter.Button(self.buttonframe,width = 3,text = "7",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[2].append( tkinter.Button(self.buttonframe,width = 3,text = "8",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[2].append( tkinter.Button(self.buttonframe,width = 3,text = "9",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[2].append( tkinter.Button(self.buttonframe,width = 3,text = "*",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[3].append( tkinter.Button(self.buttonframe,width = 3,text = ".",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[3].append( tkinter.Button(self.buttonframe,width = 3,text = "0",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[3].append( tkinter.Button(self.buttonframe,width = 3,text = "=",font = ("微软雅黑",20),fg = "#000000"))
        self.button_list[3].append( tkinter.Button(self.buttonframe,width = 3,text = "/",font = ("微软雅黑",20),fg = "#000000"))
        self.row = 0
        for button_group in self.button_list:
            self.column = 0
            for self.button in button_group:
                self.button.bind("<Button-1>", lambda event: self.button_handle(event))
                self.button.grid(row = self.row,column = self.column)

                self.column += 1
            self.row += 1
        self.buttonframe.pack(side = "bottom")

    #-----------------------定义事件处理的方法----------------------
    def button_handle(self,event):
        per = event.widget["text"]#可以获得绑定了该事件的组件上的文本

        if self.clean:
            self.content.set("")#清零
            self.clean = False

        if per != "=":#在文本输入框的末端插入新按下的按键的值
            self.entry.insert("end",per)

        elif per == "=":#如果检测到按下的是等号时就进行数学运算
            exp = self.entry.get()#获得输入框中的数学运算表达式
            patter = r"\+|\-|\*|\/"#正则表达式
            nums = re.split(patter,exp)#根据正则表达式分割字符串
            flag = re.findall(patter,exp)[0]#根据正则表达式来找到相应的符号,必须进行取零操作,因为正则返回一个字符串
            result = 0
            if flag == "+":
                result = float(nums[0]) + float(nums[1])#必须将其规定数字类型,因为分割后得到的是字符串
            elif flag == "-":
                result =  float(nums[0]) - float(nums[1])
            elif flag == "*":
                result =  float(nums[0]) * float(nums[1])
            elif flag == "/":
                result =  float(nums[0]) / float(nums[1])
            self.entry.insert("end","=%s"%result)
            self.clean = True




def main():
    Mainwindow()

if __name__ == '__main__':
    main()

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有情怀的机械男

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值