diff --git a/all_info.csv b/all_info.csv new file mode 100644 index 0000000..afe9303 --- /dev/null +++ b/all_info.csv @@ -0,0 +1,6 @@ +IP地址,MAC地址,版本号,通道1名称,通道1绑定设备,通道2名称,通道2绑定设备 +192.168.0.161,50-29-4D-20-12-01,1.1,通道1名称,通道1绑定设备,通道2名称,通道2绑定设备 +192.168.0.177,50-29-4D-20-12-02,2.1,通道2名称,通道2绑定设备,通道3名称,通道3绑定设备 +192.168.0.174,50-29-4D-20-12-03,3.1,通道3名称,通道3绑定设备,通道4名称,通道4绑定设备 +192.168.0.185,50-29-4D-20-12-04,4.1,通道4名称,通道4绑定设备,通道5名称,通道5绑定设备 +192.168.0.168,50-29-4D-20-12-05,5.1,通道5名称,通道5绑定设备,通道6名称,通道6绑定设备 diff --git a/batch_dialog.py b/batch_dialog.py index 7114fef..5df5437 100644 --- a/batch_dialog.py +++ b/batch_dialog.py @@ -1,6 +1,8 @@ import sys +import csv from PyQt5.QtWidgets import QApplication, QDialog, QVBoxLayout, QHBoxLayout, QTableWidget, QTableWidgetItem, \ - QPushButton, QCheckBox + QPushButton, QCheckBox, QFileDialog, QMessageBox +from PyQt5.QtCore import Qt class BatchOperationDialog(QDialog): @@ -75,6 +77,9 @@ class BatchOperationDialog(QDialog): # 设置对话框的布局 self.setLayout(main_layout) + # 允许最大化 + # self.setWindowState(Qt.WindowMaximized) + def select_all(self): for row in range(self.table_widget.rowCount()): item = self.table_widget.item(row, 0) @@ -95,14 +100,69 @@ class BatchOperationDialog(QDialog): print("升级节点按钮被点击") def save_data(self): - print("保存表数据按钮被点击") - # 可以在这里实现保存表格数据的操作,比如导出为CSV等 + # 打开文件保存对话框 + options = QFileDialog.Options() + file_path, _ = QFileDialog.getSaveFileName(self, "保存表数据", "", "CSV Files (*.csv);;All Files (*)", options=options) + if file_path: + # 保存表格数据到CSV文件 + with open(file_path, mode='w', newline='', encoding='utf-8') as file: + writer = csv.writer(file) + # 写入表头 + headers = [self.table_widget.horizontalHeaderItem(i).text() for i in range(self.table_widget.columnCount())] + writer.writerow(headers) + # 写入表格内容 + for row in range(self.table_widget.rowCount()): + row_data = [self.table_widget.item(row, col).text() if self.table_widget.item(row, col) else "" for col in range(self.table_widget.columnCount())] + writer.writerow(row_data) + print(f"数据已保存到 {file_path}") def load_ips(self): - print("load ip list") + # 打开文件选择对话框 + options = QFileDialog.Options() + file_path, _ = QFileDialog.getOpenFileName(self, "选择IP地址文件", "", "Text Files (*.txt);;All Files (*)", options=options) + if file_path: + # 读取IP地址 + with open(file_path, 'r') as file: + lines = file.readlines() + + invalid_ips = [] + for i, line in enumerate(lines): + ip = line.strip() + # 验证IP地址格式 + if not self.validate_ip(ip): + invalid_ips.append(i + 1) + + if invalid_ips: + # 如果有无效IP,弹出提示框 + QMessageBox.warning(self, "错误", f"以下行的IP地址无效:{', '.join(map(str, invalid_ips))}") + else: + # 将IP地址加载到表格 + for i, line in enumerate(lines): + ip = line.strip() + if i < self.table_widget.rowCount(): + self.table_widget.setItem(i, 1, QTableWidgetItem(ip)) # 设置IP地址列 + print(f"加载了{len(lines)}个IP地址") + + def validate_ip(self, ip): + # IP地址验证正则表达式 + import re + pattern = r"^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" + return bool(re.match(pattern, ip)) def load_all_info(self): - print("load complete info") + # 打开CSV文件选择对话框 + options = QFileDialog.Options() + file_path, _ = QFileDialog.getOpenFileName(self, "选择CSV文件", "", "CSV Files (*.csv);;All Files (*)", options=options) + if file_path: + # 读取CSV文件 + with open(file_path, mode='r', encoding='utf-8') as file: + reader = csv.reader(file) + headers = next(reader) # 跳过表头 + for row_num, row_data in enumerate(reader): + if row_num < self.table_widget.rowCount(): + for col_num, cell_data in enumerate(row_data): + self.table_widget.setItem(row_num, col_num+1, QTableWidgetItem(cell_data)) + print(f"加载了CSV文件中的内容:{file_path}") if __name__ == "__main__": diff --git a/ips.txt b/ips.txt new file mode 100644 index 0000000..e0f71ab --- /dev/null +++ b/ips.txt @@ -0,0 +1,5 @@ +192.168.0.161 +192.168.0.177 +192.168.0.174 +192.168.0.185 +192.168.0.168 \ No newline at end of file