import sysfrom PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QCheckBox, QPushButton, QLabel, QLineEdit, QComboBox, QSpinBox, QDoubleSpinBox, QFileDialog, QFrame, QSplitter, QSizePolicy)from PyQt6.QtCore import Qtfrom PyQt6.QtGui import QFontclass WatermarkApp(QMainWindow): def __init__(self):super().__init__()self.setWindowTitle("Word文档水印批量设置工具(欢迎关注微信公众号:码海听潮)")self.setMinimumSize(900, 700)self.current_image_path = "" # 存储当前选择的图片路径self.current_folder_path = "" # 存储当前选择的文件夹路径self.init_ui() def init_ui(self): main_widget = QWidget()self.setCentralWidget(main_widget) main_layout = QHBoxLayout(main_widget) main_layout.setContentsMargins(10, 10, 10, 10) main_layout.setSpacing(20) # ================= 左侧:水印设置区域 ================= left_widget = QWidget() left_layout = QVBoxLayout(left_widget) left_layout.setSpacing(15) # ----- 批量处理文件夹分组 ----- folder_group = QGroupBox("批量处理设置") folder_layout = QVBoxLayout(folder_group) folder_layout.setSpacing(8) # 选择文件夹 folder_select_layout = QHBoxLayout()self.btn_select_folder = QPushButton("选择文件夹")self.btn_select_folder.setFixedWidth(80)self.btn_select_folder.clicked.connect(self.select_folder)self.folder_path_edit = QLineEdit()self.folder_path_edit.setReadOnly(True)self.folder_path_edit.setPlaceholderText("未选择文件夹")self.folder_path_edit.setStyleSheet("color: gray;") folder_select_layout.addWidget(self.btn_select_folder) folder_select_layout.addWidget(self.folder_path_edit, 1) folder_layout.addLayout(folder_select_layout) left_layout.addWidget(folder_group) # ----- 水印设置主分组(带边框) ----- watermark_group = QGroupBox("水印设置") watermark_layout = QVBoxLayout(watermark_group) watermark_layout.setSpacing(8) # 1. 图片水印分组(带边框)self.pic_watermark_group = QGroupBox("图片水印") pic_watermark_layout = QVBoxLayout(self.pic_watermark_group) pic_watermark_layout.setSpacing(8) # 图片水印复选框self.pic_watermark_check = QCheckBox("启用图片水印")self.pic_watermark_check.toggled.connect(self.on_pic_watermark_toggled) pic_watermark_layout.addWidget(self.pic_watermark_check) # 图片水印选项(默认启用)self.pic_options_widget = QWidget() pic_options_layout = QVBoxLayout(self.pic_options_widget) pic_options_layout.setSpacing(8) pic_options_layout.setContentsMargins(20, 5, 0, 5) # 选择图片 pic_select_layout = QHBoxLayout()self.btn_select_pic = QPushButton("选择图片")self.btn_select_pic.setFixedWidth(80)self.btn_select_pic.clicked.connect(self.select_picture)self.pic_path_edit = QLineEdit()self.pic_path_edit.setReadOnly(True)self.pic_path_edit.setPlaceholderText("未选择图片")self.pic_path_edit.setStyleSheet("color: gray;") pic_select_layout.addWidget(self.btn_select_pic) pic_select_layout.addWidget(self.pic_path_edit, 1) pic_options_layout.addLayout(pic_select_layout) # 缩放与冲蚀 scale_chongshi_layout = QHBoxLayout() scale_label = QLabel("缩放") scale_label.setFixedWidth(60) scale_chongshi_layout.addWidget(scale_label)self.scale_combo = QComboBox()self.scale_combo.addItems(["自动", "100%", "200%", "50%", "自定义"]) scale_chongshi_layout.addWidget(self.scale_combo, 1)self.scale_spin = QDoubleSpinBox()self.scale_spin.setRange(10, 500)self.scale_spin.setSuffix("%")self.scale_spin.setVisible(False) scale_chongshi_layout.addWidget(self.scale_spin)self.chongshi_check = QCheckBox("冲蚀") scale_chongshi_layout.addWidget(self.chongshi_check) pic_options_layout.addLayout(scale_chongshi_layout) # 版式(只有水平和倾斜两个选项) pic_layout_row = QHBoxLayout() pic_layout_label = QLabel("版式") pic_layout_label.setFixedWidth(60) pic_layout_row.addWidget(pic_layout_label)self.pic_layout_combo = QComboBox()self.pic_layout_combo.addItems(["水平", "倾斜"]) pic_layout_row.addWidget(self.pic_layout_combo, 1) pic_options_layout.addLayout(pic_layout_row) # 水平对齐 pic_h_layout = QHBoxLayout() pic_h_label = QLabel("水平对齐") pic_h_label.setFixedWidth(60) pic_h_layout.addWidget(pic_h_label)self.pic_h_align = QComboBox()self.pic_h_align.addItems(["居中", "左对齐", "右对齐"]) pic_h_layout.addWidget(self.pic_h_align, 1)self.pic_h_offset = QDoubleSpinBox()self.pic_h_offset.setRange(-20, 20)self.pic_h_offset.setSuffix(" cm")self.pic_h_offset.setValue(0.00)self.pic_h_offset.setFixedWidth(80) pic_h_layout.addWidget(self.pic_h_offset) pic_options_layout.addLayout(pic_h_layout) # 垂直对齐 pic_v_layout = QHBoxLayout() pic_v_label = QLabel("垂直对齐") pic_v_label.setFixedWidth(60) pic_v_layout.addWidget(pic_v_label)self.pic_v_align = QComboBox()self.pic_v_align.addItems(["居中", "顶端对齐", "底端对齐"]) pic_v_layout.addWidget(self.pic_v_align, 1)self.pic_v_offset = QDoubleSpinBox()self.pic_v_offset.setRange(-20, 20)self.pic_v_offset.setSuffix(" cm")self.pic_v_offset.setValue(0.00)self.pic_v_offset.setFixedWidth(80) pic_v_layout.addWidget(self.pic_v_offset) pic_options_layout.addLayout(pic_v_layout) pic_watermark_layout.addWidget(self.pic_options_widget) watermark_layout.addWidget(self.pic_watermark_group) # 2. 文字水印分组(带边框)self.text_watermark_group = QGroupBox("文字水印") text_watermark_layout = QVBoxLayout(self.text_watermark_group) text_watermark_layout.setSpacing(8) # 文字水印复选框self.text_watermark_check = QCheckBox("启用文字水印")self.text_watermark_check.toggled.connect(self.on_text_watermark_toggled) text_watermark_layout.addWidget(self.text_watermark_check) # 文字水印选项self.text_options_widget = QWidget() text_options_layout = QVBoxLayout(self.text_options_widget) text_options_layout.setSpacing(8) text_options_layout.setContentsMargins(20, 5, 0, 5) # 内容 content_layout = QHBoxLayout() content_label = QLabel("内容") content_label.setFixedWidth(60) content_layout.addWidget(content_label)self.text_content = QLineEdit("严禁复制") content_layout.addWidget(self.text_content, 1) text_options_layout.addLayout(content_layout) # 字体 font_layout = QHBoxLayout() font_label = QLabel("字体") font_label.setFixedWidth(60) font_layout.addWidget(font_label)self.text_font = QComboBox()self.text_font.addItems(["微软雅黑", "宋体", "黑体", "楷体", "Arial"]) font_layout.addWidget(self.text_font, 1) text_options_layout.addLayout(font_layout) # 字号 size_layout = QHBoxLayout() size_label = QLabel("字号") size_label.setFixedWidth(60) size_layout.addWidget(size_label)self.text_size = QSpinBox()self.text_size.setRange(8, 200)self.text_size.setValue(60) size_layout.addWidget(self.text_size, 1) text_options_layout.addLayout(size_layout) # 颜色 color_layout = QHBoxLayout() color_label = QLabel("颜色") color_label.setFixedWidth(60) color_layout.addWidget(color_label)self.text_color = QComboBox()self.text_color.addItems(["灰色", "自动", "红色", "蓝色", "绿色", "黑色"]) color_layout.addWidget(self.text_color, 1) text_options_layout.addLayout(color_layout) # 版式(只有水平和倾斜两个选项) text_layout_row = QHBoxLayout() text_layout_label = QLabel("版式") text_layout_label.setFixedWidth(60) text_layout_row.addWidget(text_layout_label)self.text_layout_combo = QComboBox()self.text_layout_combo.addItems(["水平", "倾斜"]) text_layout_row.addWidget(self.text_layout_combo, 1) text_options_layout.addLayout(text_layout_row) # 水平对齐 text_h_layout = QHBoxLayout() text_h_label = QLabel("水平对齐") text_h_label.setFixedWidth(60) text_h_layout.addWidget(text_h_label)self.text_h_align = QComboBox()self.text_h_align.addItems(["居中", "左对齐", "右对齐"]) text_h_layout.addWidget(self.text_h_align, 1)self.text_h_offset = QDoubleSpinBox()self.text_h_offset.setRange(-20, 20)self.text_h_offset.setSuffix(" cm")self.text_h_offset.setValue(0.00)self.text_h_offset.setFixedWidth(80) text_h_layout.addWidget(self.text_h_offset) text_options_layout.addLayout(text_h_layout) # 垂直对齐 text_v_layout = QHBoxLayout() text_v_label = QLabel("垂直对齐") text_v_label.setFixedWidth(60) text_v_layout.addWidget(text_v_label)self.text_v_align = QComboBox()self.text_v_align.addItems(["居中", "顶端对齐", "底端对齐"]) text_v_layout.addWidget(self.text_v_align, 1)self.text_v_offset = QDoubleSpinBox()self.text_v_offset.setRange(-20, 20)self.text_v_offset.setSuffix(" cm")self.text_v_offset.setValue(0.00)self.text_v_offset.setFixedWidth(80) text_v_layout.addWidget(self.text_v_offset) text_options_layout.addLayout(text_v_layout) # 透明度 opacity_layout = QHBoxLayout() opacity_label = QLabel("透明度") opacity_label.setFixedWidth(60) opacity_layout.addWidget(opacity_label)self.text_opacity = QSpinBox()self.text_opacity.setRange(0, 100)self.text_opacity.setValue(50)self.text_opacity.setSuffix("%") opacity_layout.addWidget(self.text_opacity, 1) text_options_layout.addLayout(opacity_layout) text_watermark_layout.addWidget(self.text_options_widget) watermark_layout.addWidget(self.text_watermark_group) left_layout.addWidget(watermark_group) # ----- 确定/取消按钮(居中排布) ----- btn_layout = QHBoxLayout() btn_layout.addStretch()self.btn_ok = QPushButton("确定")self.btn_cancel = QPushButton("取消")self.btn_ok.clicked.connect(self.apply_watermark)self.btn_cancel.clicked.connect(self.close) btn_layout.addWidget(self.btn_ok) btn_layout.addWidget(self.btn_cancel) btn_layout.addStretch() left_layout.addLayout(btn_layout) # ================= 右侧:预览区域 ================= right_widget = QWidget() right_widget.setMinimumWidth(350) right_layout = QVBoxLayout(right_widget) preview_group = QGroupBox("预览与选项") preview_inner_layout = QVBoxLayout() # 预览图片/文字区域self.preview_label = QLabel()self.preview_label.setMinimumHeight(400)self.preview_label.setStyleSheet("border: 1px solid #aaa; background-color: #f5f5f5;")self.preview_label.setAlignment(Qt.AlignmentFlag.AlignCenter)self.preview_label.setText("预览区域") preview_inner_layout.addWidget(self.preview_label) # 应用于整篇文档 apply_layout = QHBoxLayout()self.apply_to_all = QCheckBox("应用于整篇文档")self.apply_to_all.setChecked(True) apply_layout.addWidget(self.apply_to_all) apply_layout.addStretch() preview_inner_layout.addLayout(apply_layout) preview_group.setLayout(preview_inner_layout) right_layout.addWidget(preview_group) # 使用分割器让左右可调整 splitter = QSplitter(Qt.Orientation.Horizontal) splitter.addWidget(left_widget) splitter.addWidget(right_widget) splitter.setSizes([500, 400]) main_layout.addWidget(splitter) # 初始状态self.pic_watermark_check.setChecked(True)self.text_watermark_check.setChecked(False) # 连接信号self.scale_combo.currentIndexChanged.connect(self.on_scale_mode_changed) def select_folder(self):"""选择文件夹""" folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹", "")if folder_path:self.current_folder_path = folder_pathself.folder_path_edit.setText(folder_path)self.folder_path_edit.setStyleSheet("color: black;") def on_pic_watermark_toggled(self, checked):"""图片水印复选框状态改变时"""self.pic_options_widget.setEnabled(checked) def on_text_watermark_toggled(self, checked):"""文字水印复选框状态改变时"""self.text_options_widget.setEnabled(checked) def on_scale_mode_changed(self, idx):if self.scale_combo.currentText() == "自定义":self.scale_spin.setVisible(True)else:self.scale_spin.setVisible(False) def select_picture(self): file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图片文件 (*.png *.jpg *.jpeg *.bmp)")if file_path:self.current_image_path = file_pathself.pic_path_edit.setText(file_path)self.pic_path_edit.setStyleSheet("color: black;") def apply_watermark(self) passdef main(): app = QApplication(sys.argv) window = WatermarkApp() window.show() sys.exit(app.exec())if __name__ == "__main__": main()