所有 PyQt5 小部件都在同一点

Posted

技术标签:

【中文标题】所有 PyQt5 小部件都在同一点【英文标题】:All PyQt5 widgets are at the same point 【发布时间】: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 的来源应包含在 *** 中。不仅链接到任何 github 存储库。如果 repo 被删除,这个问题对于 *** 上的其他用户将毫无用处。 代码太大了。 Stack Overflow 显示错误,应该有更多描述。 @user8921550 你应该使用布局,你希望你的计算器如何显示? 有网格布局。 @user8921550 问题是因为你覆盖了按钮的创建,所有你调用self.B的按钮,改名字,应该可以解决你的问题。 【参考方案1】:

这个问题是因为你已经创建了QGridLayout但是你没有将它分配给widget,另一个错误是你必须在插入QLineEdit时将rowSpan设置为1:

def initUI(self):
    self.setWindowTitle('PyQt5 Calculator')
    grid = QGridLayout(self)
    self.E = QLineEdit(self)
    grid.addWidget(self.E, 0, 0, 1, 6)

您的代码中的另一个错误是您在单击时传递了一个数字,您必须传递一个字符串然后使用setText()

self.B0.clicked.connect(lambda:self.action('0'))
self.B1.clicked.connect(lambda:self.action('1'))
self.B2.clicked.connect(lambda:self.action('2'))
self.B3.clicked.connect(lambda:self.action('3'))
self.B4.clicked.connect(lambda:self.action('4'))
self.B5.clicked.connect(lambda:self.action('5'))
self.B6.clicked.connect(lambda:self.action('6'))
self.B7.clicked.connect(lambda:self.action('7'))
self.B8.clicked.connect(lambda:self.action('8'))
self.B9.clicked.connect(lambda:self.action('9'))

【讨论】:

以上是关于所有 PyQt5 小部件都在同一点的主要内容,如果未能解决你的问题,请参考以下文章

在 PyQt5 中,右小部件比其他小部件短

PyQt5 制作子类小部件

PyQt5 - 动态添加小部件到布局

尽管更新了小部件,但 Pyqt5 更新的小部件未添加到布局中

如何在 PyQt5 中用另一个小部件替换一个小部件

PyQt5,让用户调整小部件的大小