本案例是一个小小的尝试,主要是使用tk窗体和label控件实现简单的时间显示功能,并实时展现当前的最新时间,形成动态的展示效果。
案例中使用到的知识和技术点:
1、TK窗体的基础属性配置
2、标签(Label)的基础属性配置
3、时间型数据的处理
4、tk窗体的动态更新机制
一、基础知识简介
Tkinter 是 Python 标准 GUI 库,其最初是为 Tcl(这是一门工具命令语言,而不是某个电视机品牌)设计的,由于其良好的可移植性和灵活性,加上非常容易使用,因此逐渐被移植到很多脚本语言中,包括 Perl、Ruby 和 Python。 本章就来重点介绍Tkinter库。由于它是 Python 自带的 GUI 库,因此无须进行额外的下载安装,只要导入 tkinter 包即可。
一个简单的操作案例:
#导入tkinter库,并设置别名为tk
import tkinter as tk
# 创建Tk对象,Tk代表窗口
root =tk.Tk()
# 设置窗口标题
root.title('入门案例')
# 创建Label对象,第一个参数指定该Label放入root
w =tk.Label(root, text="Hello Python!")
# 调用pack进行布局
w.pack()
# 启动主窗口的消息循环
root.mainloop()
输出效果如下:
二、标签(Label)的基础属性配置
(1)修改Label的颜色、字体和大小
w =tk.Label(root, text="Hello Python!",fg='blue',font=("微软雅黑",40))
输出效果如下:
(2)绑定变量
Label控件的属性和用法与text、entry控件基本一致,主要是用于呈现文本和图像信息(本案例只介绍文本信息显示)。 值得注意的是:属性text通常用于实例在第一次呈现时的固定文本, 而如果需要在程序执行后发生变化,则可以使用下列方法之一实现: 1、用控件实例的configure()方法来改变属性text的值,可使显示的文本发生变化; 2、先定义一个tkinter的内部类型变量var=StringVar() 的值也可以使显示文本发生变化。
var=tk.StringVar()
w =tk.Label(root, text="Hello Python!",textvariable=var,fg='blue',font=("微软雅黑",40))
作为测试,这里新增了一个button按钮,并实现按钮的响应操作,然后输出Label中的文本信息。
goBtn = Button(text="测试",command=onGo)
goBtn.pack()
如下代码为实现按钮的响应操作的核心代码,并定义了按钮的响应函数的具体实现逻辑。
def onGo():
print("go go go!")
print(var.get())
最终显示的效果如下:(在命令行窗口打印出label的文本信息)
相关完整的代码如下:
#导入tkinter库,并设置别名为tk
import tkinter as tk
# 创建Tk对象,Tk代表窗口
root =tk.Tk()
# 设置窗口标题
root.title('入门案例')
# 创建Label对象,第一个参数指定该Label放入root
var=tk.StringVar()
w =tk.Label(root, text="Hello Python!",textvariable=var,fg='blue',font=("微软雅黑",40))
var.set("Hello Python!")
# 调用pack进行布局
w.pack()
#测试用途
def onGo():
print("go go go!")
print(var.get())
#测试用途
goBtn = tk.Button(text="测试",command=onGo,fg='blue',font=("黑体",20))
goBtn.pack()
# 启动主窗口的消息循环
root.mainloop()
(3)实现时间的动态显示问题:
通过使用time包里面的时间参数,然后自定义gettime函数,通过root.after(1000, gettime) 每隔1s调用函数 gettime 自身获取时间,实现label文本信息的动态显示时间。
#导入时间库
import time
def gettime():
var.set(time.strftime("%H:%M:%S")) # 获取当前时间
root.after(1000, gettime) # 每隔1s调用函数 gettime 自身获取时间
效果图如下:
三、tk窗口优化
(1)基础属性的设置
上述出来的窗口整体界面是比较单调的,因此通过研究TCL后端的代码,发现可以通过设置参数修改TK的默认的窗口界面,使整体界面更加美观、更加符合我们使用的需要。
root.overrideredirect(1) # 去除窗口边框
root.wm_attributes("-alpha", 0.8) # 透明度(0.0~1.0)
root.wm_attributes("-toolwindow", True) # 置为工具窗口(没有最大最小按钮)
root.wm_attributes("-topmost", True) # 永远处于顶层
最终输出效果如下:
至少比刚开始的时候效果好很多,看起来更美观些了。
(2)TK窗体关闭
由于上面我们把窗体的标题栏隐藏了,因此无法关闭,那么我们只能通过自己定义退出函数,让窗体退出和关闭。本案例通过按下任意键盘退出程序。核心代码如下:
def myquit(*args):
root.destroy()
root.bind("", myquit)
(3)TK窗体移动
通过上述步骤,窗体还是无法按照我们的需要进行移动,那么我们实现鼠标响应操作,实现TK窗体拖动的问题。相关核心代码如下:
def StartMove(event):
global x, y
x = event.x
y = event.y
def StopMove(event):
global x, y
x = None
y = None
def OnMotion(event):
global x, y
deltax = event.x - x
deltay = event.y - y
root.geometry("+%s+%s" % (root.winfo_x() + deltax, root.winfo_y() + deltay))
root.update()
print(event.x,event.y,root.winfo_x(),root.winfo_y(),root.winfo_width(),root.winfo_height())
root.bind("", StartMove) #监听左键按下操作响应函数
root.bind("", StopMove) #监听左键松开操作响应函数
root.bind("", OnMotion) #监听鼠标移动操作响应函数
最终效果展示图如下:
四、pyinstaller程序打包成exe:
通过上述一系列的代码实现,已经基本上形成了一个可以执行的动态浮动实时显示时钟的一个小软件,但是这个软件还是依赖于python的运行环境,如果我们需要发布出去给别人使用,那么我们就必须使用pyinstaller进行打包成可执行的exe程序,那么就可以正常发布和分享使用了。
相关的操作命令如下:(可以通过设置pyinstaller的环境变量访问,也可以直接在python的安装路径下进行编译访问)
pyinstaller -w py文件的存储路径
如本次案例,我通过在python的路径下直接运行pyinstaller进行编译。
E:\Python37\Scripts>pyinstaller -w D:\code\time_final.py
最后非常感谢大家看完了本次案例的分享,如果大家需要源码,欢迎关注我的微信公众号(俊哥随笔),感谢大家的支持!