自学Python笔记:从随机红包小程序学界面的使用

VB随机函数教学设计

昨天和朋友们交流时聊到,原来用VB很容易完成界面的设计,并实现用随机函数设计的红包程序的教学,那么用Python如何实现?折腾的感觉是Python语言优雅、简单,一旦遇到GUI就傻得不要不要的。昨天用了半天的完成了下面的小程序,今天分享一下思路。

Python版随机函数的使用

其实围绕Python有很多的GUI开发框架,如:Kivy、Flexx、PyQt、wxPython、PyGobject等等。学习者完全可以只考虑算法只负责处理业务逻辑而不纠结界面的设计,通过对比后还是选择了标准库自带的Tkinter用于本次练习。

Tkinter

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

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

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) # 指明位置

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)

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)

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

5.messagebox

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

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

1.messagebox

2.filedialog

3.colorchooser

import tkinter.messagebox #需要单独import这个模块

红包算法

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

首先想到的就是随机函数,然后分配时根据所发红包大小及个数随机分配金额,当然这个金额要做一下限制,不然分配可能更不公平,所以在计算时限定最小红包为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

money=0.01

money = round(money * 100) / 100; #这里是为了取小数点后2位

remainSize-=1; #个数减1

remainMoney -= money; #剩余钱数

return money;

#打开红包

def showMoney():

if (remainSize < 1): #如果红包取完就显示警告信息

else:

d=getRandomMoney() #否则就计算获得的红包值并提示

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

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180126G0JQWN00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券