如何使用 Line Edit 在 PyQt 中等待用户输入?

Posted

技术标签:

【中文标题】如何使用 Line Edit 在 PyQt 中等待用户输入?【英文标题】:How to wait for user input in PyQt with Line Edit? 【发布时间】:2017-04-26 16:12:06 【问题描述】:

我正在做一个“包装”我用 PyQt GUI 构建的程序的项目,但我被一个基本的东西困住了。 我希望程序停止处理代码并等待我的输入,就像raw_input() 一样。这是我的代码:

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys


class myWidget(QDialog):

    def __init__(self,parent=None):
        super(myWidget, self).__init__(parent)

        self.lineEdit = QLineEdit()
        self.textBrowser = QTextBrowser()
        self.top_btn = QPushButton("Ask me")
        self.bottom_btn = QPushButton("disable")
        layout = QVBoxLayout()
        layout.addWidget(self.textBrowser)
        layout.addWidget(self.lineEdit)
        layout.addWidget(self.top_btn)
        layout.addWidget(self.bottom_btn)
        self.setLayout(layout)
        self.lineEdit.setDisabled(True)
        self.lineEdit.clear()
        self.connect(self.top_btn, SIGNAL("clicked()"), self.inputFunc)
        self.connect(self.bottom_btn, SIGNAL("clicked()"), self.disableLine)



    def inputFunc(self):
        self.lineEdit.clear()
        self.lineEdit.setDisabled(False)
        self.textBrowser.setText("Welcome to #1 button. what do you want to do?")
        userInput = self.lineEdit.text()
        if userInput == "anything":
            self.textBrowser.append("Ok i will leave you alone")
            exit()
        else:
            self.textBrowser.append("say what?")



    def disableLine(self):
        self.lineEdit.clear()
        self.textBrowser.append("Line edit is disabled")
        self.lineEdit.setDisabled(True)


app = QApplication(sys.argv)
form = myWidget()
form.show()
app.exec_()

如您所见,有一个 Line Edit 及其变量。但它不会等待我的输入,它会继续执行代码,当然它不会让我更改“if”语句的结果。 如何暂停代码并等待用户输入,以便我的“if”语句结果将像raw_input() 一样更改? (如果可能,不添加任何新布局。)

谢谢。

【问题讨论】:

【参考方案1】:

结构化编程与面向事件的编程有不同的范式,GUI 使用事件来警告应该执行该任务的插槽。

在您的情况下,处理部分必须在另一个方法中完成,并在发出信号时调用

对于您的情况,QLineEdit 小部件有 2 个可以为您服务的信号,第一个是 editingFinished,第二个是 returnPressed,在这种情况下,我选择按下回车键时发出的第二个信号或返回键。然后我们将该信号与被调用的进程槽连接,后者执行任务。

我做了一些不影响设计的改动,首先将基类从QDialog改为QWidget,另外还有信号和槽的连接方式。如果你想关闭窗口,你必须使用close()

完整代码:

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys

class myWidget(QWidget):
    def __init__(self,parent=None):
        super(myWidget, self).__init__(parent)
        self.lineEdit = QLineEdit()
        self.textBrowser = QTextBrowser()
        self.top_btn = QPushButton("Ask me", )
        self.bottom_btn = QPushButton("disable")
        layout = QVBoxLayout()
        layout.addWidget(self.textBrowser)
        layout.addWidget(self.lineEdit)
        layout.addWidget(self.top_btn)
        layout.addWidget(self.bottom_btn)
        self.setLayout(layout)
        self.lineEdit.setDisabled(True)
        self.top_btn.clicked.connect(self.inputFunc)
        self.lineEdit.returnPressed.connect(self.process)
        #self.bottom_btn.clicked.connect(self.disableLine)
    def inputFunc(self):
        self.lineEdit.setDisabled(False)
        self.textBrowser.setText("Welcome to #1 button. what do you want to do?")
    def process(self):
        userInput = self.lineEdit.text()
        if userInput == "anything":
            self.textBrowser.append("Ok i will leave you alone")
            #self.close()
        else:
            self.textBrowser.append("say what?")
        self.lineEdit.clear()

app = QApplication(sys.argv)
w = myWidget()
w.show()
sys.exit(app.exec_())

【讨论】:

非常感谢。这正是我想要的。

以上是关于如何使用 Line Edit 在 PyQt 中等待用户输入?的主要内容,如果未能解决你的问题,请参考以下文章

PYQT5 qlineedit 隐藏后不显示

PyQt5中如何与线程通信并等待结果

为啥在 PyQt5 中打开新窗口时我的应用程序会关闭?

如何使用pyqt5将输入值传递给input()?

PyQt5 连接到 Websocket - 等待来自服务器的信号

pyqt5-QTDesigner--控件操作