终于到了最后一章了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"

打开目录,你会发现多了两个文件夹builddist,打开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到limitIndex+5的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, parent=None):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-8"print(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[name="queryButton"]{background-color:#938FD9;color:#2f4f4f;font-size:25px;}QPushButton[name="clearButton"]{background-color:#C0C0C0;font-size:25px;}QTextBrowser{font-size:40px;color:#00CED1;}'''main.setStyleSheet(style)main.show()sys.exit(app.exec_())

运行效果:

pyqt5 自定义控件_PyQt5学习笔记(十六)Pyinstaller打包与SQLite数据库相关推荐

  1. 电脑安装python3.74_python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  2. Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发

    Polyworks脚本开发学习笔记(十六)-用C#进行Polyworks二次开发 Polyworks支持C#二次开发,用对应的SDK文档试着做一下开发样例. 新建一个C#项目,在解决方案中右键添加引用 ...

  3. Mr.J-- jQuery学习笔记(十六)--展开和收起动画折叠菜单的实现

    之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 与动 ...

  4. C语言结构体变量和结构体数组-学习笔记(十六)

    一.结构体变量 1.结构体概念 将不同类型的数据组合成一个有机的整体即为结构体.结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型. 2.结构体类型及结构体变量定义 (1)结构体类型声明 ...

  5. 【theano-windows】学习笔记十六——深度信念网络DBN

    前言 前面学习了受限玻尔兹曼机(RBM)的理论和搭建方法, 如果稍微了解过的人, 肯定知道利用RBM可以堆叠构成深度信念网络(deep belief network, DBN)和深度玻尔兹曼机(dee ...

  6. MonoRail学习笔记十六:AJax在MonoRail中的使用

    AJax几乎成了web2.0的一个代表,Java和Asp.net中都提供了一些AJax操作的控件.在MonoRail中也同样提供了AJax操作的共通类:AJaxHelper AJaxHelper可以指 ...

  7. JavaScript权威设计--CSS(简要学习笔记十六)

    1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...

  8. Jenkins deploy to container部署war到tomcat(学习笔记十六)

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horiz ...

  9. IOS学习笔记十六(NSString和NSMutableString)

    1.NSString和NSMutableString NSString是不变字符串类,有点像java里面的String,NSMutableString是可变字符串类,有点类似java里面的String ...

最新文章

  1. 基于 WPF + Modern UI 的 公司OA小助手 开发总结
  2. Pure 天气(Android),Pure天气(hanjie.app.pureweather) - 8.5.5 - 应用 - 酷安
  3. 开发日记-20190816 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 24
  4. 局域网访问php forbidden,PHP访问时Forbidden403错误
  5. 从技术面试官的角度来谈谈简历和面试
  6. Vim 上手指南【基础、中级】
  7. 2_6 CompositeMode.cpp 组合模式
  8. am335x reboot 命令分析
  9. 大数据分析机器学习(一)之线性模型-年龄和心率关系
  10. matlab连接github,GitHub - chenboshuo/learn_matlab: 我的matlab学习
  11. 简易中控紫猫插件版(1)
  12. 首月流水2.39亿美元,《原神》的发行策略是什么?
  13. 【Python 基础教程】彻底解决python round函数的四舍五入不精确的问题
  14. 公众号600篇文章分类和索引
  15. JavaScript介绍及其特点
  16. YTU OJ 1329: 手机尾号评分
  17. 高等数学上:函数的极限(重难点)
  18. matlab 实验四 数据处理与多项式计算
  19. 博客推广及搜索引擎优化
  20. [精选]看股票走势图的软件用哪个好(如何看懂股市行情大盘的走势)

热门文章

  1. Spark笔记——技术点汇总
  2. 1-4-14:计算邮资
  3. 深入浅出MongoDB(二)概述
  4. Web在线操作Office之Word
  5. 设计模式1——设计模式的原则
  6. Leetcode--287. 寻找重复数(Java)
  7. 重装谷歌浏览器chrome:未知错误导致安装失败
  8. JavaSE——面向对象高级(继承、final关键字、抽象类与接口、多态、Object类、内部类、包装类、可变参数)
  9. android之phonegap入门
  10. 22条API设计的实践