PyQt5开发可视化计算器时多按钮无法显示及工作问题求助
为什么我的PyQt5计算器只有第一个按钮能显示?
嘿,我看了你的代码,发现两个关键问题导致了这个现象:
1. QMainWindow没有设置Central Widget
QMainWindow是一个自带布局框架的窗口(包含菜单栏、工具栏、状态栏等区域),所有自定义控件不能直接放在QMainWindow本身上,必须先创建一个普通的QWidget作为它的central widget,然后把所有输入框、按钮都放在这个central widget里。直接把控件加到QMainWindow上会触发内部布局冲突,导致只有第一个添加的控件能正常显示。
2. 部分按钮位置完全重叠
你代码里的乘法按钮(*)和除法按钮(/)使用了完全相同的move(140, 180),这会导致后者覆盖前者,即使解决了第一个问题,这两个按钮你也只能看到最后创建的那个。
另外,每个控件创建后重复调用self.show()是没必要的,只需要在所有控件都初始化完成后调用一次就行。
下面是修正后的完整代码:
import sys from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QLineEdit from PyQt5.QtCore import pyqtSlot class App(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('Calculator') # 调整窗口尺寸到合理范围,避免超出屏幕 self.setGeometry(100, 100, 320, 260) # 创建central widget并设置给主窗口 central_widget = QWidget(self) self.setCentralWidget(central_widget) # 所有控件现在都以central_widget为父控件 self.num1= QLineEdit(central_widget) self.num1.move(20, 20) self.num1.resize(280,40) self.num2 = QLineEdit(central_widget) self.num2.move(20, 100) self.num2.resize(280,40) # 加法按钮 self.plus = QPushButton('+' , central_widget) self.plus.move(20,180) self.plus.resize(60,40) # 加宽按钮,更容易点击 self.plus.clicked.connect(self.plus_onclick) # 减法按钮 self.minus = QPushButton('-' , central_widget) self.minus.move(90,180) self.minus.resize(60,40) self.minus.clicked.connect(self.minus_onclick) # 乘法按钮 self.into = QPushButton('*' , central_widget) self.into.move(160, 180) self.into.resize(60, 40) self.into.clicked.connect(self.into_onclick) # 除法按钮 self.div = QPushButton('/' , central_widget) self.div.move(230, 180) self.div.resize(60, 40) self.div.clicked.connect(self.div_onclick) # 最后统一调用一次show即可 self.show() def plus_onclick(self): try: num1 = int(self.num1.text()) num2 = int(self.num2.text()) result = num1 + num2 # 可以在这里把结果显示出来,比如弹窗或者输入框 print(f"{num1} + {num2} = {result}") except ValueError: print("请输入有效的数字") def minus_onclick(self): try: num1 = int(self.num1.text()) num2 = int(self.num2.text()) result = num1 - num2 print(f"{num1} - {num2} = {result}") except ValueError: print("请输入有效的数字") def into_onclick(self): try: num1 = int(self.num1.text()) num2 = int(self.num2.text()) result = num1 * num2 print(f"{num1} * {num2} = {result}") except ValueError: print("请输入有效的数字") def div_onclick(self): try: num1 = int(self.num1.text()) num2 = int(self.num2.text()) if num2 == 0: print("除数不能为0") return result = num1 / num2 print(f"{num1} / {num2} = {result}") except ValueError: print("请输入有效的数字") if __name__ == '__main__': app = QApplication(sys.argv) ex = App() sys.exit(app.exec_())
我还额外做了这些优化:
- 调整了按钮的尺寸和位置,让它们排列更整齐,也更容易点击
- 在点击事件里添加了基本的错误处理(比如输入非数字、除数为0的情况)
- 把窗口尺寸改成了更合理的大小,避免超出屏幕范围
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

