如何在 PyQt4 中使用 QtGui 来收集 Python 程序的输入变量?

Posted

技术标签:

【中文标题】如何在 PyQt4 中使用 QtGui 来收集 Python 程序的输入变量?【英文标题】:How to use QtGui in PyQt4 to collect input variables to a python program? 【发布时间】:2016-04-17 11:46:00 【问题描述】:

我想使用 sys.argv 更改我的 Python 程序,以便使用带有对话框的 GUI 让用户提供一些问题的答案,而不是在命令行上输入标志。按下“应用”按钮后,我希望对话框 GUI 消失,然后代码使用对话框中提供的变量正常运行。我使用 QtGui 尝试了许多不同的方法。要么它崩溃,要么主程序不知道答案。下面我展示了我的许多尝试之一。在此示例中,按下应用按钮后答案未知。输出是

after widget answer1 = <blank no matter what I write in the dialog box>

非常感谢有关如何更改此代码以使变量“a1”填充对话框中给出的字符串的帮助。 谢谢!

import sys
from PyQt4 import QtGui

class Widget(QtGui.QWidget):

    def __init__(self):
        super(Widget, self).__init__()

        self.answer1 = QtGui.QLabel()
        q1Edit = QtGui.QLineEdit()
        q1Edit.textChanged[str].connect(self.q1Changed)

        grid = QtGui.QGridLayout()
        grid.setSpacing(20)

        grid.addWidget(QtGui.QLabel('Question 1'), 1, 0)
        grid.addWidget(q1Edit, 1, 1)
        grid.addWidget(self.answer1, 1, 2)

        applyBtn = QtGui.QPushButton('Apply', self)
        applyBtn.clicked.connect(self.close)

        self.answer1Text = self.answer1.text()

        grid.addWidget(applyBtn,4,3)

        self.setLayout(grid)     

        self.setGeometry(300, 300, 350, 300)
        self.show()


    def q1Changed(self, text):
        self.answer1.setText(text)

    def returnAnswer1(self):
        return self.answer1Text


def main():    
    app = QtGui.QApplication(sys.argv)
    w = Widget() 
    a1 = w.returnAnswer1()
    print("after widget answer1 = " + a1)    
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

感谢 JRazor,最终得到了解决方案:

import sys
from PyQt4 import QtGui

class Widget(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.answer1 = QtGui.QLabel()
        q1Edit = QtGui.QLineEdit()
        q1Edit.textChanged.connect(self.q1Changed)

        self.answer2 = QtGui.QLabel()
        q2Edit = QtGui.QLineEdit()
        q2Edit.textChanged.connect(self.q2Changed)

        grid = QtGui.QGridLayout()
        grid.setSpacing(20)

        grid.addWidget(QtGui.QLabel('Question 1'), 1, 0)
        grid.addWidget(q1Edit, 1, 1)

        grid.addWidget(QtGui.QLabel('Question 2'), 2, 0)
        grid.addWidget(q2Edit, 2, 1)

        applyBtn = QtGui.QPushButton('Apply', self)
        applyBtn.clicked.connect(self.close)

        grid.addWidget(applyBtn,3,2)
        self.setLayout(grid)
        self.setGeometry(300, 300, 350, 300)

    def q1Changed(self, text):
        self.answer1.setText(text)

    def q2Changed(self, text):
        self.answer2.setText(text)

    def returnAnswer1(self):
        return self.answer1.text()

    def returnAnswer2(self):
        return self.answer2.text()

    @staticmethod
    def getData(parent=None):
        dialog = Widget(parent)
        dialog.exec_()
        return [dialog.returnAnswer1(), dialog.returnAnswer2()]

def main():
    app = QtGui.QApplication([])
    window = Widget()
    data = window.getData()
    print data[0]
    print data[1]


if __name__ == '__main__':
    main()

【问题讨论】:

【参考方案1】:

您需要将QWidget 更改为QDialog

class Widget(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

然后使用静态方法为class Widget 创建一个函数。函数将获取父对话框窗口并从编辑字段返回文本:

@staticmethod
def getData(parent = None):
    dialog = Widget(parent)
    dialog.exec_()
    return dialog.returnAnswer1()

然后传值调用窗口:

def main():
    app = QtGui.QApplication([])
    window = Widget()
    print window.getData()  # window is value from edit field

另外,你需要从课堂上删除self.show()

完整代码:https://gist.github.com/gitex/83b06e8ceaac18ad5dec2d332ed6cbaa

【讨论】:

嗨 JRazor,非常感谢您在这里提供的帮助...我在您的window = Widget.getData() 之后添加了print(window),但是在编辑字段中写了一些内容并点击应用按钮之后没有任何反应...那你知道怎么回事吗? 很好用!但是,当我尝试在同一个对话框中提出多个问题时,对话框会打开两次。知道如何解决吗?请在您的github中查看我的代码 @chan:在使用之前阅读 PyQt 文档。这将为您节省很多问题。我添加到 Gist 第二个字段。 不要第二次使用getData 非常感谢您的帮助!最后,我使用了静态方法中的答案列表(我在上面的部分中添加了最终解决方案)。

以上是关于如何在 PyQt4 中使用 QtGui 来收集 Python 程序的输入变量?的主要内容,如果未能解决你的问题,请参考以下文章

PyImport_ImportModule("PyQt4.QtGui") 失败

从 PyQt4 导入 QtGui 时找不到图像错误

如何在pyqt4中的行中添加箭头?

在 qtableview pyqt4 python 中使用图像委托?

PyQt4入门

PyQt4 中的多列(可能使用 QTreeWidget)