1.创建空白窗体

  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget
  3. class MainWindow(QWidget):
  4. def __init__(self): # 当被调用时调用函数
  5. super().__init__() # 继承父类的全部功能
  6. #窗体标题
  7. self.setWindowTitle("NB的项目")
  8. #窗体的尺寸
  9. self.resize(980,450)
  10. #窗体位置
  11. qr = self.frameGeometry() #框架几何
  12. cp = QDesktopWidget().availableGeometry().center()
  13. qr.moveCenter(cp)
  14. #展示
  15. self.show() #和window.show() 一样
  16. if __name__ == "__main__":
  17. app = QApplication(sys.argv)
  18. window = MainWindow()
  19. window.show()
  20. sys.exit(app.exec_())

2.关于页面布局

水平方向布局

image.png

image.png

垂直方向布局

image.png

  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QHBoxLayout, QVBoxLayout, QLineEdit, QLabel
  3. from PyQt5.QtWidgets import QPushButton, QTableWidget, QTableWidgetItem
  4. class MainWindow(QWidget):
  5. def __init__(self): # 当被调用时调用函数
  6. super().__init__() # 继承父类的全部功能
  7. # 窗体标题
  8. self.setWindowTitle("NB的项目")
  9. # 窗体的尺寸
  10. self.resize(1228, 450)
  11. # 窗体位置
  12. qr = self.frameGeometry() # 框架几何
  13. cp = QDesktopWidget().availableGeometry().center()
  14. qr.moveCenter(cp)
  15. # 创建垂直方向布局
  16. layout = QVBoxLayout()
  17. # 1.创建顶部的菜单布局
  18. header_layout = QHBoxLayout() # 创建一个水平布局
  19. layout.addLayout(header_layout) # 将垂直布局添加到水平布局中
  20. # 1.1创建按钮,加入到header_layout
  21. btn_start = QPushButton("开始") # 使用默认参数
  22. header_layout.addWidget(btn_start)
  23. btn_stop = QPushButton("停止")
  24. header_layout.addWidget(btn_stop)
  25. header_layout.addStretch() # 顶部菜单添加弹簧
  26. # 2.创建上面的标题布局
  27. from_layout = QHBoxLayout() # 创建一个水平布局
  28. # 2.1输入框
  29. txt_asin = QLineEdit()
  30. from_layout.addWidget(txt_asin) # 将输入框添加到布局中
  31. txt_asin.setPlaceholderText("请输入商品ID") # 设置占位文字
  32. # 2.2添加按钮
  33. btn_add = QPushButton("添加")
  34. from_layout.addWidget(btn_add) # 将按钮添加到标题布局中
  35. layout.addLayout(from_layout) # 将标题布局添加到水平布局中
  36. # 3.创建中间的表格布局
  37. table_layout = QHBoxLayout() # 创建一个水平布局
  38. # 3.1 创建表格
  39. table_widget = QTableWidget(0, 8)
  40. # 批量设置表格样式
  41. table_header = [
  42. {"field": "asin", "text": "ASIN", "width": 120},
  43. {"field": "title", "text": "标题", "width": 150},
  44. {"field": "url", "text": "URL", "width": 400},
  45. {"field": "price", "text": "底价", "width": 100},
  46. {"field": "success", "text": "成功次数", "width": 100},
  47. {"field": "error", "text": "503次数", "width": 100},
  48. {"field": "status", "text": "状态", "width": 100},
  49. {"field": "frequency", "text": "频率(N秒/次)", "width": 100},
  50. ]
  51. for idx, info in enumerate(table_header):
  52. # idx: 列表的count
  53. # info: 调用列表的数据
  54. # enumerate: 枚举
  55. item = QTableWidgetItem() # 设置表格名称对象
  56. item.setText(info["text"]) # 设置表格文本
  57. table_widget.setHorizontalHeaderItem(idx, item) # 设置表格横向文本
  58. table_widget.setColumnWidth(idx, info["width"]) # 设置某表格宽度
  59. table_layout.addWidget(table_widget) # 将表格组件添加到布局中
  60. layout.addLayout(table_layout) # 将表格布局添加到水平布局中
  61. # 4.创建底部的菜单
  62. footer_layout = QHBoxLayout() # 创建一个水平布局
  63. self.label_statue = label_status = QLabel("未检测", self)
  64. # 创建标签类 并且要在后面使用 所以用self 并且再生成一个不带self的
  65. footer_layout.addWidget(label_status)
  66. footer_layout.addStretch() # 添加一个弹簧
  67. # 4.1 创建按钮
  68. btn_reinit = QPushButton("重新格式化")
  69. footer_layout.addWidget(btn_reinit)
  70. btn_recheck = QPushButton("重新检测")
  71. footer_layout.addWidget(btn_recheck)
  72. btn_recent_count = QPushButton("次数清零")
  73. footer_layout.addWidget(btn_recent_count)
  74. btn_delete = QPushButton("删除检测项")
  75. footer_layout.addWidget(btn_delete)
  76. btn_alert = QPushButton("SMTP报警配置")
  77. footer_layout.addWidget(btn_alert)
  78. layout.addLayout(footer_layout) # 将垂直布局添加到水平布局中
  79. #layout.addStretch() # 总体结构添加弹簧
  80. # 将布局赋值,给窗体设置元素的排列方式
  81. self.setLayout(layout)
  82. if __name__ == "__main__":
  83. app = QApplication(sys.argv)
  84. window = MainWindow()
  85. window.show()
  86. sys.exit(app.exec_())

