python3 tkinter grid布局制作案例

python3 tkinter grid布局制作案例

  • CMD黑框版本
import datetime
import os


def count_minutes():
    print(">>>>>>>>>>计算分钟>>>>>>>>")
    try:
        flag = 1
        while flag:
            t1 = input("开始时间(yyyymmdd HHMM):\n")
            t2 = input("结束时间(yyyymmdd HHMM):\n")

            # 定义的日期格式需与当前时间格式一致
            d1 = datetime.datetime.strptime(t1, '%Y%m%d %H%M')
            d2 = datetime.datetime.strptime(t2, '%Y%m%d %H%M')

            d = d2 - d1
            print(d1, "~", d2, "相差【", d.days * 24 * 60 + d.seconds / 60, "】分钟")
            input("请回车计算下一个:\n")
    except:
        os.system("cls")        # 输入错误会清屏,重新载入
        count_minutes()


count_minutes()
  • gui版本 countTime.py
import datetime
from tkinter import *  


class App:
    def __init__(self, master):
        # 使用Frame添加容器
        frame1 = Frame(master)
        # 采用grid网格布局,添加控件
        lb_time1 = Label(frame1, text=u'起始时间:', font=('微软雅黑', 12), padx=7)
        lb_time2 = Label(frame1, text=u'终止时间:', font=('微软雅黑', 12), padx=7)
        lb_time1.grid(row=0, column=0, sticky=W)
        lb_time2.grid(row=1, column=0, sticky=W)

        en_time1 = Entry(frame1, font=('微软雅黑', 13), width=15, show=None)
        en_time2 = Entry(frame1, font=('微软雅黑', 13), width=15, show=None)
        en_time1.grid(row=0, column=1, columnspan=2)
        en_time2.grid(row=1, column=1, columnspan=2)

        bt_count = Button(frame1, text=u'计算分钟', bg='light blue', font=('微软雅黑', 15), fg='white')
        bt_count.grid(row=2, column=1, sticky=W, pady=10)

        btn_exit = Button(frame1, bg='pink', font=('微软雅黑', 15), fg='white', text="退出", command=exit_btn)
        btn_exit.grid(row=2, column=2, sticky=E, pady=5)

        lb_result = Label(frame1, bg="light green", text=u'结果:', font=('微软雅黑', 12), padx=7)
        lb_minute = Label(frame1, text=u'分钟', font=('微软雅黑', 12), padx=7)
        lb_minute.grid(row=3, column=2, sticky=W)
        lb_result.grid(row=3, column=0, sticky=W)
        text_result = Text(frame1, font=('微软雅黑', 12), height=2, width=15)
        text_result.grid(row=3, column=1, sticky=W)

        bt_count.config(command=lambda: minutes_count(en_time1, en_time2, text_result))     # 用lambda传多参

        frame1.grid(row=3, column=2)


def minutes_count(en_time1, en_time2, text_result):
    text_result.delete('1.0', 'end')        # 先清空
    t1 = en_time1.get()
    t2 = en_time2.get()
    try:
        d1 = datetime.datetime.strptime(t1, '%Y%m%d %H%M')
        d2 = datetime.datetime.strptime(t2, '%Y%m%d %H%M')
        d = d2 - d1
        result = d.days * 24 * 60 + d.seconds / 60
        print(type(result))
        text_result.insert('insert', int(result))
    except:
        text_result.insert('insert', "输入错误,请重试")


def exit_btn():
    root.destroy()


root = Tk()
root.title("分钟计算器")
width, height, padx, pady = 300, 200, 700, 250
root.geometry('%dx%d-%d+%d' % (width, height, padx, pady))
root.attributes('-toolwindow', False,
                '-alpha', 0.99,
                '-fullscreen', False,
                '-topmost', False)
display = App(root)
root.mainloop()
  • 正确输入案例

正确示范

  • 错误输入案例
    错误输入案例
  • 用pyinstaller将py文件打包成exe可执行文件

生成spec文件:

pyinstaller -F countTime.py --noconsole

–noconsole 参数:不带控制台

生成exe文件【位置在源代码目录生成的dist/下】

pyinstaller countTime.spec

可执行文件地址:
countTime4Yajing.exe

  • 代码解析

关于python3 字符串转时间类型处理、错误处理:
输入的字符串格式是yyyymmdd HHMM,用datetime.datetime.strptime(t1, ‘%Y%m%d %H%M’)将字符串类型匹配成<class ‘datetime.datetime’>类型,然后做计算;
用try except进行错误处理,这样输入错误的格式就在下面的结果Text框给提示即可。

关于tkinter布局:
最开始我采用的是三种布局方式的pack方式,八个方向拉不拉满干涩难掰扯,改成grid布局方式后,逻辑上清晰,做出东西比较快。

用到的几个基础组件:Label标签显示简单文本、Entry输入框接收输入字符、Button按钮控制函数逻辑。

细节点:关于Button传参,用lambda控制传入多个参数和对象;退出按钮最初命令参数配置的是quit或者exit,在执行py文件时候运行正常但是打包出来的exe识别不了这个函数,应该是依赖问题,后来改成自定义函数,将对窗口对象root的destory销毁方法直接放了进去,解决此问题。

  • 总结:python写功能确实比较快,但是因为经验问题,千人代码千面;不妨为初恋
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值