自學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框架,或許會有更多的收穫,最後提示的是,學習中更要注意學習的方法的學習,更要注意如何解決問題的學習~
TAG:Python |