Tkinter

Tkinter是Python下面向tk的图形界面接口库,可以方便地进行图形界面设计和交互操作编程。Tkinter的优点是简单易用、与Python的结合度好。不足之处是缺少可视化界面设计工具,需要通过代码来完成窗口设计和元素布局。不过这个也可以让学习者在大脑中形成界面布局逻辑,也许算收获。

Tkinter在Python 3.x下默认集成,不需要额外的安装操作,只要安装好 Python 之后就能 import Tkinter 库了。

import random
from tkinter import *
master = Tk()
master.title('随机红包程序')
mainloop() #mainloop 是一个主循环,窗口显示出来后等待各种消息,比如鼠标、键盘等操作,本小程序只用一个。
import random
from tkinter import *
master = Tk()
master.title('随机红包程序')
mainloop() #mainloop

是一个主循环,窗口显示出来后等待各种消息,比如鼠标、键盘等操作,本小程序只用一个。

运行上面代码就可以看到窗口界面了,如下:


Tkinter基本应用

考虑随机红包程序界面主要涉及图片、文字标签、输入框、按钮、对话框,对于这几个在这里简单描述一下。

1.PhotoImage

这里我用了一个Frame,因为我发现把这些组件放进窗口排版是个大问题,用Frame可以让思路更清晰一些,Frame就是屏幕上的一块矩形区域,用来作为容器(container)来布局窗体的,除去Frame还有一种LabelFrame,可以定义Title。

frame = Frame(master) # 确定一个框架用于图片显示
frame.pack(padx = 0,pady = 0,side='left') #布局几何管理,用来组织和管理整个父配件区中子配件的布局。Tkinter提供了截然不同的三种几何管理类:pack、grid和place,Pack采用几何管理采用块的方式组织配件。
photo = PhotoImage(file="hb1.gif") #支持gif、png等类型,不支持jpg。
imgLabel = Label(frame, image=photo) # 设置标签并绑定在frame上面
imgLabel.pack(side=TOP) # 指明位置
frame = Frame(master) # 确定一个框架用于图片显示
frame.pack(padx = 0,pady = 0,side='left') #布局几何管理,用来组织和管理整个父配件区中子配件的布局。Tkinter提供了截然不同的三种几何管理类:pack、grid和place,Pack采用几何管理采用块的方式组织配件。
photo = PhotoImage(file="hb1.gif") #支持gif、png等类型,不支持jpg。
imgLabel = Label(frame, image=photo) # 设置标签并绑定在frame上面
imgLabel.pack(side=TOP) # 指明位置
2.Label
这里我重新定义了一个Frame用于布局输入部分,其中用了grid来管理,和上面的pack有区别,这里是为了尝试。
Label(frame2 ,text='总金额 :').grid(row=0,column=4) #定义并显示文字Label
Label(frame2 ,text='红包个数 :').grid(row=1,column=4)
Label(frame2 ,text='留言 :').grid(row=2,column=4)
Label(frame2 ,text='总金额 :').grid(row=0,column=4) #定义并显示文字Label
Label(frame2 ,text='红包个数 :').grid(row=1,column=4)
Label(frame2 ,text='留言 :').grid(row=2,column=4)

3.Entry

Entry 是 Tkinter 用来接收字符串等输入的控件,允许用户输入一行文字。

v1 = StringVar() # 设置用于储存输入数据的变量
v2 = StringVar()
v3 = StringVar()
v3.set('恭喜发财,大吉大利') #显示信息
e1 = Entry(frame2 ,textvariable=v1) #定义输入框
e2 = Entry(frame2 ,textvariable=v2)
e3 = Entry(frame2 ,textvariable=v3)
e1.grid(row=0,column=5,padx=10,pady=5) #利用grid布局显示
e2.grid(row=1,column=5,padx=10,pady=5)
e3.grid(row=2,column=5,padx=10,pady=5)
v1 = StringVar() # 设置用于储存输入数据的变量
v2 = StringVar()
v3 = StringVar()
v3.set('恭喜发财,大吉大利') #显示信息
e1 = Entry(frame2 ,textvariable=v1) #定义输入框
e2 = Entry(frame2 ,textvariable=v2)
e3 = Entry(frame2 ,textvariable=v3)
e1.grid(row=0,column=5,padx=10,pady=5) #利用grid布局显示
e2.grid(row=1,column=5,padx=10,pady=5)
e3.grid(row=2,column=5,padx=10,pady=5)

