【发布时间】:2018-02-20 15:51:27
【问题描述】:
我正在将我的 python GUI 计算器从 tkinter 改成 PyQt5。当我运行程序时,它会显示一个窗口,所有按钮都在同一个地方。
这是我的第一个 PyQt5 代码之一,因此我们将不胜感激。
我正在使用:
- Python 3.6.4
- PyQt5_gpl-5.10
- 64-bit windows
Here 是我的代码的链接。
代码:
import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QPushButton, QLineEdit, QApplication, QGridLayout)
class Calculator(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('PyQt5 Calculator')
grid = QGridLayout()
self.E = QLineEdit(self)
grid.addWidget(self.E, 0, 0, 0, 6)
#BUTTONS 23
#0
self.B0 = QPushButton('0', self)
grid.addWidget(self.B0, 4, 0)
self.B0.clicked.connect(lambda:self.action(0))
#1
self.B1 = QPushButton('1', self)
grid.addWidget(self.B1, 3, 0)
self.B1.clicked.connect(lambda:self.action(1))
#2
self.B2 = QPushButton('2', self)
grid.addWidget(self.B2, 3, 1)
self.B2.clicked.connect(lambda:self.action(2))
#3
self.B3 = QPushButton('3', self)
grid.addWidget(self.B3, 3, 2)
self.B3.clicked.connect(lambda:self.action(3))
#4
self.B4 = QPushButton('4', self)
grid.addWidget(self.B4, 2, 0)
self.B4.clicked.connect(lambda:self.action(4))
#5
self.B5 = QPushButton('5', self)
grid.addWidget(self.B5, 2, 1)
self.B5.clicked.connect(lambda:self.action(5))
#6
self.B6 = QPushButton('6', self)
grid.addWidget(self.B6, 2, 2)
self.B6.clicked.connect(lambda:self.action(6))
#7
self.B7 = QPushButton('7', self)
grid.addWidget(self.B7, 1, 0)
self.B7.clicked.connect(lambda:self.action(7))
#8
self.B8 = QPushButton('8', self)
grid.addWidget(self.B8, 1, 1)
self.B8.clicked.connect(lambda:self.action(8))
#9
self.B9 = QPushButton('9', self)
grid.addWidget(self.B9, 1, 2)
self.B9.clicked.connect(lambda:self.action(9))
#C
self.Bc = QPushButton('C', self)
grid.addWidget(self.Bc, 1, 5)
self.Bc.clicked.connect(lambda:self.clear1())
#AC
self.Bac = QPushButton('AC', self)
grid.addWidget(self.Bac, 1, 4)
self.Bac.clicked.connect(lambda:self.clear_all())
#
self.Bplus = QPushButton('+', self)
grid.addWidget(self.Bplus, 4, 3)
self.Bplus.clicked.connect(lambda:self.action("+"))
#
self.Bminus = QPushButton('-', self)
grid.addWidget(self.Bminus, 3, 3)
self.Bminus.clicked.connect(lambda:self.action("-"))
#
self.Btimes = QPushButton('x', self)
grid.addWidget(self.Btimes, 2, 3)
self.Btimes.clicked.connect(lambda:self.action("x"))
#
self.Bdivide = QPushButton('÷', self)
grid.addWidget(self.Bdivide, 1, 3)
self.Bdivide.clicked.connect(lambda:self.action("÷"))
#
self.Bpoint = QPushButton('.', self)
grid.addWidget(self.Bpoint, 4, 1)
self.Bpoint.clicked.connect(lambda:self.action("."))
#
self.Bequals = QPushButton('=', self)
grid.addWidget(self.Bequals, 4, 4)
self.Bequals.clicked.connect(lambda:self.action("="))
#
self.Blbracket = QPushButton('(', self)
grid.addWidget(self.Blbracket, 2, 4)
self.Blbracket.clicked.connect(lambda:self.action("("))
#
self.Brbracket = QPushButton(')', self)
grid.addWidget(self.Brbracket, 2, 5)
self.Brbracket.clicked.connect(lambda:self.action(")"))
#
self.Bsqrt = QPushButton('√', self)
grid.addWidget(self.Bsqrt, 3, 4)
self.Bsqrt.clicked.connect(lambda:self.action("√"))
#
self.Bsqr = QPushButton('x²', self)
grid.addWidget(self.Bsqr, 3, 5)
self.Bsqr.clicked.connect(lambda:self.action("x²"))
#
self.Bprocent = QPushButton('%', self)
grid.addWidget(self.Bprocent, 4, 2)
self.Bprocent.clicked.connect(lambda:self.action("%"))
self.show()
def action(self, button_text):
self.E.setText(button_text)
def clear_all(self):
self.E.clear()
def clear1(self):
self.text = self.E.text()[:-1]
self.E.clear()
self.E.setText(self.text)
def getandreplace(self):
self.replaced_text = self.E.text().replace("÷",'/')
self.replaced_text = self.replaced_text.replace('x','*')
return self.replaced_text
def equals(self):
self.getandreplace()
try:
self.value = eval(self.replaced_text)
except SyntaxError or NameError or ZeroDivisionError:
self.E.clear()
self.E.setText("Invalid input!")
else:
self.E.clear()
self.E.setText(self.value)
def square(self):
self.getandreplace()
try:
self.value = eval(self.replaced_text)
except SyntaxError or NameError:
self.E.clear()
self.E.setText("Invalid input!")
else:
self.sq_val = math.pow(self.value,2)
self.E.clear()
self.E.setText(self.sq_val)
def squareroot(self):
self.getandreplace()
try:
self.value = eval(self.replaced_text)
except SyntaxError or NameError:
self.E.clear()
self.E.setText("Invalid input!")
else:
sqrt_val = math.sqrt(value)
self.E.clear()
self.E.setText(sqrt_val)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Calculator()
sys.exit(app.exec_())
【问题讨论】:
-
minimal verifiable example 的来源应包含在 stackoverflow 中。不仅链接到任何 github 存储库。如果 repo 被删除,这个问题对于 stackoverflow 上的其他用户将毫无用处。
-
代码太大了。 Stack Overflow 显示错误,应该有更多描述。
-
@user8921550 你应该使用布局,你希望你的计算器如何显示?
-
有网格布局。
-
@user8921550 问题是因为你覆盖了按钮的创建,所有你调用self.B的按钮,改名字,应该可以解决你的问题。
标签: python python-3.x pyqt pyqt5