3.组件拆分

代码多,冗杂。我们是以区域来划分,所以我们可以做成函数

  1. import sys
  2. from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QHBoxLayout, QVBoxLayout, QLineEdit, QLabel
  3. from PyQt5.QtWidgets import QPushButton, QTableWidget, QTableWidgetItem
  4. class MainWindow(QWidget):
  5. def __init__(self): # 当被调用时调用函数
  6. super().__init__() # 继承父类的全部功能
  7. # 窗体标题
  8. self.setWindowTitle("NB的项目")
  9. # 窗体的尺寸
  10. self.resize(1228, 450)
  11. # 窗体位置
  12. qr = self.frameGeometry() # 框架几何
  13. cp = QDesktopWidget().availableGeometry().center()
  14. qr.moveCenter(cp)
  15. # 创建垂直方向布局
  16. layout = QVBoxLayout()
  17. layout.addLayout(self.init_header()) # 将顶部布局添加到水平布局中
  18. layout.addLayout(self.init_from()) # 将标题布局添加到水平布局中
  19. layout.addLayout(self.init_table()) # 将表格布局添加到水平布局中
  20. layout.addLayout(self.init_footer()) # 将底部布局添加到水平布局中
  21. # layout.addStretch() # 总体结构添加弹簧
  22. # 将布局赋值,给窗体设置元素的排列方式
  23. self.setLayout(layout)
  24. def init_header(self): # 创建顶部布局
  25. # 1.创建顶部的菜单布局
  26. header_layout = QHBoxLayout() # 创建一个水平布局
  27. # 1.1创建按钮,加入到header_layout
  28. btn_start = QPushButton("开始") # 使用默认参数
  29. header_layout.addWidget(btn_start)
  30. btn_stop = QPushButton("停止")
  31. header_layout.addWidget(btn_stop)
  32. header_layout.addStretch() # 顶部菜单添加弹簧
  33. return header_layout
  34. def init_from(self):
  35. # 2.创建上面的标题布局
  36. from_layout = QHBoxLayout() # 创建一个水平布局
  37. # 2.1输入框
  38. txt_asin = QLineEdit()
  39. from_layout.addWidget(txt_asin) # 将输入框添加到布局中
  40. txt_asin.setPlaceholderText("请输入商品ID") # 设置占位文字
  41. # 2.2添加按钮
  42. btn_add = QPushButton("添加")
  43. from_layout.addWidget(btn_add) # 将按钮添加到标题布局中
  44. return from_layout
  45. def init_table(self):
  46. # 3.创建中间的表格布局
  47. table_layout = QHBoxLayout() # 创建一个水平布局
  48. # 3.1 创建表格
  49. table_widget = QTableWidget(0, 8)
  50. # 批量设置表格样式
  51. table_header = [
  52. {"field": "asin", "text": "ASIN", "width": 120},
  53. {"field": "title", "text": "标题", "width": 150},
  54. {"field": "url", "text": "URL", "width": 400},
  55. {"field": "price", "text": "底价", "width": 100},
  56. {"field": "success", "text": "成功次数", "width": 100},
  57. {"field": "error", "text": "503次数", "width": 100},
  58. {"field": "status", "text": "状态", "width": 100},
  59. {"field": "frequency", "text": "频率(N秒/次)", "width": 100},
  60. ]
  61. for idx, info in enumerate(table_header):
  62. # idx: 列表的count
  63. # info: 调用列表的数据
  64. # enumerate: 枚举
  65. item = QTableWidgetItem() # 设置表格名称对象
  66. item.setText(info["text"]) # 设置表格文本
  67. table_widget.setHorizontalHeaderItem(idx, item) # 设置表格横向文本
  68. table_widget.setColumnWidth(idx, info["width"]) # 设置某表格宽度
  69. table_layout.addWidget(table_widget) # 将表格组件添加到布局中
  70. return table_layout
  71. def init_footer(self):
  72. # 4.创建底部的菜单
  73. footer_layout = QHBoxLayout() # 创建一个水平布局
  74. self.label_statue = label_status = QLabel("未检测", self)
  75. # 创建标签类 并且要在后面使用 所以用self 并且再生成一个不带self的
  76. footer_layout.addWidget(label_status)
  77. footer_layout.addStretch() # 添加一个弹簧
  78. # 4.1 创建按钮
  79. btn_reinit = QPushButton("重新格式化")
  80. footer_layout.addWidget(btn_reinit)
  81. btn_recheck = QPushButton("重新检测")
  82. footer_layout.addWidget(btn_recheck)
  83. btn_recent_count = QPushButton("次数清零")
  84. footer_layout.addWidget(btn_recent_count)
  85. btn_delete = QPushButton("删除检测项")
  86. footer_layout.addWidget(btn_delete)
  87. btn_alert = QPushButton("SMTP报警配置")
  88. footer_layout.addWidget(btn_alert)
  89. return footer_layout
  90. if __name__ == "__main__":
  91. app = QApplication(sys.argv)
  92. window = MainWindow()
  93. window.show()
  94. sys.exit(app.exec_())

