pyqt5 qtableview 添加combox_PyQt5学习笔记(十六)Pyinstaller打包与SQLite数据库

本文介绍了如何使用PyInstaller将PyQt5应用打包成可执行文件,详细阐述了SQLite数据库的使用,包括创建数据库、数据操作,并展示了在PyQt5中通过QTableView实现数据的可视化分页显示。同时,文中还提到了一个天气信息查询的实战项目,利用requests库获取并展示数据。
摘要由CSDN通过智能技术生成

终于到了最后一章了QAQ,第一次写4万字以上的笔记分享,最近也在忙科创和CV的比赛,所以笔记会显得比较粗糙。其实吧分享这个笔记很大一部分是为了让自己记得更牢,网上翻阅自己的笔记也方便,如果有讲解注释不清楚的地方欢迎评论留言(秋梨膏)。当然本蒟蒻也会时不时地在以后的时间更新完善这些已经完成的笔记。

以下内容涉及到SQLite数据库和requests爬虫库的使用,有时间我也会做相关方面的笔记哒(`・ω・´)。以下只是初步使用。


使用Pyinstaller打包PyQt5应用

Pyinstaller部分同学想必用过,这是一个在命令行下使用的、将脚本代码转成可执行文件的python第三方库。如果想要使得我们做出来的GUI脱离于python解释器而让操作系统直接执行的话,我们可以使用Pyinstaller库来封装我们的GUI的脚本程序。这样不同python、没有python依赖库的用户也可以方便运行程序。

这里直接讲windows下可行的方法,安装完pyinstaller后,打开命令行,一路cd到需要打包的python文件的目录下。或者也可以在需要打包的python文件的目录下按住“Shift”+鼠标右键,打开“PowerShell“

9e0719fa6d2ffd098097ab821a372abd.png

点开后,就会有和windows的命令行几乎一样的页面。

下面我们对draft.py文件打包生成可执行文件,那么只要输入以下指令:

pyinstaller -Fw "draft.py"

f96577edc75d8c17a1b2e9f5cda1c8f2.png

打开目录,你会发现多了两个文件夹builddist,打开dist文件夹,里面就是可以直接运行的可执行文件了:

7757d9865ef8d64f747183ed20d6318d.png

如果要修改图标,比如要给文件“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"浏览数据:

a627026af1177dd533f20895c3f82085.png
我们创建的表格和数据条已经在里面了

建议使用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_())

运行效果:

dfb0ed9da4dd480ad53c04b7ef84ddeb.png
因为数据库路径设置的是我们之前创建的数据库,所以一打开就已经有数据了

分页显示数据

如果数据量很大,那么看起来会很不方便,一页上只能显示几条数据。事实上,不仅是在GUI中,许多网页也会有这种效果:

884dfd17a0cf2427e0210ba63462e175.png

通过两个按钮控件“前一页”和“后一页”和一个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()
        # 创建显示总也是的label
        self.totalPageLabel = QLabel()
        self.totalPageLabel.setFixedWidth(70)
        # 创建显示当前页数的label
        self.currentPageLabel = QLabel()
        self.currentPageLabel.setFixedWidth(100)
        # 创建显示总记录数的label
        self.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_())

运行效果:

5819368fa7e5272b7ad56d67cd653cb2.png

然后我们手动创建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()
        # 创建显示总也是的label
        self.totalPageLabel = QLabel()
        self.totalPageLabel.setFixedWidth(70)
        # 创建显示当前页数的label
        self.currentPageLabel = QLabel()
        self.currentPageLabel.setFixedWidth(100)
        # 创建显示总记录数的label
        self.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)
        # 这是更新显示当前页数的label
        self.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.PageRecordCount
        self.recordQuery(limitIndex)
        self.currentPage += 1
        self.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_())

运行效果:

884dfd17a0cf2427e0210ba63462e175.png

实战项目:天气信息查询

最后我们完成一个查询北京、天津、上海三地的天气查询的小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 + msg5
        self.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_())

运行效果:

b5ccdd13097f3c439562d794ec6421f0.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值