使用Python实现NBA球员数据查询小程序功能


Posted in Python onNovember 09, 2020

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

以下文章来源于早起Python ,作者投稿君

一、前言

有时将代码转成带有界面的程序,会极大地方便使用,虽然在网上有很多现成的GUI系统,但是套用别人的代码,心里难免有些尴尬,所以本文将用Python爬虫结合wxpython模块构造一个NBA爬虫小软件

使用Python实现NBA球员数据查询小程序功能

使用Python实现NBA球员数据查询小程序功能

本文框架构造将分为二个部分讲解:

  • 构建GUI界面举例套用爬虫框架
  • 主要涉及的Python模块有
  1. requests
  2. wx
  3. pymysql
  4. pandas

二、GUI界面设计

首先介绍下流程:GUI界面设计讲解插入界面背景图片

设计GUI界面的代码思路其实很简单,首先导入wx库

import wx

这里引用的模块是wxpython模块,建立GUI的模块很多,常见的有PyQt、Tkinter等。这些模块各有各的优缺点,读者可以翻阅相关资料进行选择。

class MyFrame(wx.Frame):
 def __init__(self, parent, id):
 wx.Frame.__init__(self, parent, id, 'titlename',size=(400, 300))
 panel = wx.Panel(self)
 self.bt_confirm = wx.Button(panel, label='name1')
 self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)
 self.bt_cancel = wx.Button(panel, label='name2')
 self.bt_cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)
 self.InitUI()

定义全局变量对于初级的GUI来说就是构建一个形式窗口+按钮布置,不需要自建一个模块。但对于高级的GUI诸如投资系统而言,全局变量是尤为重要的,换句话说全局变量需要放在一个py文件中初始化。

上述代码是创建部分的代码,个性化布局需要添加容器进行设置,稍后会在总代码中呈现。

def InitUI(self):
 """ 点击InitUI,执行方法 """
 
 def OnclickSubmit(self,event):
 """ 绑定OnclickSubmit事件 """

简单来说就是绑定事件,该事件是你点击对应按钮产生的效果。这部是整个GUI的核心,如果你在做签到系统,那么你就要绑定一个导入员工名单txt文件的事件。

if __name__ == '__main__':
 app = wx.App()   # 初始化
 frame = MyFrame(parent=None,id=-1) 
 frame.Show()   
 app.MainLoop()   # 调用主循环
del app

第四步的基本套路就是如此。

三、举例实现

以一个简单的NBA爬虫系统为例,首先创建面板与布局

class MyFrame(wx.Frame):
 def __init__(self, parent, id):
 wx.Frame.__init__(self, parent, id, 'NBA可视化',size=(400, 300))
 panel = wx.Panel(self)
 self.bt_confirm = wx.Button(panel, label='合同信息')
 self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)
 self.bt_cancel = wx.Button(panel, label='清空')
 self.bt_cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)
 self.bt_imf = wx.Button(panel, label='可视化')
 self.bt_imf.Bind(wx.EVT_BUTTON,self.Onclickvisual)
 self.bt_team = wx.Button(panel, label='球队信息',pos=(280,20))
 self.bt_team.Bind(wx.EVT_BUTTON,self.Onclickteam)
 self.bt_obtain = wx.Button(panel, label='球员信息',pos=(20,20))
 self.bt_obtain.Bind(wx.EVT_BUTTON,self.Onclickimfor)
 self.bt_ml = wx.Button(panel, label='得分榜')
 self.bt_ml.Bind(wx.EVT_BUTTON,self.Onclickmql) 
 self.title = wx.StaticText(panel, label="NBA可视化")
 self.label_user = wx.StaticText(panel, label="球队名称")
 self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT)
 self.label_pwd = wx.StaticText(panel, label="球员名称")
 self.text_pwd = wx.TextCtrl(panel, style=wx.TE_LEFT)
 self.label_path = wx.StaticText(panel, label="储存路径")
 self.text_pathword = wx.TextCtrl(panel, style=wx.TE_LEFT)

然后添加容器,横向排列

hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
 hsizer_user.Add(self.label_user, proportion=0, flag=wx.ALL, border=5)
 hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
 hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
 hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5)
 hsizer_pwd.Add(self.text_pwd, proportion=1, flag=wx.ALL, border=5) 
 hsizer_path = wx.BoxSizer(wx.HORIZONTAL)
 hsizer_path.Add(self.label_path, proportion=0, flag=wx.ALL, border=5)
 hsizer_path.Add(self.text_pathword, proportion=1, flag=wx.ALL, border=5) 
 hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
 hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5)
 hsizer_button.Add(self.bt_cancel, proportion=0, flag=wx.ALIGN_CENTER, border=5)
 hsizer_button.Add(self.bt_imf, proportion=0, flag=wx.ALIGN_CENTER, border=5)
 hsizer_button.Add(self.bt_ml, proportion=0, flag=wx.ALIGN_CENTER, border=5)

接着添加容器,纵向排列

vsizer_all = wx.BoxSizer(wx.VERTICAL)
 vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER,
   border=15)
 vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
 vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)
 vsizer_all.Add(hsizer_path, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45) 
 vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP, border=15)
 panel.SetSizer(vsizer_all)
 self.InitUI()

下一步是事件绑定

