gpt4 book ai didi

python - PySide\PyQt : How to return value to UI after button click?

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:09 26 4
gpt4 key购买 nike

我正在尝试从浏览文件夹对话框返回路径。

我尝试将实例对象甚至属性传递给调用并将其设置在那里:

self.browseBtn.clicked.connect(myExporter.browseFolder(self))

self.browseBtn.clicked.connect(myExporter.browseFolder(self.path))

但这行不通。它会导致浏览器对话框在加载后立即弹出打开,然后一旦您选择了一个文件夹,它就会出错:无法连接单击的信号()。

我尝试将单击的调用设置为返回,但没有成功:

结果 = self.browseBtn.clicked.connect(myExporter.browseFolder)

当您处理处理 UI 和逻辑的单独类时,有人可以引导我如何返回值的正确方向吗?另外……像这样将它们分开是不是不好的做法?我知道如果我将所有内容都放入一个 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

这是我的加载/测试文件(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 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_())

关于python - PySide\PyQt : How to return value to UI after button click?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35329211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com