IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python学习,第六课(使用tkinter,给程序一个界面) -> 正文阅读

[Python知识库]Python学习,第六课(使用tkinter,给程序一个界面)

突破阶层,更多成长空间

就上节课的结果而言,我们已经制作了由爬虫、随机数、显示形成的综合性互动型程序。
虽然它还可以增加更多功能,比如:数据分析、数据筛选。
但是,它还是仅仅停留在命令行的阶段。
怎么给它突破一下?

基础知识

tkinter库,包含了很多基础的GUI方法,可以让我们创建一个可视化的面板,并提供了一定的个性化配置方式。
这里我们掌握几个基础的:

  1. Frame容器,制作窗体软件的基础,框架控件,可以把其他空间放在frame上。
  2. Label,标签控件(Label)指定的窗口中显示的文本和图像,一般情况不允许修改。
  3. Scale,范围控件;显示一个数值刻度,类似音量调节,get()方法可以获得它的值
  4. Button,按钮控件,顾名思义。
  5. 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")

好了,贴上整段代码,别忘了删除不需要的库:

#encoding: utf-8

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()

大功告成,运行一下试试:
在这里插入图片描述
点击生成后,我们依然愉快的获得了信息。如果不断的点击生成,我们就可以一直得到滑块设置好的结果。

花开之后,努力结果

到目前,我们这个程序经历了失败,获得了阶段性成功。
在阶段性成功的基础上,不断完善,得到了一个比较完善的程序。
在大功告成的基础上,又为他增加了面板。
从现在的结果来看,这个过程是成长的。
从一个不成型的小爬虫,成长成为一个成功的小爬虫。
基于这个成功的小爬虫,蜕变成了一个完整的小程序。
又从一个完整的小程序,突破成一个可用的应用程序。
然而这个面板的样子,还是充满了不成熟。
怎么办呢?继续成长呗!

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:17:17  更:2021-08-08 11:18:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 9:49:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码