Python3.8 与 PySide2 类到类用法
Posted
技术标签:
【中文标题】Python3.8 与 PySide2 类到类用法【英文标题】:Python3.8 with PySide2 Class to Class Usage 【发布时间】:2020-04-30 07:28:03 【问题描述】:我的 GUI 本质上封装了执行某些自动化功能的各种后端 PowerShell 脚本。有点跑题了,但好吧,这就是我遇到的问题。
我在 Qt Designer 中设计了我的界面,输出到 .ui 文件,通过 PySide2-UIC 转换为 .py 文件,以及我在 Qt Designer 中创建的主窗口类的子类的主窗口类.一切都很好。没有任何问题。
我现在开始在我的编程中将表单数据从 QWidgets(它正在工作)捕获到一个列表中。我有一个完全自定义的编写类,旨在处理获取该用户输入、设置其他变量(如文件名或所需的某些配置文件的路径)以及执行包含所有这些信息的子进程 PowerShell 命令。我被困在的地方是试图确定在我的 MainWindow 类中,在我的 MainWindow 类之外实例化这个自定义对象的正确位置?但如果是这样,在哪里?这是一些简化的代码来帮助解释我的困境。
接口序列
-
应用启动
主窗口出现
用户使用输入控件浏览表单
用户输入信息,例如(IP 地址、用户名、密码)
用户单击连接到类中方法的按钮
方法通过页面上的子小部件递归,并通过查找 qLabels 和 qLineEdit(伙伴)将信息捕获到字典中
问题:
如何调用下一个方法(即使数据捕获是递归的,也只能调用一次)?我正在考虑将信号连接到第二种方法,该方法处理获取捕获的数据并将其发送/设置到自定义类对象中。但是,当我在 MainWindow 类中实例化我的自定义对象并尝试通过 self.customObject.sendUsesrInput(self.userInputVariable) 引用该对象时,PyCharm 不认为 self 是在这个特定方法中定义的。它没有像类定义的其余部分那样正确突出显示“self”这个词,它表明我需要导入 self。更新 我能够清除 PyCharm 中围绕“导入自我”的错误。它与不正确的空格和制表符有关,即使我只使用制表键进行缩进。可能需要去仔细检查我的检查设置。其他问题仍然存在。在我的自定义类上调用方法以“形成命令”和“运行命令”的最佳位置在哪里,应该由 mainWindow 类执行,还是应该在 customObject 类上设置一个标志,然后触发其他那些行动?或者更一般地说,如果一个对象负责执行它自己的函数/方法,通常不会告诉我,但我不能确定。另外,如果有任何关于此事的书籍,我很乐意自己进行研究。我目前正在阅读“快速 GUI 编程”,但不确定后面的章节是否涵盖了这个主题。
所以我想我的问题是,我在哪里处理 customObject 类,在 mainWindow 类中,还是在其他地方?如果有,在哪里?如果这个问题不清楚,我深表歉意。我保证会根据需要进行更新以帮助解决此问题。
这里是简化的代码示例:
class customClass(object): # this is actually in a separate file but for argv sake
def __init__(self):
self.userInput = ""
self.file1 = ""
self.file2 = ""
self.otherstuff...
def setUserInput(self, uinput):
self.userInput = uinput
def dostuffwithdata(self):
# method to execute subprocess command
class MainWindow( QMainWindow ):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.customObject = customClass.customCmdClass()
self.cmddata = dict()
self.ui.toolButton.clicked.connect(self.getformdata)
def getformdata(self):
# recurses through QWidgets and grabs QLabels and QLineEdit.Text() and updates dict()
for w in widgets:
if w is qlabel:
k = w.text()
v = w.buddy().text()
self.cmddata.update(k: v)
""" all the above works fine. what doesn't work is this part"""
# at this point I want to send the collected data to the customObject for processing
def senddatatocustomObject(self):
self.customObject.setUserInput(self.cmddata) """but this says that 'self' isn't defined.
I know it has to be because of the object in an object, or something I'm doing wrong here.
**Update**: figured this out. PyCharm was freaking out about some sort of
perceived indentation error despite there not appearing to actually be one.
Was able to correct this. """
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
【问题讨论】:
改进__init__
方法中的缩进。当你说 Python 不认为 self 是在这个特定方法中定义的。 你是什么意思?准确。
按照您的建议更新了问题。谢谢指点。
您指出 self.asBuiltCmd.setUserInput(self.cmddata)
行会引发异常,但在您的 MRE 中我没有看到该代码
我能够清除该错误。它与缩进相关(根据 PyCharm,空格与制表符),即使我在编写代码时只使用制表符。我确定我的检查设置是罪魁祸首。我更关注的是从哪里调用我的 customObject 方法的最佳实践。我应该在哪里构建逻辑以获取用户输入,将其发送到 cutomObject,在自定义对象上执行方法以获取文件名,然后最终制定我的 PowerShell 命令并执行。我应该从我的 MainWindow 类中调用所有这些方法/操作吗?
那是您在处理 GUI 应用程序时通常在类中放置此类代码的地方吗?这与将逻辑和方法写在代码的主体/类中的过程式编程不同,对吧?这真的归结为我缺乏纯面向对象编程的经验,我敢肯定。
【参考方案1】:
为了解决这个问题,我对我之前发布的关于在我的代码中放置“逻辑”和流程的位置的问题提供了这个答案。
鉴于这是一个没有任何后端服务的图形应用程序,将大部分用户交互逻辑和流程放在 MainWindow 对象中是最有意义的,因为它本质上是我程序的控制中心。当用户单击或输入某些内容时,它将发生在 MainWindow 上,当状态发生变化时,它(主要)发生在 MainWindow 上或以某种方式直接绑定到 MainWindow。因此,在我的程序的 MainWindow 类/对象中包含我的大部分方法调用、用户输入流逻辑和其他代码是有意义的。
我的其他类和对象用于捕获状态并对不同的数据集执行操作,但在大多数情况下,这些辅助类/对象将/应该由我的应用程序的 MainWindow 控制。
这当然不是编写此应用程序或其他应用程序的唯一方法,但我相信这至少回答了我之前发布的问题。
【讨论】:
以上是关于Python3.8 与 PySide2 类到类用法的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu18.04上的pyside2安装问题,anaconda上的python 3.8.3