PyQt5开发密码生成器如何用单窗口替代两个QInputDialog弹窗
整合到主窗口的实现方案
核心思路是移除所有独立弹出的QInputDialog,直接通过布局管理器把输入控件、操作按钮、结果展示区全部放到主窗口内部,把原来初始化自动执行的生成逻辑绑定到按钮点击事件触发即可。
完整可运行代码
import sys from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QSpinBox, QPushButton, QTextEdit) import random class App(QWidget): def __init__(self): super().__init__() self.setWindowTitle('Password Generator') self.setGeometry(100,100, 400, 400) self.init_ui() self.show() def init_ui(self): # 主垂直布局 main_layout = QVBoxLayout() # 密码数量输入行 num_row = QHBoxLayout() num_label = QLabel("生成密码数量:") self.num_spin = QSpinBox() self.num_spin.setRange(1, 50) # 和原输入框范围一致 1-50 self.num_spin.setValue(1) num_row.addWidget(num_label) num_row.addWidget(self.num_spin) main_layout.addLayout(num_row) # 密码长度输入行 len_row = QHBoxLayout() len_label = QLabel("单条密码长度:") self.len_spin = QSpinBox() self.len_spin.setRange(1, 50) # 和原输入框范围一致 1-50 self.len_spin.setValue(8) len_row.addWidget(len_label) len_row.addWidget(self.len_spin) main_layout.addLayout(len_row) # 生成按钮 self.generate_btn = QPushButton("生成密码") self.generate_btn.clicked.connect(self.execute) main_layout.addWidget(self.generate_btn) # 结果展示区域 self.result_area = QTextEdit() self.result_area.setReadOnly(True) main_layout.addWidget(self.result_area) self.setLayout(main_layout) def execute(self): char_set = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()-_,./?' num = self.num_spin.value() length = self.len_spin.value() result = [] for _ in range(num): password = ''.join(random.choice(char_set) for _ in range(length)) result.append(password) print(password) # 将结果展示到窗口内 self.result_area.setPlainText('\n'.join(result)) if __name__ == '__main__': app = QApplication(sys.argv) ex = App() sys.exit(app.exec_())
关键改动点
- 删除了所有
QInputDialog弹窗调用,所有交互控件都嵌入主窗口,程序启动后直接显示主界面,不会依次弹出输入框 - 用
QSpinBox做整数输入,自带数值范围限制,和原有逻辑的1-50取值约束完全匹配,无需额外写输入校验代码 - 密码生成逻辑绑定到「生成密码」按钮的点击事件,用户可以反复调整参数多次生成,不需要重启程序
- 新增只读文本区展示生成结果,不用切换到控制台查看输出
内容的提问来源于stack exchange,提问作者AmeriNam20
相关产品推荐
相关产品推荐

