Pyqt4:通过文件浏览小部件编辑 QLineEdit 文本并将其作为参数发送
Pyqt4: Editing QLineEdit text via file browsing widget and sending it as a parameter
我正在尝试创建一个应允许选择目录的应用程序,并在按下按钮后将所选路径发送到 App class 之外的另一个功能.还有一个预定义的目录设置为默认路径并显示在 QLineEdit 小部件中。这是我试过的:
import os
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from functools import partial
class App (QtGui.QMainWindow):
def __init__(self):
super(App, self).__init__()
self.initUI()
def initUI(self):
default_path = os.path.dirname(os.path.abspath(__file__))
def selectDir():
labelSavePath.setText(QtGui.QFileDialog.getExistingDirectory(self,
'Select Dir:'))
self.setFixedSize(450, 150)
self.setWindowTitle('App')
labelSavePath = QtGui.QLineEdit(default_path, self)
labelSavePath.setGeometry(15, 72, 340, 20)
labelSavePath.setAlignment(QtCore.Qt.AlignLeft)
labelSavePath.setReadOnly(True)
btnBrowse = QtGui.QPushButton('Browse', self)
btnBrowse.setGeometry(365, 67, 80, 30)
btnBrowse.clicked.connect(selectDir)
btnStart = QtGui.QPushButton('Start', self)
btnStart.move(345, 115)
btnStart.clicked.connect(partial(startRun,
str(labelSavePath.text())))
self.show()
def startRun(log_path):
print(log_path) #and do smth useful
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
w = App()
sys.exit(app.exec_())
然而,log_path 总是等于 default_path 无论用户与否。由于我是 PyQt 的新手,我已经找了几个小时的答案,但仍然没有找到错误。
我应该如何 edit/pass labelSavedPath 小部件中的文本正确,注意可能的更改?
您似乎误解了 partial 的作用。它允许你调用一个函数,其中一些参数预填充了固定值——这正是你不想要的。使用 lambda
代替:
btnStart.clicked.connect(lambda: startRun(labelSavePath.text()))
注意:如果您使用的是 Python 3,则无需用 str()
.
包裹所有内容
我正在尝试创建一个应允许选择目录的应用程序,并在按下按钮后将所选路径发送到 App class 之外的另一个功能.还有一个预定义的目录设置为默认路径并显示在 QLineEdit 小部件中。这是我试过的:
import os
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from functools import partial
class App (QtGui.QMainWindow):
def __init__(self):
super(App, self).__init__()
self.initUI()
def initUI(self):
default_path = os.path.dirname(os.path.abspath(__file__))
def selectDir():
labelSavePath.setText(QtGui.QFileDialog.getExistingDirectory(self,
'Select Dir:'))
self.setFixedSize(450, 150)
self.setWindowTitle('App')
labelSavePath = QtGui.QLineEdit(default_path, self)
labelSavePath.setGeometry(15, 72, 340, 20)
labelSavePath.setAlignment(QtCore.Qt.AlignLeft)
labelSavePath.setReadOnly(True)
btnBrowse = QtGui.QPushButton('Browse', self)
btnBrowse.setGeometry(365, 67, 80, 30)
btnBrowse.clicked.connect(selectDir)
btnStart = QtGui.QPushButton('Start', self)
btnStart.move(345, 115)
btnStart.clicked.connect(partial(startRun,
str(labelSavePath.text())))
self.show()
def startRun(log_path):
print(log_path) #and do smth useful
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
w = App()
sys.exit(app.exec_())
然而,log_path 总是等于 default_path 无论用户与否。由于我是 PyQt 的新手,我已经找了几个小时的答案,但仍然没有找到错误。
我应该如何 edit/pass labelSavedPath 小部件中的文本正确,注意可能的更改?
您似乎误解了 partial 的作用。它允许你调用一个函数,其中一些参数预填充了固定值——这正是你不想要的。使用 lambda
代替:
btnStart.clicked.connect(lambda: startRun(labelSavePath.text()))
注意:如果您使用的是 Python 3,则无需用 str()
.