当前位置: 首页 > news >正文

做网站软件定制开发西部数码做网站

做网站软件定制开发,西部数码做网站,设计网站页面的工作叫啥,怎么提高网站seo优化关键字排名终于到了最后一章了QAQ#xff0c;第一次写4万字以上的笔记分享#xff0c;最近也在忙科创和CV的比赛#xff0c;所以笔记会显得比较粗糙。其实吧分享这个笔记很大一部分是为了让自己记得更牢#xff0c;网上翻阅自己的笔记也方便#xff0c;如果有讲解注释不清楚的地方欢…终于到了最后一章了QAQ第一次写4万字以上的笔记分享最近也在忙科创和CV的比赛所以笔记会显得比较粗糙。其实吧分享这个笔记很大一部分是为了让自己记得更牢网上翻阅自己的笔记也方便如果有讲解注释不清楚的地方欢迎评论留言秋梨膏。当然本蒟蒻也会时不时地在以后的时间更新完善这些已经完成的笔记。以下内容涉及到SQLite数据库和requests爬虫库的使用有时间我也会做相关方面的笔记哒(・ω・´)。以下只是初步使用。使用Pyinstaller打包PyQt5应用Pyinstaller部分同学想必用过这是一个在命令行下使用的、将脚本代码转成可执行文件的python第三方库。如果想要使得我们做出来的GUI脱离于python解释器而让操作系统直接执行的话我们可以使用Pyinstaller库来封装我们的GUI的脚本程序。这样不同python、没有python依赖库的用户也可以方便运行程序。这里直接讲windows下可行的方法安装完pyinstaller后打开命令行一路cd到需要打包的python文件的目录下。或者也可以在需要打包的python文件的目录下按住“Shift”鼠标右键打开“PowerShell“点开后就会有和windows的命令行几乎一样的页面。下面我们对draft.py文件打包生成可执行文件那么只要输入以下指令pyinstaller -Fw draft.py打开目录你会发现多了两个文件夹build和dist打开dist文件夹里面就是可以直接运行的可执行文件了如果要修改图标比如要给文件“SevenDigitDrawV2.py“附上”curve.ico“的图标则输入命令pyinstaller -i curve.ico -Fw draft.py需要说明的是打包完的可执行文件会很大笔者的这个小小的画板exe就有37MB这是因为它将所有python的依赖库都包括进去了即你装的第三方库越多打包出来的文件越大。操作SQLite数据库许多桌面应用都有访问本地数据库或者远程数据库的需求下面就讲讲其中的一种SQLite。SQLite是一种轻量级的跨平台数据库因此很常用。PyQt5中提供了操控SQLite数据库的API。QSqlDatabase.addDatabase()创建一个通用数据库参数填入“QSQLITE”表示创建SQLite数据库我们现在python文件的目录下创建一个文件夹db。import sys from PyQt5.QtSql import * ​ def createDB():# 创建一个通用数据库对象参数QSQLITE代表通用数据库为SQLite数据库类型db QSqlDatabase.addDatabase(QSQLITE)# 指定SQLite数据库的文件名db.setDatabaseName(./db/database.db)if not db.open():print(无法建立与数据库的连接)return False# 创建查询功能query QSqlQuery()# 执行创建表格的指令query.exec(create table people(id int primary key,name varchar(10),address varchar(50)))# 执行往表格中插入数据的指令query.exec(insert into people values(1, Kirigaya, GitHub))db.close()return True ​ if __name__ __main__:createDB()通过DB Browser for SQLite打开./db/database.db点击Browser Data浏览数据我们创建的表格和数据条已经在里面了建议使用DB Browser for SQLite来打开数据库进行操作网上可以下载到。通过可视化的方式对SQLite数据库进行增、删、改、查操作此处我们使用之前讲过的QTableView控件来展示二维数据。之前你可能会觉得QTableView控件不常用因为与QTableWidget相比QTableView需要创建一个model设置模型代表的表格的尺寸、属性再在模型上添加数据再将model与view关联最后将view作为控件添加到窗口上才能显示出我们model代表的表格的样式与数据看起来比较繁琐没有QTableWidget那样直观和方便。但是当我们想将数据库中的数据在GUI上可视化时QTableView就变得很常用了因为import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtSql import * from PyQt5.QtWidgets import * ​ def initializeModel(model):# 设置表格名称model.setTable(people)# 设置编辑策略model.setEditStrategy(QSqlTableModel.OnFieldChange)# 调用select方法model.select()# 设置表格头model.setHeaderData(0, Qt.Horizontal, ID)model.setHeaderData(1, Qt.Horizontal, 姓名)model.setHeaderData(2, Qt.Horizontal, 地址) ​ def createView(title, model):view QTableView()view.setModel(model)view.setWindowTitle(title)return view ​ def findrow(i):delrow i.row()print(选中第{}行.format(delrow)) ​ def addrow():# 在model.rowCount()行后插入1行并返回插入的行所在行数ret model.insertRows(model.rowCount(), 1)print(添加第{}行.format(ret)) ​ if __name__ __main__:app QApplication(sys.argv)db QSqlDatabase.addDatabase(QSQLITE)# 设置数据库名字路径db.setDatabaseName(./db/database.db) ​# 创建一个数据库的表格模型QSqlTableModel()会自动关联到db上model QSqlTableModel()delrow -1# 初始化这个表格模型函数在上面initializeModel(model) ​# 根据model创建QTableView对象view createView(展示数据, model)view.clicked.connect(findrow) ​window QDialog()layout QVBoxLayout()layout.addWidget(view)addBtn QPushButton(添加一行)addBtn.clicked.connect(addrow) ​delBtn QPushButton(删除一行)# 下面view.currentIndex().row()表示view中被选中的单元格对象所在行数delBtn.clicked.connect(lambda : model.removeRow(view.currentIndex().row())) ​layout.addWidget(addBtn)layout.addWidget(delBtn)window.setLayout(layout) ​window.setWindowTitle(Database Demo)window.resize(550, 400)window.show() ​sys.exit(app.exec_())运行效果因为数据库路径设置的是我们之前创建的数据库所以一打开就已经有数据了分页显示数据如果数据量很大那么看起来会很不方便一页上只能显示几条数据。事实上不仅是在GUI中许多网页也会有这种效果通过两个按钮控件“前一页”和“后一页”和一个QLineEdit控件可供任意页面的跳转用户就可以在有限的UI中浏览整个数据库中对的数据emm事实上这不就是一般数据库的基本功能吗下面我们完成这个实例。我们先将整个窗口的布局和控件设置一下import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtSql import * from PyQt5.QtWidgets import * ​ class DataGrid(QWidget):def __init__(self):super().__init__()self.setWindowTitle(分页查询例子)self.resize(820, 420)self.initUI() ​def initUI(self):# 创建窗口(自定义方法)self.createWindow() ​ ​# 添加窗口上的控件和布局def createWindow(self):# 添加相关的布局与控件hbox1 QHBoxLayout()# 向前翻页的按钮self.prevButton QPushButton(前一页)# 向后翻页的按钮self.nextButton QPushButton(后一页)# 直接跳转到指定页数的按钮和输入想要跳转至的页数的输入框self.switchPageButton QPushButton(Go)self.switchPageLineEdit QLineEdit()self.switchPageLineEdit.setFixedWidth(40) ​switchPage QLabel(转到第)page QLabel(页) ​# 添加我们的控件hbox1.addWidget(self.prevButton)hbox1.addWidget(self.nextButton)hbox1.addWidget(switchPage)hbox1.addWidget(self.switchPageLineEdit)hbox1.addWidget(page)hbox1.addWidget(self.switchPageButton)# 通过添加间隔控件使得上面的控件全部被挤到左边去hbox1.addWidget(QSplitter()) ​# 下面这个布局置于最底端当做当前页面的状态hbox2 QHBoxLayout()# 创建显示总也是的labelself.totalPageLabel QLabel()self.totalPageLabel.setFixedWidth(70)# 创建显示当前页数的labelself.currentPageLabel QLabel()self.currentPageLabel.setFixedWidth(100)# 创建显示总记录数的labelself.totalRecordLabel QLabel()self.totalRecordLabel.setFixedWidth(70) ​hbox2.addWidget(self.totalPageLabel)hbox2.addWidget(self.currentPageLabel)# 通过添加间隔控件使得上面的控件(totalPageLabel和currentPageLabel)在左边下面的控件(totalRecordLabel)在右边hbox2.addWidget(QSplitter())hbox2.addWidget(self.totalRecordLabel) ​# 设置表格属性self.tabelView QTableView()# 表格宽度自适应调整self.tabelView.resizeRowsToContents()self.tabelView.resizeColumnsToContents() ​# 创建主布局并将hbox1,表格和hbox2装入mainLayout QVBoxLayout(self)mainLayout.addLayout(hbox1)mainLayout.addWidget(self.tabelView)mainLayout.addLayout(hbox2)self.setLayout(mainLayout)if __name__ __main__:app QApplication(sys.argv)main DataGrid()main.show()sys.exit(app.exec_())运行效果然后我们手动创建26条数据并且设置查询模型和QTableView控件并将查询模型和QTableView控件关联起来就可以在中间空白区域显示数据了。完成了布局和控件之后我们还需要为控件添加槽函数一通操作后总体的代码如下有点杂不好写所以我就将注释全部打在上面了(・ω・´)import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtSql import * from PyQt5.QtWidgets import * ​ class DataGrid(QWidget):def __init__(self):super().__init__()self.setWindowTitle(分页查询例子)self.resize(820, 420)# 手动创建表格与数据(自定义方法)self.createTableAndInit() ​# 当前页self.currentPage 0# 总页数self.totalPage 0# 总记录数self.totalRecordCount 0# 每页显示的记录数self.PageRecordCount 6 ​self.initUI() ​def initUI(self):# 创建窗口(自定义方法)self.createWindow()# 设置表格(自定义方法)self.setTableView() ​ ​# 创建一个SQLite数据库对象并打开指定路径上的数据库文件def createTableAndInit(self):self.db QSqlDatabase.addDatabase(QSQLITE)self.db.setDatabaseName(./db/database.db)if not self.db.open():return False ​# 申明数据库的查询对象query QSqlQuery()# 创建表query.exec(create table student(id int primary key, name vchar, sex vchar, age int, major vchar))# 手动添加记录嫌累也可以在数据库查询中添加query.exec(insert into student values(1, AA, 男, 20, 计算机))query.exec(insert into student values(2, AB, 女, 20, 计算机))query.exec(insert into student values(3, AC, 男, 20, 计算机))query.exec(insert into student values(4, AD, 女, 20, 计算机))query.exec(insert into student values(5, AE, 男, 20, 计算机))query.exec(insert into student values(6, AF, 女, 20, 计算机))query.exec(insert into student values(7, AG, 男, 20, 计算机))query.exec(insert into student values(8, AH, 女, 20, 计算机))query.exec(insert into student values(9, AI, 男, 20, 计算机))query.exec(insert into student values(10, AJ, 女, 20, 计算机))query.exec(insert into student values(11, AK, 男, 20, 计算机))query.exec(insert into student values(12, AL, 女, 20, 计算机))query.exec(insert into student values(13, AM, 男, 20, 计算机))query.exec(insert into student values(14, AN, 女, 20, 计算机))query.exec(insert into student values(15, AO, 男, 20, 计算机))query.exec(insert into student values(16, AP, 女, 20, 计算机))query.exec(insert into student values(17, AQ, 男, 20, 计算机))query.exec(insert into student values(18, AR, 女, 20, 计算机))query.exec(insert into student values(19, AS, 男, 20, 计算机))query.exec(insert into student values(20, AT, 女, 20, 计算机))query.exec(insert into student values(21, AU, 男, 20, 计算机))query.exec(insert into student values(22, AV, 女, 20, 计算机))query.exec(insert into student values(23, AW, 男, 20, 计算机))query.exec(insert into student values(24, AX, 女, 20, 计算机))query.exec(insert into student values(25, AY, 男, 20, 计算机))query.exec(insert into student values(26, Az, 女, 20, 计算机)) ​return True ​# 添加窗口上的控件和布局def createWindow(self):# 添加相关的布局与控件hbox1 QHBoxLayout()# 向前翻页的按钮self.prevButton QPushButton(前一页)# 向后翻页的按钮self.nextButton QPushButton(后一页)# 直接跳转到指定页数的按钮和输入想要跳转至的页数的输入框self.switchPageButton QPushButton(Go)self.switchPageLineEdit QLineEdit()self.switchPageLineEdit.setFixedWidth(40) ​switchPage QLabel(转到第)page QLabel(页) ​# 绑定信号和槽self.prevButton.clicked.connect(self.onPrevButton)self.nextButton.clicked.connect(self.onNextButton)self.switchPageButton.clicked.connect(self.onSwitchPageButtonClick) ​# 添加我们的控件hbox1.addWidget(self.prevButton)hbox1.addWidget(self.nextButton)hbox1.addWidget(switchPage)hbox1.addWidget(self.switchPageLineEdit)hbox1.addWidget(page)hbox1.addWidget(self.switchPageButton)# 通过添加间隔控件使得上面的控件全部被挤到左边去hbox1.addWidget(QSplitter()) ​# 下面这个布局置于最底端当做当前页面的状态hbox2 QHBoxLayout()# 创建显示总也是的labelself.totalPageLabel QLabel()self.totalPageLabel.setFixedWidth(70)# 创建显示当前页数的labelself.currentPageLabel QLabel()self.currentPageLabel.setFixedWidth(100)# 创建显示总记录数的labelself.totalRecordLabel QLabel()self.totalRecordLabel.setFixedWidth(70) ​hbox2.addWidget(self.totalPageLabel)hbox2.addWidget(self.currentPageLabel)# 通过添加间隔控件使得上面的控件(totalPageLabel和currentPageLabel)在左边下面的控件(totalRecordLabel)在右边hbox2.addWidget(QSplitter())hbox2.addWidget(self.totalRecordLabel) ​# 设置表格属性self.tabelView QTableView()# 表格宽度自适应调整self.tabelView.resizeRowsToContents()self.tabelView.resizeColumnsToContents() ​# 创建主布局并将hbox1,表格和hbox2装入mainLayout QVBoxLayout(self)mainLayout.addLayout(hbox1)mainLayout.addWidget(self.tabelView)mainLayout.addLayout(hbox2)self.setLayout(mainLayout) ​def setTableView(self):# 声明查询模型self.queryModel QSqlQueryModel(self)# 设置当前页self.currentPage 1# 获取总记录数self.totalRecordCount self.getTotalRecordCount()# 获取总页数self.totalPage self.getPageCount()# 刷新状态(也就是更新hbox2中各控件显示的值)self.updateStatus()# 设置总页数文本self.setTotalPageLabel()# 设置总记录数self.setTotalRecordLabel() ​# 记录查询(0代表从第1条开始查),从第一条往后查询6条self.recordQuery(0)# 将数据库中的model和tabelView关联# 这样数据库中的数据就可以直接显示在tableView代表的表格上了self.tabelView.setModel(self.queryModel) ​# 得到记录数def getTotalRecordCount(self):# 设置查询模型获得一个查询所有数据的查询模型self.queryModel.setQuery(select * from student)# 通过模型的rowCount()方法得到数据条数rowCount self.queryModel.rowCount()return rowCount ​# 得到页数def getPageCount(self):# 实际得到的页数应该是总的记录数 / 每页能够容纳下的记录条数再向上取整# 下面就是通过判断来达到向上取整 ​if self.totalRecordCount % self.PageRecordCount 0:return int(self.totalRecordCount / self.PageRecordCount)else:return int(self.totalRecordCount / self.PageRecordCount 1) ​ ​# 记录查询函数(显示limitIndex到limitIndex5的6条数据)def recordQuery(self, limitIndex):# 查询语句从limitIndex开始往后查询6条szQuery (select * from student limit %d,%d % (limitIndex, self.PageRecordCount))# 对查询模型使用set方法来设置模型self.queryModel.setQuery(szQuery) ​# 刷新状态def updateStatus(self):szCurrentText (当前第%d页 % self.currentPage)# 这是更新显示当前页数的labelself.currentPageLabel.setText(szCurrentText) ​# 设置按钮是否可用# 如果当前在第一页那么“向前一页”的按钮不可用if self.currentPage 1:self.prevButton.setEnabled(False)self.nextButton.setEnabled(True)# 如果当前在最后一页那么“向后一页”的按钮不可用elif self.currentPage self.totalPage:self.prevButton.setEnabled(True)self.nextButton.setEnabled(False)# 如果当前在既不在第一页也不在最后一页那么两个按钮都可用else:self.prevButton.setEnabled(True)self.nextButton.setEnabled(True) ​# 设置显示总页数def setTotalPageLabel(self):szTotalPageText (共%d页 % self.totalPage)self.totalPageLabel.setText(szTotalPageText) ​# 设置显示总记录数def setTotalRecordLabel(self):szTotalRecordText (共%d条 % self.totalRecordCount)self.totalRecordLabel.setText(szTotalRecordText) ​# 跳转到前一页的按钮按下的槽函数def onPrevButton(self):# 计算上一页第一条数据的索引# 注意我们的当前页数是从1开始的而数据索引是从0开始的limitIndex (self.currentPage - 2) * self.PageRecordCount# 设置查询模型显示上一页的6条数据self.recordQuery(limitIndex)# 记录当前页数的变量也需要变self.currentPage - 1# 刷新状态self.updateStatus() ​# 跳转到后一页的按钮按下的槽函数def onNextButton(self):# 如法炮制limitIndex self.currentPage * self.PageRecordCountself.recordQuery(limitIndex)self.currentPage 1self.updateStatus() ​# 转到指定页面的按钮按下的槽函数def onSwitchPageButtonClick(self):# 得到输入的字符串szText self.switchPageLineEdit.text() ​# 得到页数pageIndex int(szText)# 判断是否有指定页数if pageIndex self.totalPage or pageIndex 1:QMessageBox.information(self, 提示, 没有指定的页面请重新输入)return ​# 得到查询起始行号limitIndex (pageIndex - 1) * self.PageRecordCount ​# 设置查询模型self.recordQuery(limitIndex)# 设置当前页self.currentPage pageIndex# 刷新状态self.update() ​ ​ if __name__ __main__:app QApplication(sys.argv)main DataGrid()main.show()sys.exit(app.exec_())运行效果实战项目天气信息查询最后我们完成一个查询北京、天津、上海三地的天气查询的小GUI。基本思路是先通过PyQt5搭建基本的布局和控件然后为了获取三地的天气信息我们需要使用Python中的Requests库这是一个超级轻量的python爬虫库可以静态爬取指定url的数据流这不是重点啦反正将爬取的数据setText()在我们的控件上就行了。至于怎么使用requests库爬取读者可以搜索MOOC上北京理工大学的requests课程。最后我们搭建主循环在其中设置窗口的QSS样式。from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * import requests import sys ​ ​ class QueryWeather(QWidget):# 构造函数后面三个参数决定默认的图像生成的宽度高度和清晰度(每英寸像素点数)def __init__(self, parentNone):super(QueryWeather, self).__init__(parent)self.setWindowTitle(查询城市天气)# 设置固定的窗口大小self.setFixedSize(800, 600)# 设置透明度self.setWindowOpacity(0.98)# 城市编码self.cityName2Code {北京:101010100, 天津:101030100, 上海:101020100} ​self.initUI() ​# 搭建窗口你也可以根据自己的喜好搭建这里只是参考def initUI(self):mainVbox QVBoxLayout()vbox QVBoxLayout()hbox1 QHBoxLayout()hbox2 QHBoxLayout()self.cityLabel QLabel(城市)self.cityLabel.setAlignment(Qt.AlignCenter)self.cityLabel.setFixedSize(100, 50)self.cityComboBox QComboBox()self.cityComboBox.setFixedSize(200, 35)self.cityComboBox.addItems([北京,天津,上海])self.weatherInfoText QTextBrowser()self.weatherInfoText.setFixedSize(750, 300)self.weatherInfoText.setAlignment(Qt.AlignCenter)hbox1.addWidget(self.cityLabel)hbox1.addWidget(self.cityComboBox)hbox1.addWidget(QSplitter())hbox2.addWidget(self.weatherInfoText)vbox.addLayout(hbox1)vbox.addLayout(hbox2) ​buttonHBox QHBoxLayout()self.queryButton QPushButton(查询)self.queryButton.setFixedSize(150, 40)self.queryButton.setProperty(name, queryButton)self.clearButton QPushButton(清空)self.clearButton.setFixedSize(150, 40)self.clearButton.setProperty(name, clearButton)buttonHBox.addStretch(1)buttonHBox.addWidget(self.queryButton)buttonHBox.addStretch(1)buttonHBox.addWidget(self.clearButton)buttonHBox.addStretch(1) ​mainVbox.addLayout(vbox)mainVbox.addStretch(1)mainVbox.addLayout(buttonHBox) ​self.setLayout(mainVbox)self.queryButton.clicked.connect(self.queryWeather)self.clearButton.clicked.connect(self.clearWeather) ​ ​def queryWeather(self):cityName self.cityComboBox.currentText()# 获取城市对应我们要爬取的页面中的编码cityCode self.cityName2Code[cityName] ​# 爬取页面内容,返回response对象json数据rep requests.get(http://www.weather.com.cn/data/sk/ cityCode .html)# 设置response对象的编码rep.encoding utf-8print(rep.json()) ​# 获取json数据中的键值对就是我们需要的信息msg1 城市: {}.format(rep.json()[weatherinfo][city] n)msg2 风向: {}.format(rep.json()[weatherinfo][WD] n)msg3 温度: {}.format(rep.json()[weatherinfo][temp] n)msg4 风力: {}.format(rep.json()[weatherinfo][WS] n)msg5 湿度: {}.format(rep.json()[weatherinfo][SD] n)result msg1 msg2 msg3 msg4 msg5self.weatherInfoText.setText(result) ​def clearWeather(self):# 因为setText方法本来就是覆盖写那我们将全文信息设置成一个空格就可以达到清空页面信息的效果self.weatherInfoText.setText( ) ​ if __name__ __main__:app QApplication(sys.argv)main QueryWeather()# QSS样式表字符串style QLabel{font-size:30px;}QComboBox{font-size:30px;}QPushButton[namequeryButton]{background-color:#938FD9;color:#2f4f4f;font-size:25px;}QPushButton[nameclearButton]{background-color:#C0C0C0;font-size:25px;}QTextBrowser{font-size:40px;color:#00CED1;}main.setStyleSheet(style)main.show()sys.exit(app.exec_())运行效果
http://www.zqtcl.cn/news/292943/