def InitUI(self):
 """ 点击使用说明按钮,执行方法 """ 
 def OnQuit1(self,e):
 """ 输入注意事项 """
 def OnclickSubmit(self,event):
 """ 点击合同信息按钮,执行方法 """
 def Onclickvisual(self,event):
 """ 点击可视化按钮,执行方法 """
 def OnclickCancel(self,event):
 """ 点击清空按钮,执行方法 """ 
 def Onclickimfor(self,event):
 """ 点击球员名称按钮,执行方法 """ 
 def Onclickteam(self,event):
 """ 点击球队名称按钮,执行方法 """ 
 def Onclickmql(self,event):
 """ 点击得分榜按钮,执行方法 """

这里的事件处理不是很难,读者可以自己尝试创新,最后执行脚本

if __name__ == '__main__':
 app = wx.App()   # 初始化
 frame = MyFrame(parent=None,id=-1) # 实例MyFrame类,并传递参数 
 frame.Show()   # 显示窗口
 app.MainLoop()   # 调用主循环方法

效果如图

使用Python实现NBA球员数据查询小程序功能

补充:插入背景图片

想要构造一个个性化系统,最不能缺的就是将界面背景换成自己想要的。这里我选择用一张老科的图片。

相信有的读者会觉得一个独立的单机的GUI软件会更适合自己,我也恰恰如此,因此,在设置背景图片中于之后的GUI需要进行打包,故需要将指定的二进制图片base64化,转换后存入py文件后以import为媒介才能打包。二进制代码转换如下:

import base64
with open("name.jpg","rb") as f: 
 base64_str = base64.b64encode(f.read()) 
with open('%s.py' % picture_name.replace('.', '_'), 'w+') as f1:
 f1.write(base64_str)
 f1.close()

此时可以得到有base64编码的py文件,而后在代码中进行引用。由于打包不能打包图片,故这里稍微复杂的实现“引用指定图片的base64编码——创建图片——插入背景图片”功能!

最后再稍加修饰将文本底色改为透明。编写这段代码的框架非常固定,所以我借鉴了大神们的代码,基本代码框架如下:

#这里需要在主事件中插入两句话
panel.Bind(wx.EVT_ERASE_BACKGROUND,self.OnEraseBack)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
#引用编码并创建图片
from bg_png import img as bg 
def pic(picPath,picName):
 tmp = open(picPath, 'wb') 
 tmp.write(base64.b64decode(picName)) 
 tmp.close() 
pic('bg.png',bg)
#插入图片(子事件 有缩进)
 def OnEraseBack(self,event):
 '''加入图片背景'''
 try :
  dc = event.GetDC()
  if not dc:
  dc = wx.ClientDC(self)
  rect = self.GetUpdateRegion().GetBox()
  dc.SetClippingRect(rect)
  dc.Clear()
  bmp = wx.Bitmap(nowpath+r'\bg.png')
  dc.DrawBitmap(bmp, -500, -100)
 except :
  pass
#将文本底色改为透明
#第一步:将主事件中wx.StaticText全部换成TransparentStaticText
#第二步:重现StaticText控件
class TransparentStaticText(wx.StaticText):
 def __init__(self, parent, id=wx.ID_ANY, label='', pos=wx.DefaultPosition, size=wx.DefaultSize,
   style=wx.TRANSPARENT_WINDOW, name='TransparentStaticText'):
 wx.StaticText.__init__(self, parent, id, label, pos, size, style, name)
 self.Bind(wx.EVT_PAINT, self.OnPaint)
 self.Bind(wx.EVT_ERASE_BACKGROUND, lambda event: None)
 self.Bind(wx.EVT_SIZE, self.OnSize)
 def OnPaint(self, event):
 bdc = wx.PaintDC(self)
 dc = wx.GCDC(bdc)
 font_face = self.GetFont()
 font_color = self.GetForegroundColour()
 dc.SetFont(font_face)
 dc.SetTextForeground(font_color)
 dc.DrawText(self.GetLabel(), 0, 0)
 def OnSize(self, event):
 self.Refresh()
 event.Skip()

最终效果如图:

使用Python实现NBA球员数据查询小程序功能

注意如果你想打包的话,需要代码中中引入下面三个模块:

import six
import packaging
import packaging.version
import packaging.specifiers
import packaging.requirements

到此这篇关于使用Python实现NBA球员数据查询小程序功能的文章就介绍到这了,更多相关Python NBA球员数据小程序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python操作日期和时间的方法
Mar 11 Python
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 Python
Python使用百度API上传文件到百度网盘代码分享
Nov 08 Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
用于业余项目的8个优秀Python库
Sep 21 Python
Python实现SQL注入检测插件实例代码
Feb 02 Python
Pytorch 实现sobel算子的卷积操作详解
Jan 10 Python
Pytorch对Himmelblau函数的优化详解
Feb 29 Python
openCV提取图像中的矩形区域
Jul 21 Python
Python暴力破解Mysql数据的示例
Nov 09 #Python
python 实现一个图形界面的汇率计算器
Nov 09 #Python
python 读取串口数据的示例
Nov 09 #Python
Cpython解释器中的GIL全局解释器锁
Nov 09 #Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 #Python
基于python爬取梨视频实现过程解析
Nov 09 #Python
Python eval函数介绍及用法
Nov 09 #Python
You might like
isset和empty的区别
2007/01/15 PHP
PHP实现的简单mock json脚本分享
2015/02/10 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
告诉你什么是javascript的回调函数
2014/09/04 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
jQuery Dom元素操作技巧
2018/02/04 jQuery
js 数组详细操作方法及解析合集
2018/06/01 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
Python pip配置国内源的方法
2020/02/14 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
法律专业自我鉴定
2013/10/03 职场文书
服装厂厂长职责
2013/12/16 职场文书
初中美术教学反思
2016/02/17 职场文书
Vue的过滤器你真了解吗
2022/02/24 Vue.js
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python