PySide \ PyQt:单击按钮后如何将 return 值更改为 UI?
PySide \ PyQt: How to return value to UI after button click?
我正在尝试 return 来自浏览文件夹对话框的路径。
我试过将实例对象甚至属性传递给调用并将其设置在那里:
self.browseBtn.clicked.connect(myExporter.browseFolder(self))
或
self.browseBtn.clicked.connect(myExporter.browseFolder(self.path))
但这行不通。它会导致浏览器对话框在加载后立即弹出,然后一旦您选择了一个文件夹,它就会出错:Failed to connect signal clicked().
我尝试将点击调用设置为 return,但没有成功:
result = self.browseBtn.clicked.connect(myExporter.browseFolder)
当您处理单独的 类 处理 UI 和逻辑时,有人可以指导我如何 return 一个值吗?另外...像这样将它们分开是不好的做法吗?我知道如果我将所有内容都放入一个 python 文件中,我可能会很容易地解决这个问题,但我认为那是不合适的。
这是我的 ui 文件 (ui.py):
from PySide import QtCore, QtGui
class Ui_Dialog(object):
def __init__(self):
self.path =""
def setupUi(self, Dialog, myExporter):
Dialog.setObjectName("Dialog")
Dialog.resize(382, 589)
...
.......
.............
.................
self.retranslateUi(Dialog)
self.tabWidget.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(Dialog)
self.browseBtn.clicked.connect(myExporter.browseFolder)
这是我的导出文件 (exporter.py):
class Exporter(object):
def __init__(self):
...
......
def browseFolder(self):
...
.......
do something
...........
return path
这是我的 load/test 文件 (loadExporter.py):
import ui as interface
import exporter as exporter
from PySide import QtCore, QtGui
app = QtGui.QApplication.instance()
if app is None:
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
myExporter = exporter.Exporter()
myUI = interface.Ui_Dialog()
myUI.setupUi(Dialog, myExporter)
Dialog.show()
app.exec_()
将它们放在单独的文件中并不一定不好。为某些小部件创建一个单独的文件是一件好事,特别是如果这些小部件可以重复使用的话。
我希望我的主文件有一个 QMainWindow class。
class MyWindow(QtGui.QMainWindow):
pass
if __name__ == "__main__":
QtGui.QApplication([])
mywindow = MyWindow()
mywindow.show()
sys.exit(QtGui.qApp.exec_())
在 if __name__ == "__main__"
中包装应用程序功能可防止此代码在另一个文件尝试导入此文件时 运行。
信号 (self.browserBtn.clicked) 调用回调方法。在 python.
中一切都是对象
def my_func():
pass
new_func_name = my_func # my_func can be reassigned like any variable
my_func 是一个对象。 self.browseBtn.clicked.connect(my_func)
将 my_func 作为变量传递给以后调用。
当发生 self.browserBtn.clicked.emit()
时(在用户单击时),它与调用连接的函数相同 my_func()
。其他信号可能会将值传递给回调函数 self.lineEdit.textChanged.connect(my_func)
调用 'my_func(new_text)'
您希望您的函数为您调用所有内容。
def open_file(filename=None):
"""Open a file."""
# If a filename isn't given ask the user for a file
if filename is None:
filename, ext = QtGUi.QFileDialog.getOpenFileName(None, "Open File", ".../My Documents/")
# You may have to use the ext to make a proper filename
# Open the file
with open(filename, "r") as file:
file.read()
self.browserBtn.clicked.connect(open_file)
结构
...
import mywidget
class MyWindow(QtGui.QMainWindow):
def __init__(self):
super().__init__()
...
self.show_file = QtGui.QLineEdit()
self.setCentralWidget(self.show_file)
self.exporter = mywidget.Exporter()
self.browserBtn.clicked.connect(self.open_file)
def open_file(self, filename=None):
"""Open a file."""
path = self.exporter.browseFolder()
# Do something with the path
self.show_file.setText(path)
if __name__ == "__main__":
QtGui.QApplication([])
mywindow = MyWindow()
mywindow.show()
sys.exit(QtGui.qApp.exec_())
我不认为我完全理解你想要实现的目标,但我可以建议以下解决方案。
exporter.py
# implementation
dialog.py(主要UI)
import PyQt4.QtGui as qg
from exporter import Exporter
class Dialog(qg.QDialog):
def __init__(self):
super().__init__()
self.path = None
self.setup_widgets()
def setup_widgets(self):
self.browse.clicked.connect(self.on_browse_clicked)
def on_browse_clicked(self):
self.path = Exporter().browse_folder()
main.py
import sys
import PyQt4.QtGui as qg
from dialog import Dialog
if __name__ == '__main__':
app = qg.QApplication(sys.argv)
dialog = Dialog()
dialog.show()
sys.exit(app.exec_())
这样你仍然有三个文件,但是 dialog.py 导入 exporter.py 而不是 main.py 导入它们。
至于 returning 信号值,我不知道;我认为信号是空的(不要 return 值)。
信号通过形式参数将参数传递给槽。通常插槽的参数与其对应的信号相同或更少。 return 看重的是插槽。
我正在尝试 return 来自浏览文件夹对话框的路径。
我试过将实例对象甚至属性传递给调用并将其设置在那里:
self.browseBtn.clicked.connect(myExporter.browseFolder(self))
或
self.browseBtn.clicked.connect(myExporter.browseFolder(self.path))
但这行不通。它会导致浏览器对话框在加载后立即弹出,然后一旦您选择了一个文件夹,它就会出错:Failed to connect signal clicked().
我尝试将点击调用设置为 return,但没有成功:
result = self.browseBtn.clicked.connect(myExporter.browseFolder)
当您处理单独的 类 处理 UI 和逻辑时,有人可以指导我如何 return 一个值吗?另外...像这样将它们分开是不好的做法吗?我知道如果我将所有内容都放入一个 python 文件中,我可能会很容易地解决这个问题,但我认为那是不合适的。
这是我的 ui 文件 (ui.py):
from PySide import QtCore, QtGui
class Ui_Dialog(object):
def __init__(self):
self.path =""
def setupUi(self, Dialog, myExporter):
Dialog.setObjectName("Dialog")
Dialog.resize(382, 589)
...
.......
.............
.................
self.retranslateUi(Dialog)
self.tabWidget.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(Dialog)
self.browseBtn.clicked.connect(myExporter.browseFolder)
这是我的导出文件 (exporter.py):
class Exporter(object):
def __init__(self):
...
......
def browseFolder(self):
...
.......
do something
...........
return path
这是我的 load/test 文件 (loadExporter.py):
import ui as interface
import exporter as exporter
from PySide import QtCore, QtGui
app = QtGui.QApplication.instance()
if app is None:
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
myExporter = exporter.Exporter()
myUI = interface.Ui_Dialog()
myUI.setupUi(Dialog, myExporter)
Dialog.show()
app.exec_()
将它们放在单独的文件中并不一定不好。为某些小部件创建一个单独的文件是一件好事,特别是如果这些小部件可以重复使用的话。
我希望我的主文件有一个 QMainWindow class。
class MyWindow(QtGui.QMainWindow):
pass
if __name__ == "__main__":
QtGui.QApplication([])
mywindow = MyWindow()
mywindow.show()
sys.exit(QtGui.qApp.exec_())
在 if __name__ == "__main__"
中包装应用程序功能可防止此代码在另一个文件尝试导入此文件时 运行。
信号 (self.browserBtn.clicked) 调用回调方法。在 python.
中一切都是对象def my_func():
pass
new_func_name = my_func # my_func can be reassigned like any variable
my_func 是一个对象。 self.browseBtn.clicked.connect(my_func)
将 my_func 作为变量传递给以后调用。
当发生 self.browserBtn.clicked.emit()
时(在用户单击时),它与调用连接的函数相同 my_func()
。其他信号可能会将值传递给回调函数 self.lineEdit.textChanged.connect(my_func)
调用 'my_func(new_text)'
您希望您的函数为您调用所有内容。
def open_file(filename=None):
"""Open a file."""
# If a filename isn't given ask the user for a file
if filename is None:
filename, ext = QtGUi.QFileDialog.getOpenFileName(None, "Open File", ".../My Documents/")
# You may have to use the ext to make a proper filename
# Open the file
with open(filename, "r") as file:
file.read()
self.browserBtn.clicked.connect(open_file)
结构
...
import mywidget
class MyWindow(QtGui.QMainWindow):
def __init__(self):
super().__init__()
...
self.show_file = QtGui.QLineEdit()
self.setCentralWidget(self.show_file)
self.exporter = mywidget.Exporter()
self.browserBtn.clicked.connect(self.open_file)
def open_file(self, filename=None):
"""Open a file."""
path = self.exporter.browseFolder()
# Do something with the path
self.show_file.setText(path)
if __name__ == "__main__":
QtGui.QApplication([])
mywindow = MyWindow()
mywindow.show()
sys.exit(QtGui.qApp.exec_())
我不认为我完全理解你想要实现的目标,但我可以建议以下解决方案。
exporter.py
# implementation
dialog.py(主要UI)
import PyQt4.QtGui as qg
from exporter import Exporter
class Dialog(qg.QDialog):
def __init__(self):
super().__init__()
self.path = None
self.setup_widgets()
def setup_widgets(self):
self.browse.clicked.connect(self.on_browse_clicked)
def on_browse_clicked(self):
self.path = Exporter().browse_folder()
main.py
import sys
import PyQt4.QtGui as qg
from dialog import Dialog
if __name__ == '__main__':
app = qg.QApplication(sys.argv)
dialog = Dialog()
dialog.show()
sys.exit(app.exec_())
这样你仍然有三个文件,但是 dialog.py 导入 exporter.py 而不是 main.py 导入它们。
至于 returning 信号值,我不知道;我认为信号是空的(不要 return 值)。
信号通过形式参数将参数传递给槽。通常插槽的参数与其对应的信号相同或更少。 return 看重的是插槽。