4.表格初始化

  • 有数据
  • 表格中展示
  1. import sys
  2. import os
  3. from PyQt5.QtCore import Qt
  4. from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QHBoxLayout, QVBoxLayout, QLineEdit, QLabel
  5. from PyQt5.QtWidgets import QPushButton, QTableWidget, QTableWidgetItem
  6. BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
  7. STATUS_MAPPING = {
  8. 0: "初始化中",
  9. 1: "执行中",
  10. 2: "正在执行",
  11. 3: "完成并提醒",
  12. 10: "异常并停止",
  13. 11: "初始化失败",
  14. }
  15. class MainWindow(QWidget):
  16. def __init__(self): # 当被调用时调用函数
  17. super().__init__() # 继承父类的全部功能
  18. # 窗体标题
  19. self.setWindowTitle("NB的项目")
  20. # 窗体的尺寸
  21. self.resize(1228, 450)
  22. # 窗体位置
  23. qr = self.frameGeometry() # 框架几何
  24. cp = QDesktopWidget().availableGeometry().center()
  25. qr.moveCenter(cp)
  26. # 创建垂直方向布局
  27. layout = QVBoxLayout()
  28. layout.addLayout(self.init_header()) # 将顶部布局添加到水平布局中
  29. layout.addLayout(self.init_from()) # 将标题布局添加到水平布局中
  30. layout.addLayout(self.init_table()) # 将表格布局添加到水平布局中
  31. layout.addLayout(self.init_footer()) # 将垂直布局添加到水平布局中
  32. # layout.addStretch() # 总体结构添加弹簧
  33. # 将布局赋值,给窗体设置元素的排列方式
  34. self.setLayout(layout)
  35. def init_header(self): # 创建顶部布局
  36. # 1.创建顶部的菜单布局
  37. header_layout = QHBoxLayout() # 创建一个水平布局
  38. # 1.1创建按钮,加入到header_layout
  39. btn_start = QPushButton("开始") # 使用默认参数
  40. header_layout.addWidget(btn_start)
  41. btn_stop = QPushButton("停止")
  42. header_layout.addWidget(btn_stop)
  43. header_layout.addStretch() # 顶部菜单添加弹簧
  44. return header_layout
  45. def init_from(self):
  46. # 2.创建上面的标题布局
  47. from_layout = QHBoxLayout() # 创建一个水平布局
  48. # 2.1输入框
  49. txt_asin = QLineEdit()
  50. from_layout.addWidget(txt_asin) # 将输入框添加到布局中
  51. txt_asin.setPlaceholderText("请输入商品ID") # 设置占位文字
  52. # 2.2添加按钮
  53. btn_add = QPushButton("添加")
  54. from_layout.addWidget(btn_add) # 将按钮添加到标题布局中
  55. return from_layout
  56. def init_table(self):
  57. # 3.创建中间的表格布局
  58. table_layout = QHBoxLayout() # 创建一个水平布局
  59. # 3.1 创建表格
  60. table_widget = QTableWidget(0, 8)
  61. # 批量设置表格样式
  62. table_header = [
  63. {"field": "asin", "text": "ASIN", "width": 120},
  64. {"field": "title", "text": "标题", "width": 150},
  65. {"field": "url", "text": "URL", "width": 400},
  66. {"field": "price", "text": "底价", "width": 100},
  67. {"field": "success", "text": "成功次数", "width": 100},
  68. {"field": "error", "text": "503次数", "width": 100},
  69. {"field": "status", "text": "状态", "width": 100},
  70. {"field": "frequency", "text": "频率(N秒/次)", "width": 100},
  71. ]
  72. for idx, info in enumerate(table_header):
  73. # idx: 列表的count
  74. # info: 调用列表的数据
  75. # enumerate: 枚举
  76. item = QTableWidgetItem() # 设置表格名称对象
  77. item.setText(info["text"]) # 设置表格文本
  78. table_widget.setHorizontalHeaderItem(idx, item) # 设置表格横向文本
  79. table_widget.setColumnWidth(idx, info["width"]) # 设置某表格宽度
  80. # 3.2 创建表格数据
  81. # 读取数据文件
  82. import json
  83. file_path = os.path.join(BASE_DIR, "db", "db.json")
  84. # 获取文件路径
  85. with open(file_path, mode='r', encoding='utf-8') as f: # 读取文件内容
  86. data = f.read()
  87. data_list = json.loads(data) # 以json格式转换载入数据
  88. current_row_count = table_widget.rowCount() # 获取当前表格有多少行
  89. for row_list in data_list:
  90. table_widget.insertRow(current_row_count) # 添加一行表格
  91. # 写内容 写数据
  92. for i, ele in enumerate(row_list): # 循环列表序号 列表数据
  93. ele = STATUS_MAPPING[ele] if i == 6 else ele
  94. cell = QTableWidgetItem(str(ele)) # 设置列表内容对象为 json
  95. if i in [0, 4, 5, 6]: #在第0456行 设置为不可编辑
  96. cell.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
  97. table_widget.setItem(current_row_count, i, cell) # 设置表格内容
  98. # 行号 列表序号 内容
  99. current_row_count += 1 # 行数+1
  100. table_layout.addWidget(table_widget) # 将表格组件添加到布局中
  101. return table_layout
  102. def init_footer(self):
  103. # 4.创建底部的菜单
  104. footer_layout = QHBoxLayout() # 创建一个水平布局
  105. self.label_statue = label_status = QLabel("未检测", self)
  106. # 创建标签类 并且要在后面使用 所以用self 并且再生成一个不带self的
  107. footer_layout.addWidget(label_status)
  108. footer_layout.addStretch() # 添加一个弹簧
  109. # 4.1 创建按钮
  110. btn_reinit = QPushButton("重新格式化")
  111. footer_layout.addWidget(btn_reinit)
  112. btn_recheck = QPushButton("重新检测")
  113. footer_layout.addWidget(btn_recheck)
  114. btn_recent_count = QPushButton("次数清零")
  115. footer_layout.addWidget(btn_recent_count)
  116. btn_delete = QPushButton("删除检测项")
  117. footer_layout.addWidget(btn_delete)
  118. btn_alert = QPushButton("SMTP报警配置")
  119. footer_layout.addWidget(btn_alert)
  120. return footer_layout
  121. if __name__ == "__main__":
  122. app = QApplication(sys.argv)
  123. window = MainWindow()
  124. window.show()
  125. sys.exit(app.exec_())