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写功能确实比较快,但是因为经验问题,千人代码千面;不妨为初恋