python datetime时间差_高考倒计时,聊聊Python的GUI

a1a97788248f3711925d5a6f254d742e.png

2020年的高考,虽然因为疫情推迟,但是也要如期而至了。还记得那个紧张、激动又充满斗志,未来无限可能的自己吗?还记得每个教室后面的倒计时吗?今天我们来做个简单的电脑端桌面倒计时,随后聊聊Python的GUI。

Python里写倒计时,还是很简单的,毕竟库多:

import datetimedef getDays(ed):#计算时间差函数,传人结束时间    td=datetime.date.today()    diff=ed-td    return diff.days    strDay="2020-7-7"num=strDay.split('-')#字符串时间转日期时间,方便后面相减edy=datetime.date(int(num[0]),int(num[1]),int(num[2]))print("距离高考还有%d天" % getDays(edy))
但如果我们考虑现实应用场景,真的在班级做一个随机启动的倒计时软件。可能还真得搞个简单的图形界面。
Python做UI,推荐前端做成网页,毕竟网页技术现在足够成熟,各种H5,JS框架让前端也是越来越强大。最主要的,是跨平台,支持各种移动端自适应。但是从教学,特别是中学教学在角度,学生很难有机会体验前端网页与后端Python的对接,毕竟HTML,JS这些没有时间学习。所以,Python面临与当年JAVA一样的囧境,写窗口写起来很“僵”,不过后来JAVA在安卓那里快速发展。 那么Python写窗口程序意义大吗?这一点是毋庸置疑的, 不大。Python本来就是脚本语言出身,现在越来越多的用来写数据处理、智能应用这些高级的后台程序,立足点就不仅仅是Windows的桌面应用。所以要做个正儿八经的窗口程序,我宁愿选择C#的WinForm,哪怕VB也好。

那本文接下来还有意义吗?还是有的,因为我们用到的窗口足够简单。我们目前有三种主要的窗口编程方式:

  1. tkinter : Python的标准Tk GUI工具包的接口,Python内置。
  2. wxpython : Python扩展模块,包装了用C ++编写的流行wxWidgets组件。
  3. PyQT : 基于老牌GUI工具QT,与Python结合而生的库。

第二个网上的可用资料太少,第三个做出来的界面好看,就是使用复杂一点,适合专业一点的界面开发。第一个界面不太好看,但是也还能用,网上资料也挺多,最主要是内置库。教科版的教材,后面也用到了这个库。

所以,今天来简单入门一下,tkinter画窗口的基本用法。

最简单的窗口(仅仅是个空窗口)代码,会复制修改就好:

import tkinter as tk  # 使用Tkinter前需要先导入 # 第1步,实例化object,建立窗口windowwindow = tk.Tk() # 第2步,给窗口的可视化起名字window.title('My Window') # 第3步,设定窗口的大小(长 * 宽)window.geometry('500x300+0+0')  # 这里的乘是小x,加号代表启动位置 # 第4步,主窗口循环显示window.mainloop()# window.mainloop就会让window不断的刷新,如果没有mainloop,就是一个静态的window,传入进去的值就不会有循环,mainloop就相当于一个很大的while循环,有个while,每点击一次就会更新一次,所以我们必须要有循环# 所有的窗口文件都必须有类似的mainloop函数,mainloop是窗口文件的关键的关键。
Win7下长这个样子,和原生的有些出入,还凑合吧:

df647293709947c147a15347201245a6.png

加个最简单的文字标签组件:
import tkinter as tk  # 使用Tkinter前需要先导入 # 第1步,实例化object,建立窗口windowwindow = tk.Tk() # 第2步,给窗口的可视化起名字window.title('My Window') # 第3步,设定窗口的大小(长 * 宽)window.geometry('500x300')  # 这里的乘是小x # 第4步,在图形界面上设定标签l = tk.Label(window, text='你好!this is Tkinter', bg='green', font=('Arial', 12), width=30, height=2)# 说明:bg为背景,font为字体,width为长,height为高,这里的长和高是字符的长和高,比如height=2,就是标签有2个字符这么高 # 第5步,放置标签l.pack()    # Label内容content区域放置位置,自动调节尺寸# 放置lable的方法有:1)l.pack(); 2)l.place();3)l.grid() # 第6步,主窗口循环显示window.mainloop()# 注意,loop因为是循环的意思,window.mainloop就会让window不断的刷新,如果没有mainloop,就是一个静态的window,传入进去的值就不会有循环,mainloop就相当于一个很大的while循环,有个while,每点击一次就会更新一次,所以我们必须要有循环# 所有的窗口文件都必须有类似的mainloop函数,mainloop是窗口文件的关键的关键。

ba88c3d92839348dc024be9d18929854.png

关于这个文字标签的位置,最简单的就是pack(),默认就是从上往下一个组件一个组件的排。当然你也可以用Frame组件套接组件来实现窗口布局。不过如果组件特别多,比如计算器,可能grid按表格分布组件也不错。如果没有时间精力和心思搞这些,就直接place到指定坐标。只是这样程序最大化什么的可能看着不协调 ,毕竟不是相对位置。

我们的程序就是固定大小窗口,所以就直接place了,写死就好:

from tkinter import *from tkinter.font import Fontimport datetime###绘制一个倒计时的窗口rootroot = Tk()root.resizable(False,False)scnWidth,scnHeight = root.maxsize()root.title('加油、坚持、拼搏、努力!')root.geometry('360x160+'+str(scnWidth-360)+'+0')#窗口定位到左上角root['background']='#0094ff'#窗口背景色root.attributes("-alpha", 0.75)#窗口透明度###绘制完成def getDays(ed):#计算时间差函数  td=datetime.date.today()  diff=ed-td  return diff.days###读取文件,获得文字和日期,用于展示文字fp=open('info.txt','r')lines=fp.readlines()endDay=lines[0]ourDay=lines[1]num=lines[0].split('-')edy=datetime.date(int(num[0]),int(num[1]),int(num[2]))x=getDays(edy)str='距离'+ourDay+'还有\n'+str(x)+'天'fp.close()###文字展示完毕###添加一个Label,并设置一个“可变”文字CommandFont = Font(font=('Microsoft Yahei',22))Label1 = Label(root,bg='#0094ff',fg='black',bd='0', font=CommandFont,text=str)Label1.place(x=24, y=40,width=300,height=80)###添加完毕root.mainloop()

于是,就给倒计时程序套了个壳:

b2343dc65bc1eea87f3ef2777147f9e4.png

我们修改了点小细节,透明度啊,位置啊什么的,这些用的时候百度就好。搜了一下,还可以进一步精简,去掉标题栏,窗口上按ESC退出:
root.overrideredirect(True)root.bind('<Escape>', lambda e: root.destroy())

1801d31038744a66f3146decca7296d0.png

最后,就是用pyinstaller打包成exe的过程啦。或者在装了Python的电脑,直接把py改为pyw,双击运行也是没有DOS窗口的。

附一下我们存文字和日期的txt,用来读取信息的:

cf4e515101a7d6acb923ccd4b45a0b51.png

这样,修改文字和时间,这个倒计时,就可以扩展成别的倒计时了。

最简单的tkinter库画窗口,你学会了吗?

了解更多其他组件,可以参考:

https://www.cnblogs.com/shwee/p/9427975.html

c7f93b97c7eb3498eccf6aba23d9777f.png

fdf32aeb7180096420090d77bc362b46.gif 如果期待再次相见,可以点个在看
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值