使用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实现批量下载文件
May 17 Python
Python表示矩阵的方法分析
May 26 Python
快速了解Python相对导入
Jan 12 Python
python调用百度语音识别api
Aug 30 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
Dec 10 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
Python3 实现减少可调用对象的参数个数
Dec 20 Python
Django中的session用法详解
Mar 09 Python
linux 下selenium chrome使用详解
Apr 02 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
怎么解决pycharm license Acti的方法
Oct 28 Python
python tkinter实现连连看游戏
Nov 16 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
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
JS分页效果示例
2013/10/11 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
JavaScript中的比较操作符>、=、
2014/12/31 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
微信小程序自定义轮播图
2018/11/04 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
python打开网页和暂停实例
2014/09/30 Python
Python实现简单截取中文字符串的方法
2015/06/15 Python
Django Admin 实现外键过滤的方法
2017/09/29 Python
python+opencv实现动态物体识别
2018/01/09 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
python logging模块的使用
2020/09/07 Python
python多线程和多进程关系详解
2020/12/14 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
初中生自我评价
2014/02/01 职场文书
会计演讲稿范文
2014/05/23 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书