今天,我们来使用Python完成一个小工具的制作。很简单,就是对于摄氏温度和华氏温度的相互换算。但是,我们的目的是复习一下之前学过的Python中tkinter的小内容。
复习下前面的知识
先来看下今天要完成的内容
界面效果
最终效果展示
Pmw模块
除了tkinter模块外,我们今天还用了一个叫Pmw的模块,它里面有很多功能丰富的控件,比如,常用的EntryField,就是类似我们今天Label+Entry控件,但是它的功能比简答二者组合的功能要丰富的多,EntryField控件可以对于输入进行限定,这样就不需要我们编写额外的代码了。
省时省力
当然,我们今天不用这个控件了(它封装的太简单了,就几个参数)。我们使用它提供的另外两个控件,Balloon和MessageBar控件,来感受下它们的强大之处。Balloon,顾名思义,就是热气球,对于电脑的话大家第一印象是不是一个类似提示框的东西。
balloon
MessageBar这个控件也好理解,就是信息提示条,这两个东西就是上面图中我用红线框住的内容。
有了信息提示用户获得感会更强
对于EntryField知识感兴趣的小伙伴可以参见我的另外几篇博文
使用Python制作一个GUI词云自动生成工具,让你秒变数据分析大师
详解Python文件对话框filedialog和颜色选择colorchooser的使用
详解GUI词云自动生成工具中词云属性设置界面的实现(连载六)
Python自动生成词云工具(GUI)之数据清洗功能实现(连载五)
详解词云自动生成工具的数据清洗界面制作过程(连载四)
这是个连载的内容,主要制作了一个词云自动生成工具,亲测可用,感兴趣的小伙伴可以自己敲代码试试看,一个不错的工具,可以扩展哦!
这几篇连载内容里有很多关于Pmw模块中的控件……
tkinter的一些技巧
对于GUI界面的制作,我们知道Python有很多库提供了类似的功能和方法,比如wxPython、Qt、Kivy等等,而最为经典的要数我们的tkinter库了,为什么说它经典,因为它集成在了Python开发环境中,我们不需要额外进行安装,而其它第三方库都是需要安装的。
其实说白了,tkinter库的学习,主要是三点:
tkinter不外乎这几个点
控件、事件、布局
对于控件属性其实都是大同小异的,使用多了,自然而然就会了。最主要的还是要掌握好常用的事件处理机制和控件的布局方式。
控件的美观布局使得程序更能面向用户、易操作;而事件处理机制其实是程序的核心,它使得程序可用性更强(试想一大堆漂亮的按钮如果不能点击,那么这些按钮就还是没有用处的)
tkinter中控件的布局其实很简单,单个控件尽量将其放入到Frame、TopLevel这样的容器控件中,这样对于控件与控件之间的留白就更好处理,通过设置容器控件的relief属性,还可以给控件组添加一些边框,使得程序更加美观。
想要美观,布局很重要
对于事件,无非就是鼠标按下了,键盘松开了类似这样的操作。记住几个关键操作也就可以了。但是,这个里面比较重要的就是类、方法、函数在一个控件中是如何绑定的,同一个控件如果同时绑定几个方法的话,首先会调用哪个方法呢?(后续我们会讨论)
对于键盘鼠标的响应事件
布局,无非就是grid、pack、place,掌握这些就基本可以编写一个美观的GUI程序了
废话不多说,我们直接看下今天的代码
代码实现
# coding:utf-8
import Pmw
from tkinter import *
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
def btnCalc():
if is_number(swdVar.get()) and is_number(hwdVar.get()):
print('传入一个数值型即可,两个都是数值没法计算了!')
swdVar.set('')
hwdVar.set('')
elif is_number(swdVar.get()) and not is_number(hwdVar.get()):
# 摄氏温度转换为华氏温度
h = 9 / 5.0 * float(swdVar.get()) + 32
hwdVar.set('{}'.format(h))
elif not is_number(swdVar.get()) and is_number(hwdVar.get()):
# 华氏温度转化为摄氏温度
s = 5 / 9.0 * (float(hwdVar.get()) - 32)
swdVar.set('{}'.format(s))
else:
print("检查填入的数值")
root = Tk()
root.title('温度计算器')
root.geometry('400x250+100+100')
# 添加热气球
balloon = Pmw.Balloon(root)
# 摄氏温度变量
swdVar = StringVar()
f1 = Frame(root, relief='groove', bd=2)
lb1 = Label(f1, text="摄氏温度")
lb1.pack(side=LEFT, padx=5, pady=5)
swd = Entry(f1, textvariable=swdVar)
swdVar.set('输入一个数值')
swd.pack(side=RIGHT, fill=BOTH, expand=YES, padx=5, pady=5)
f1.pack(side=TOP, fill=BOTH, expand=YES, padx=10, pady=10)
balloon.bind(swd, '摄氏温度',
'输入摄氏温度,单击计算按钮后将转化为华氏温度')
# 华氏温度变量
hwdVar = StringVar()
f2 = Frame(root, relief='groove', bd=2)
lb2 = Label(f2, text="华氏温度")
lb2.pack(side=LEFT, padx=5, pady=5)
hwd = Entry(f2, textvariable=hwdVar)
hwd.pack(side=RIGHT, fill=BOTH, expand=YES, padx=5, pady=5)
hwdVar.set('输入一个数值')
f2.pack(side=TOP, fill=BOTH, expand=YES, padx=10, pady=10)
balloon.bind(hwd, "华氏温度",
"输入华氏温度,单击计算按钮后转化为摄氏温度")
# 下面是按钮
f3 = Frame(root)
bcal = Button(f3, text='计算', relief='ridge', bd=2, command=btnCalc)
bcal.pack(side=LEFT, fill=BOTH, expand=YES, padx=10, pady=5)
balloon.bind(bcal, "温度转换",
"上面文本框中输入任意一个单击按钮完成计算")
bext = Button(f3, text='退出', relief='ridge', bd=2, command=root.destroy)
bext.pack(side=RIGHT, fill=BOTH, expand=YES, padx=10, pady=5)
balloon.bind(bext, "退出程序","单击退出程序")
f3.pack(side=TOP, fill=BOTH, expand=YES, padx=5, pady=5)
# 信息条,展示帮助信息
messageBar = Pmw.MessageBar(root,
entry_width=40,
entry_relief='groove',
labelpos='w',
label_text='提示信息:')
# 布局信息条
messageBar.pack(fill=X, expand=YES, side=BOTTOM, padx=10, pady=5)
# 绑定信息条
balloon.configure(statuscommand=messageBar.helpmessage)
root.mainloop()
暂告一段落
好了,今天的内容就到这里了,对于Python GUI感兴趣的小伙伴们可以关注我,后续会推出更多精彩内容。本人近期也在学习一些Python编程的其它内容,会逐步跟大家分享看到的知识点和实例,有意提高Python编程能力的小伙伴一定要关注我,大家一起学习进步……
转载请注明出处,百家号:Python高手养成。