相关文章:

  • 高端网站设计品牌珠海网站建设最新报价
  • 做网站的商家怎么赚取流量费房地产怎么做网站推广
  • 企业网站建设基本流程网站积分方案
  • 网站定位与功能分析网站常见故障
  • 深圳电子商务网站制作桂林市防疫最新政策
  • 北京网站建设备案代理网站建设计划建议
  • 湛江公司做网站wordpress如何设置网站地图
  • wordpress攻防优化方案
  • 义乌市建设银行分行网站宜春静态管理
  • 企业网站优化电话17做网店类似网站
  • 南京网站建设黄页网站大全在线看免费
  • 网站开发过程记录定制西服
  • 长沙有哪些网站建设公司用vue做网站的实例
  • 购物网站模板 php网页设计图片剧中
  • 嘉峪关市建设局网站横沥镇网站建设公司
  • 查找网站软件培训记录
  • 注册网站安全吗制作人漫画
  • jeecms 怎么建设网站嵌入式软件开发兼职
  • 百度怎么自己做网站四川省建设工程交易中心网站
  • 中介如何做网站收客wordpress 运行代码
  • 网页设计与网站建设考试题目如何做建议的网站
  • 网站怎么推广软文政务网站建设存在问题
  • 公司官方网站建设需要多少钱wordpress单页面制作
  • 社群网站建设网站推广的方式有哪几种
  • 培训机构活动策划网站wordpress 改端口
  • 北京网站制作与营销培训用asp做网站视频
  • 江苏丹阳建设公司网站做网站中的剪辑图片
  • 纯静态网站怎样广州工程造价信息网
  • 为什么网页不能打开建设银行网站企业网站开发综合实训
  • 企业网站制作 深圳网站建站行业公司主页建设