4.Button

Button是一个标准的Tkinter的部件,用于实现各种按钮的显示和定义触发。

theButton=Button(frame2,text='塞钱进红包',command=callback).grid(row=5,column=4) #调用callback
showButton=Button(frame2,text='打开红包',command=showMoney).grid(row=5,column=5) #调用showMoney
theButton=Button(frame2,text='塞钱进红包',command=callback).grid(row=5,column=4) #调用callback
showButton=Button(frame2,text='打开红包',command=showMoney).grid(row=5,column=5) #调用showMoney

5.messagebox

自python3.0之后关于对话框的模块(messagebox、filedialog、colorchooser)都被收归到了tkinter的下,也就是说在import模块的时候需要注意一下。

Tkinter提供了三种标准的对话框模块,本次主要使用了messagebox 。

1.messagebox

2.filedialog
3.colorchooser
1.messagebox
2.filedialog
3.colorchooser
import tkinter.messagebox #需要单独import这个模块
tkinter.messagebox.showinfo(title='警告',message='你要发的钱呢?!') #显示提示对话框
import tkinter.messagebox #需要单独import这个模块
tkinter.messagebox.showinfo(title='警告',message='你要发的钱呢?!') #显示提示对话框

说到算法其实就是思考这个红包怎么实现分配的,为什么有的人分的多,有的人分的少?

首先想到的就是随机函数,然后分配时根据所发红包大小及个数随机分配金额,当然这个金额要做一下限制,不然分配可能更不公平,所以在计算时限定最小红包为1分,最大不能超过平均数的2倍。基于这个思路实现红包分配的算法如下:

#随机红包函数
def getRandomMoney():
global remainSize # 剩余的红包数量
global remainMoney # 剩余的钱 这个是定义的全局变量,用global声明
if (remainSize == 1): #判断是否是最后一个红包,如果是的话就把所有的钱都分配给它。
remainSize-=1
return round(remainMoney * 100) / 100
rnd=random.random() #定义一随机数0~1之间。
mins = 0.01 #设定一个分配最小值
maxs = remainMoney / remainSize * 2 #设置一个分配的最大值,也就是剩余钱数平均剩余未分配人数的2倍。
money = rnd * maxs #在这个基础上乘以随机数
if (money <= mins): #如果所分配数额小于设定的最小值就按0.01计算。
money=0.01
money = round(money * 100) / 100; #这里是为了取小数点后2位
remainSize-=1; #个数减1
remainMoney -= money; #剩余钱数
return money;
#随机红包函数
def getRandomMoney():
global remainSize # 剩余的红包数量
global remainMoney # 剩余的钱 这个是定义的全局变量,用global声明
if (remainSize == 1): #判断是否是最后一个红包,如果是的话就把所有的钱都分配给它。
remainSize-=1
return round(remainMoney * 100) / 100
rnd=random.random() #定义一随机数0~1之间。
mins = 0.01 #设定一个分配最小值
maxs = remainMoney / remainSize * 2 #设置一个分配的最大值,也就是剩余钱数平均剩余未分配人数的2倍。
money = rnd * maxs #在这个基础上乘以随机数
if (money <= mins): #如果所分配数额小于设定的最小值就按0.01计算。
money=0.01
money = round(money * 100) / 100; #这里是为了取小数点后2位
remainSize-=1; #个数减1
remainMoney -= money; #剩余钱数
return money;
#打开红包
def showMoney():
if (remainSize < 1): #如果红包取完就显示警告信息
tkinter.messagebox.showinfo(title='警告',message='没有红包了!')
else:
d=getRandomMoney() #否则就计算获得的红包值并提示
tkinter.messagebox.showinfo(title='恭喜',message='你获得了'+str(d)+'的红包!')
#打开红包
def showMoney():
if (remainSize < 1): #如果红包取完就显示警告信息
tkinter.messagebox.showinfo(title='警告',message='没有红包了!')
else:
d=getRandomMoney() #否则就计算获得的红包值并提示
tkinter.messagebox.showinfo(title='恭喜',message='你获得了'+str(d)+'的红包!')

当然整体程序完善的话还要考虑数值的输入限制,比如钱数和红包个数必须输入数字。

本次主要学习tkinter的使用,如果感兴趣可以尝试其他Gui框架,或许会有更多的收获,最后提示的是,学习中更要注意学习的方法的学习,更要注意如何解决问题的学习~