Python学习第六课(做个界面,让使用者更加简单)
突破阶层,更多成长空间
就上节课的结果而言,我们已经制作了由爬虫、随机数、显示形成的综合性互动型程序。 虽然它还可以增加更多功能,比如:数据分析、数据筛选。 但是,它还是仅仅停留在命令行的阶段。 怎么给它突破一下?
基础知识
tkinter库,包含了很多基础的GUI方法,可以让我们创建一个可视化的面板,并提供了一定的个性化配置方式。 这里我们掌握几个基础的:
- Frame容器,制作窗体软件的基础,框架控件,可以把其他空间放在frame上。
- Label,标签控件(Label)指定的窗口中显示的文本和图像,一般情况不允许修改。
- Scale,范围控件;显示一个数值刻度,类似音量调节,get()方法可以获得它的值。
- Button,按钮控件,顾名思义。
- StringVar,用来设置内容,如果其内容被修改,标签文本将自动更新。
尝试创建一个面板
了解了基础知识,我们来尝试创建一个面板,准备为第五课的程序加上脸面。
from tkinter import *
from tkinter import messagebox
def show():
jg = str(slred.get())+" "+str(slblue.get())
messagebox.showinfo("结果", jg)
root = Tk()
root.geometry("600x300+400+400")
main = Frame(root)
slred = Scale(main, from_=6, to=33, orient="horizontal", tickinterval=1, length=500, label="红球", sliderlength="10", sliderrelief="flat", width="5")
slblue = Scale(main, from_=1, to=16, orient="horizontal", tickinterval=1, length=500, label="蓝球", sliderlength="10", sliderrelief="flat", width="5")
b1 = Button(main, text ="生成", command=show)
slred.pack()
slblue.pack()
b1.pack()
main.pack()
root.mainloop()
我们创建了一个根面板,大小为600×300,起始位置在屏幕的(400,400)。 然后在根面板上放置了一个主Frame容器。 在容器中,我们放置了两个Scale控件,一个代表红球,一个代表蓝球,刻度就是可以生成的数量范围。(是不是杜绝了输入不规范的问题?) 然后我们设置了一个“生成”按钮,点击就会执行上面的show方法 在show方法中,我们使用Scale控件的get方法获取当前的值,并弹框出来,让我们知道程序是否成功。 好的,运行一下试试: 是成功的。
有机结合,生产加工
下面,我们就把这段代码导入上节课的代码主程序中,同时对上面的生产、打印部分做个简单修改。 首先,主程序中,暂时删除运行代码。 同时,加入刚才的代码,并把爬取开奖信息的代码拿出到主程序中,这样在打开程序的时候就可以看到开奖信息了。
if __name__ == "__main__":
root = Tk()
root.geometry("600x300+400+400")
root.title("双色球小程序")
main = Frame(root)
v = StringVar()
code = getNum()
check = checkUrl(code)
Ltitle = Label(main, text="上一期("+code+")开奖结果: ", font=("宋体", 16, "bold"), width="600", bd="2", anchor="w")
LRed = Label(main, text="红球:"+check['red'], font=("宋体", 12, "bold"), width="600", bd="2", fg="RED")
LBlue = Label(main, text="蓝球:"+check['blue'], font=("宋体", 12, "bold"), width="600", bd="2", fg="BLUE")
slred = Scale(main, from_=6, to=33, orient="horizontal", tickinterval=1, length=500, label="红球", font=("宋体", 10, "bold"), fg="RED", sliderlength="10", sliderrelief="flat", width="5")
slblue = Scale(main, from_=1, to=16, orient="horizontal", tickinterval=1, length=500, label="蓝球", font=("宋体", 10, "bold"), fg="BLUE", sliderlength="10", sliderrelief="flat", width="5")
LAnswer = Label(main, textvariable = v, font=("宋体", 12, "bold"), width="600", bd="2")
v.set("恭喜發財!")
b1 = Button(main, text ="生成", command=runThis)
Ltitle.pack()
LRed.pack()
LBlue.pack()
slred.pack()
slblue.pack()
LAnswer.pack()
b1.pack()
main.pack()
root.mainloop()
这段代码中,我们设置了上一期开奖结果的展示区,彩票的选择区,和结果的显示区。 那么在之前的方法里,还要做一些修改。 结果的展示将不再打印在命令行里,而是显示在Answer标签中,我们在标签里设置了一个可更改的内容区,所以在原方法中,我们只需要把结果交给可变的StringVar控件就好。
def runThis():
jg = ""
rn = slred.get()
bn = slblue.get()
red = []
blue = []
newTicket(red, rn, blue, bn)
ticket = needTickets(rn, bn)
jg = "红球:" + str(red) + "\n蓝球:" + str(blue)
jg += "\n您所选号码共需要: " + str(ticket) + " 注, \n金额: ¥" + str(ticket*2)
v.set(jg)
其他部分就不必修改了。 值得注意的是,我们在设置Label的时候,加入了一些个性化设置。 比如,显示爬虫结果的Label,我们设置成了红色字,宋体,12号加粗,其他的部分也进行了对应的设置,只需要仔细读一下代码即可明白它的意思。
LRed = Label(main, text="红球:"+check['red'], font=("宋体", 12, "bold"), width="600", bd="2", fg="RED")
好了,贴上整段代码,别忘了删除不需要的库:
from urllib import request
from urllib import parse
from datetime import datetime
import random
import math
import json
import os
from tkinter import *
def newRedBall():
num = random.randint(1, 33)
return num
def newBlueBall():
num = random.randint(1, 16)
return num
def newTicket(red, rn, blue, bn):
while len(red) < rn:
temp = newRedBall()
if not(temp in red):
red.append(temp)
temp = 0
red.sort()
while len(blue) < bn:
temp = newBlueBall()
if not(temp in blue):
blue.append(temp)
temp = 0
blue.sort()
return(red, blue)
def needTickets(rn, bn):
n1 = math.factorial(rn)
n2 = math.factorial(rn-6)
n3 = math.factorial(6)
n = (n1/n2/n3)*bn
return n
def checkUrl(number):
Request_URL = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findKjxx/forIssue'
From_Data = {
'name' : 'ssq',
'code' : number
}
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0",
'Referer': 'http://www.cwl.gov.cn/kjxx/ssq/'
}
From_Data = parse.urlencode(From_Data)
req = request.Request(url = Request_URL, data = bytes(From_Data,encoding = 'utf-8'), headers = header)
res = request.urlopen(req)
str_json = res.read().decode('utf-8')
myjson = json.loads(str_json)
info = myjson['result']
return(info[0])
def getNum():
time = datetime.now().isocalendar()
day = datetime.today()
if int(time[2]) == 1:
num = int(time[1]-1)*3
elif int(time[2]) == 2:
num = int(time[1]-1)*3
if day.hour >= 22 :
num += 1
elif int(time[2]) == 3:
num = int(time[1])*3-2
elif int(time[2]) == 4:
num = int(time[1])*3-2
if day.hour >= 22 :
num += 1
elif int(time[2]) == 5:
num = int(time[1])*3-1
elif int(time[2]) == 6:
num = int(time[1])*3-1
else:
num = int(time[1])*3-1
if day.hour >= 22 :
num += 1
if int(day.month) > 3:
num -= 4
elif int(day.month) > 10:
num -= 2
if num < 100:
code = str(time[0]) + "0" + str(num)
else:
code = str(time[0]) + str(num)
return(code)
def runThis():
jg = ""
rn = slred.get()
bn = slblue.get()
red = []
blue = []
newTicket(red, rn, blue, bn)
ticket = needTickets(rn, bn)
jg = "红球:" + str(red) + "\n蓝球:" + str(blue)
jg += "\n您所选号码共需要: " + str(ticket) + " 注, \n金额: ¥" + str(ticket*2)
v.set(jg)
if __name__ == "__main__":
root = Tk()
root.geometry("600x300+400+400")
root.title("双色球小程序")
main = Frame(root)
v = StringVar()
code = getNum()
check = checkUrl(code)
Ltitle = Label(main, text="上一期("+code+")开奖结果: ", font=("宋体", 16, "bold"), width="600", bd="2", anchor="w")
LRed = Label(main, text="红球:"+check['red'], font=("宋体", 12, "bold"), width="600", bd="2", fg="RED")
LBlue = Label(main, text="蓝球:"+check['blue'], font=("宋体", 12, "bold"), width="600", bd="2", fg="BLUE")
slred = Scale(main, from_=6, to=33, orient="horizontal", tickinterval=1, length=500, label="红球", font=("宋体", 10, "bold"), fg="RED", sliderlength="10", sliderrelief="flat", width="5")
slblue = Scale(main, from_=1, to=16, orient="horizontal", tickinterval=1, length=500, label="蓝球", font=("宋体", 10, "bold"), fg="BLUE", sliderlength="10", sliderrelief="flat", width="5")
LAnswer = Label(main, textvariable = v, font=("宋体", 12, "bold"), width="600", bd="2")
v.set("恭喜發財!")
b1 = Button(main, text ="生成", command=runThis)
Ltitle.pack()
LRed.pack()
LBlue.pack()
slred.pack()
slblue.pack()
LAnswer.pack()
b1.pack()
main.pack()
root.mainloop()
大功告成,运行一下试试: 点击生成后,我们依然愉快的获得了信息。如果不断的点击生成,我们就可以一直得到滑块设置好的结果。
花开之后,努力结果
到目前,我们这个程序经历了失败,获得了阶段性成功。 在阶段性成功的基础上,不断完善,得到了一个比较完善的程序。 在大功告成的基础上,又为他增加了面板。 从现在的结果来看,这个过程是成长的。 从一个不成型的小爬虫,成长成为一个成功的小爬虫。 基于这个成功的小爬虫,蜕变成了一个完整的小程序。 又从一个完整的小程序,突破成一个可用的应用程序。 然而这个面板的样子,还是充满了不成熟。 怎么办呢?继续成长呗!
|