1.创建空白窗体
import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidgetclass MainWindow(QWidget):def __init__(self): # 当被调用时调用函数super().__init__() # 继承父类的全部功能#窗体标题self.setWindowTitle("NB的项目")#窗体的尺寸self.resize(980,450)#窗体位置qr = self.frameGeometry() #框架几何cp = QDesktopWidget().availableGeometry().center()qr.moveCenter(cp)#展示self.show() #和window.show() 一样if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())
2.关于页面布局
水平方向布局


垂直方向布局

import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QHBoxLayout, QVBoxLayout, QLineEdit, QLabelfrom PyQt5.QtWidgets import QPushButton, QTableWidget, QTableWidgetItemclass MainWindow(QWidget):def __init__(self): # 当被调用时调用函数super().__init__() # 继承父类的全部功能# 窗体标题self.setWindowTitle("NB的项目")# 窗体的尺寸self.resize(1228, 450)# 窗体位置qr = self.frameGeometry() # 框架几何cp = QDesktopWidget().availableGeometry().center()qr.moveCenter(cp)# 创建垂直方向布局layout = QVBoxLayout()# 1.创建顶部的菜单布局header_layout = QHBoxLayout() # 创建一个水平布局layout.addLayout(header_layout) # 将垂直布局添加到水平布局中# 1.1创建按钮,加入到header_layoutbtn_start = QPushButton("开始") # 使用默认参数header_layout.addWidget(btn_start)btn_stop = QPushButton("停止")header_layout.addWidget(btn_stop)header_layout.addStretch() # 顶部菜单添加弹簧# 2.创建上面的标题布局from_layout = QHBoxLayout() # 创建一个水平布局# 2.1输入框txt_asin = QLineEdit()from_layout.addWidget(txt_asin) # 将输入框添加到布局中txt_asin.setPlaceholderText("请输入商品ID") # 设置占位文字# 2.2添加按钮btn_add = QPushButton("添加")from_layout.addWidget(btn_add) # 将按钮添加到标题布局中layout.addLayout(from_layout) # 将标题布局添加到水平布局中# 3.创建中间的表格布局table_layout = QHBoxLayout() # 创建一个水平布局# 3.1 创建表格table_widget = QTableWidget(0, 8)# 批量设置表格样式table_header = [{"field": "asin", "text": "ASIN", "width": 120},{"field": "title", "text": "标题", "width": 150},{"field": "url", "text": "URL", "width": 400},{"field": "price", "text": "底价", "width": 100},{"field": "success", "text": "成功次数", "width": 100},{"field": "error", "text": "503次数", "width": 100},{"field": "status", "text": "状态", "width": 100},{"field": "frequency", "text": "频率(N秒/次)", "width": 100},]for idx, info in enumerate(table_header):# idx: 列表的count# info: 调用列表的数据# enumerate: 枚举item = QTableWidgetItem() # 设置表格名称对象item.setText(info["text"]) # 设置表格文本table_widget.setHorizontalHeaderItem(idx, item) # 设置表格横向文本table_widget.setColumnWidth(idx, info["width"]) # 设置某表格宽度table_layout.addWidget(table_widget) # 将表格组件添加到布局中layout.addLayout(table_layout) # 将表格布局添加到水平布局中# 4.创建底部的菜单footer_layout = QHBoxLayout() # 创建一个水平布局self.label_statue = label_status = QLabel("未检测", self)# 创建标签类 并且要在后面使用 所以用self 并且再生成一个不带self的footer_layout.addWidget(label_status)footer_layout.addStretch() # 添加一个弹簧# 4.1 创建按钮btn_reinit = QPushButton("重新格式化")footer_layout.addWidget(btn_reinit)btn_recheck = QPushButton("重新检测")footer_layout.addWidget(btn_recheck)btn_recent_count = QPushButton("次数清零")footer_layout.addWidget(btn_recent_count)btn_delete = QPushButton("删除检测项")footer_layout.addWidget(btn_delete)btn_alert = QPushButton("SMTP报警配置")footer_layout.addWidget(btn_alert)layout.addLayout(footer_layout) # 将垂直布局添加到水平布局中#layout.addStretch() # 总体结构添加弹簧# 将布局赋值,给窗体设置元素的排列方式self.setLayout(layout)if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())
3.组件拆分
代码多,冗杂。我们是以区域来划分,所以我们可以做成函数
import sysfrom PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QHBoxLayout, QVBoxLayout, QLineEdit, QLabelfrom PyQt5.QtWidgets import QPushButton, QTableWidget, QTableWidgetItemclass MainWindow(QWidget):def __init__(self): # 当被调用时调用函数super().__init__() # 继承父类的全部功能# 窗体标题self.setWindowTitle("NB的项目")# 窗体的尺寸self.resize(1228, 450)# 窗体位置qr = self.frameGeometry() # 框架几何cp = QDesktopWidget().availableGeometry().center()qr.moveCenter(cp)# 创建垂直方向布局layout = QVBoxLayout()layout.addLayout(self.init_header()) # 将顶部布局添加到水平布局中layout.addLayout(self.init_from()) # 将标题布局添加到水平布局中layout.addLayout(self.init_table()) # 将表格布局添加到水平布局中layout.addLayout(self.init_footer()) # 将底部布局添加到水平布局中# layout.addStretch() # 总体结构添加弹簧# 将布局赋值,给窗体设置元素的排列方式self.setLayout(layout)def init_header(self): # 创建顶部布局# 1.创建顶部的菜单布局header_layout = QHBoxLayout() # 创建一个水平布局# 1.1创建按钮,加入到header_layoutbtn_start = QPushButton("开始") # 使用默认参数header_layout.addWidget(btn_start)btn_stop = QPushButton("停止")header_layout.addWidget(btn_stop)header_layout.addStretch() # 顶部菜单添加弹簧return header_layoutdef init_from(self):# 2.创建上面的标题布局from_layout = QHBoxLayout() # 创建一个水平布局# 2.1输入框txt_asin = QLineEdit()from_layout.addWidget(txt_asin) # 将输入框添加到布局中txt_asin.setPlaceholderText("请输入商品ID") # 设置占位文字# 2.2添加按钮btn_add = QPushButton("添加")from_layout.addWidget(btn_add) # 将按钮添加到标题布局中return from_layoutdef init_table(self):# 3.创建中间的表格布局table_layout = QHBoxLayout() # 创建一个水平布局# 3.1 创建表格table_widget = QTableWidget(0, 8)# 批量设置表格样式table_header = [{"field": "asin", "text": "ASIN", "width": 120},{"field": "title", "text": "标题", "width": 150},{"field": "url", "text": "URL", "width": 400},{"field": "price", "text": "底价", "width": 100},{"field": "success", "text": "成功次数", "width": 100},{"field": "error", "text": "503次数", "width": 100},{"field": "status", "text": "状态", "width": 100},{"field": "frequency", "text": "频率(N秒/次)", "width": 100},]for idx, info in enumerate(table_header):# idx: 列表的count# info: 调用列表的数据# enumerate: 枚举item = QTableWidgetItem() # 设置表格名称对象item.setText(info["text"]) # 设置表格文本table_widget.setHorizontalHeaderItem(idx, item) # 设置表格横向文本table_widget.setColumnWidth(idx, info["width"]) # 设置某表格宽度table_layout.addWidget(table_widget) # 将表格组件添加到布局中return table_layoutdef init_footer(self):# 4.创建底部的菜单footer_layout = QHBoxLayout() # 创建一个水平布局self.label_statue = label_status = QLabel("未检测", self)# 创建标签类 并且要在后面使用 所以用self 并且再生成一个不带self的footer_layout.addWidget(label_status)footer_layout.addStretch() # 添加一个弹簧# 4.1 创建按钮btn_reinit = QPushButton("重新格式化")footer_layout.addWidget(btn_reinit)btn_recheck = QPushButton("重新检测")footer_layout.addWidget(btn_recheck)btn_recent_count = QPushButton("次数清零")footer_layout.addWidget(btn_recent_count)btn_delete = QPushButton("删除检测项")footer_layout.addWidget(btn_delete)btn_alert = QPushButton("SMTP报警配置")footer_layout.addWidget(btn_alert)return footer_layoutif __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())
4.表格初始化
- 有数据
- 表格中展示
import sysimport osfrom PyQt5.QtCore import Qtfrom PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QHBoxLayout, QVBoxLayout, QLineEdit, QLabelfrom PyQt5.QtWidgets import QPushButton, QTableWidget, QTableWidgetItemBASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))STATUS_MAPPING = {0: "初始化中",1: "执行中",2: "正在执行",3: "完成并提醒",10: "异常并停止",11: "初始化失败",}class MainWindow(QWidget):def __init__(self): # 当被调用时调用函数super().__init__() # 继承父类的全部功能# 窗体标题self.setWindowTitle("NB的项目")# 窗体的尺寸self.resize(1228, 450)# 窗体位置qr = self.frameGeometry() # 框架几何cp = QDesktopWidget().availableGeometry().center()qr.moveCenter(cp)# 创建垂直方向布局layout = QVBoxLayout()layout.addLayout(self.init_header()) # 将顶部布局添加到水平布局中layout.addLayout(self.init_from()) # 将标题布局添加到水平布局中layout.addLayout(self.init_table()) # 将表格布局添加到水平布局中layout.addLayout(self.init_footer()) # 将垂直布局添加到水平布局中# layout.addStretch() # 总体结构添加弹簧# 将布局赋值,给窗体设置元素的排列方式self.setLayout(layout)def init_header(self): # 创建顶部布局# 1.创建顶部的菜单布局header_layout = QHBoxLayout() # 创建一个水平布局# 1.1创建按钮,加入到header_layoutbtn_start = QPushButton("开始") # 使用默认参数header_layout.addWidget(btn_start)btn_stop = QPushButton("停止")header_layout.addWidget(btn_stop)header_layout.addStretch() # 顶部菜单添加弹簧return header_layoutdef init_from(self):# 2.创建上面的标题布局from_layout = QHBoxLayout() # 创建一个水平布局# 2.1输入框txt_asin = QLineEdit()from_layout.addWidget(txt_asin) # 将输入框添加到布局中txt_asin.setPlaceholderText("请输入商品ID") # 设置占位文字# 2.2添加按钮btn_add = QPushButton("添加")from_layout.addWidget(btn_add) # 将按钮添加到标题布局中return from_layoutdef init_table(self):# 3.创建中间的表格布局table_layout = QHBoxLayout() # 创建一个水平布局# 3.1 创建表格table_widget = QTableWidget(0, 8)# 批量设置表格样式table_header = [{"field": "asin", "text": "ASIN", "width": 120},{"field": "title", "text": "标题", "width": 150},{"field": "url", "text": "URL", "width": 400},{"field": "price", "text": "底价", "width": 100},{"field": "success", "text": "成功次数", "width": 100},{"field": "error", "text": "503次数", "width": 100},{"field": "status", "text": "状态", "width": 100},{"field": "frequency", "text": "频率(N秒/次)", "width": 100},]for idx, info in enumerate(table_header):# idx: 列表的count# info: 调用列表的数据# enumerate: 枚举item = QTableWidgetItem() # 设置表格名称对象item.setText(info["text"]) # 设置表格文本table_widget.setHorizontalHeaderItem(idx, item) # 设置表格横向文本table_widget.setColumnWidth(idx, info["width"]) # 设置某表格宽度# 3.2 创建表格数据# 读取数据文件import jsonfile_path = os.path.join(BASE_DIR, "db", "db.json")# 获取文件路径with open(file_path, mode='r', encoding='utf-8') as f: # 读取文件内容data = f.read()data_list = json.loads(data) # 以json格式转换载入数据current_row_count = table_widget.rowCount() # 获取当前表格有多少行for row_list in data_list:table_widget.insertRow(current_row_count) # 添加一行表格# 写内容 写数据for i, ele in enumerate(row_list): # 循环列表序号 列表数据ele = STATUS_MAPPING[ele] if i == 6 else elecell = QTableWidgetItem(str(ele)) # 设置列表内容对象为 jsonif i in [0, 4, 5, 6]: #在第0456行 设置为不可编辑cell.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)table_widget.setItem(current_row_count, i, cell) # 设置表格内容# 行号 列表序号 内容current_row_count += 1 # 行数+1table_layout.addWidget(table_widget) # 将表格组件添加到布局中return table_layoutdef init_footer(self):# 4.创建底部的菜单footer_layout = QHBoxLayout() # 创建一个水平布局self.label_statue = label_status = QLabel("未检测", self)# 创建标签类 并且要在后面使用 所以用self 并且再生成一个不带self的footer_layout.addWidget(label_status)footer_layout.addStretch() # 添加一个弹簧# 4.1 创建按钮btn_reinit = QPushButton("重新格式化")footer_layout.addWidget(btn_reinit)btn_recheck = QPushButton("重新检测")footer_layout.addWidget(btn_recheck)btn_recent_count = QPushButton("次数清零")footer_layout.addWidget(btn_recent_count)btn_delete = QPushButton("删除检测项")footer_layout.addWidget(btn_delete)btn_alert = QPushButton("SMTP报警配置")footer_layout.addWidget(btn_alert)return footer_layoutif __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())
