从另一个GUI类Python调用函数

2024-05-20 18:21:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python创建了一个GUI,它由一个堆叠的小部件组成,其中包含3个独立的小部件:loginBackend、editorBackend和mapBackend。它们都是独立的类,也称为loginBackend、editorBackend、mapBackend。每一个都是从一个名为mainBackend的类和主窗口小部件调用的。其思想是用户将登录(使用loginBackend小部件),然后可以访问其余的小部件。问题是,其他每个小部件都需要登录信息才能连接到数据库。由于某些原因,当我从editorBackend类调用它时,无法获得正确返回的信息。我想做的就是这样

这是编辑背景

from loginBackend import loginBackend

class editorBackend(QWidget, editordesign.Ui_Form):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)  
        self.initUI()

    def initUI(self):
        self.submitPushButton.clicked.connect(self.Insert)

    def Insert(self):
        login = loginBackend()
        url = login.creds()   
        print('url:  ' + url)

这是登录备份

class loginBackend(QWidget, logindesign.Ui_Login):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)  

    def creds(self):
        username = self.userLineEdit.text()
        password = self.passLineEdit.text()
        host = self.selHostLabel.text()
        port = self.selPortLabel.text()
        sid = self.selSIDLabel.text()
        cred = username + '/' + password + '@' + host + ':' + port + '/' + sid
        print('creds: '+ cred)
        return cred

然后这是主窗口,它调用这两个并将它们放入一个堆叠的小部件中。你知道吗

from PyQt5.QtWidgets import QApplication,QMainWindow
import sys
from loginBackend import loginBackend
from mapBackend import mapBackend
from editorBackend import editorBackend
from editTNSnamesBackend import editTNSnamesBackend
import mainwindow

class mainBackend(QMainWindow, mainwindow.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)  
        self.initUI()

    def initUI(self):
        self.url = None
        self.popList()
        self.login = loginBackend()
        self.mapping = mapBackend()
        self.edit = editorBackend()
        self.editTNS = editTNSnamesBackend()
        self.popWidgets()
        self.listWidget.itemClicked.connect(self.change)
        self.actionTNS_Names.triggered.connect(self.editTNSnames)


    def editTNSnames(self):
        self.editTNS.show()

    def change(self):
        index = self.listWidget.currentRow()
        self.stackedWidget.setCurrentIndex(index)
        self.url = self.login.creds()
        print('url change.  ' + self.url)

    def popList(self):
        widgets = ['Login', 'Edit Database', 'Edit Mapping']
        self.listWidget.addItems(widgets)

    def popWidgets(self):
        self.stackedWidget.insertWidget(0,self.login)
        self.stackedWidget.setCurrentWidget(self.login)
        self.stackedWidget.insertWidget(1,self.edit)        
        self.stackedWidget.setCurrentWidget(self.edit)
        self.stackedWidget.insertWidget(2,self.mapping)
        self.stackedWidget.setCurrentWidget(self.mapping)
        self.stackedWidget.setCurrentIndex(0)
        self.listWidget.setCurrentRow(0)

def main():
    app = 0
    app = QApplication(sys.argv)
    main_window = mainBackend()
    main_window.show()
    app.exec_()

if __name__ == "__main__":
    main()

loginBackend和主窗口中的print语句打印我需要的内容,但我无法让它在editorBackend中打印任何内容。有人对如何解决这个问题有什么建议吗?或者有什么解决办法吗?你知道吗

设计器文件(缩写):

登录设计类:

class Ui_Login(object):
    def setupUi(self, Login):
        Login.setObjectName("Login")

        ...
        ...
        ...

 def retranslateUi(self, Login):
        _translate = QtCore.QCoreApplication.translate

编辑器设计类:

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")

        ...
        ...
        ...

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate

主窗口类:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")

        ...
        ...
        ...

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate

Tags: fromimportselfformurluiinit部件
1条回答
网友
1楼 · 发布于 2024-05-20 18:21:19

所以我通过在类中创建一个函数来解决我的问题。然后我就可以把它作为一个参数从主窗口传递出去(在那里我知道我可以得到值)。如下所示。你知道吗

在editorBackend中创建函数

from loginBackend import loginBackend

class editorBackend(QWidget, editordesign.Ui_Form):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)  
        self.initUI()
        self.url = None

    def initUI(self):
        self.submitPushButton.clicked.connect(self.Insert)


     #### NEW FUNCTION ####
     def getUrl(self, url):
        self.url = url
        print('getUrl '+url) 
     ######################

    def Insert(self): 
        print('url:  ' + self.url)

将登录信息从主窗口发送到editorBackend

from PyQt5.QtWidgets import QApplication,QMainWindow
import sys
from loginBackend import loginBackend
from mapBackend import mapBackend
from editorBackend import editorBackend
from editTNSnamesBackend import editTNSnamesBackend
import mainwindow

class mainBackend(QMainWindow, mainwindow.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)  
        self.initUI()

    def initUI(self):
        self.url = None
        self.popList()
        self.login = loginBackend()
        self.mapping = mapBackend()
        self.edit = editorBackend()
        self.editTNS = editTNSnamesBackend()
        self.popWidgets()
        self.listWidget.itemClicked.connect(self.change)
        self.actionTNS_Names.triggered.connect(self.editTNSnames)


    def editTNSnames(self):
        self.editTNS.show()

    def change(self):
        index = self.listWidget.currentRow()
        self.stackedWidget.setCurrentIndex(index)
        self.url = self.login.creds()
        print('url change.  ' + self.url)

        ### PASS THE INFORMATION TO editorBackend ###
        self.edit.getUrl(self.url)
        #############################################


    def popList(self):
        widgets = ['Login', 'Edit Database', 'Edit Mapping']
        self.listWidget.addItems(widgets)

    def popWidgets(self):
        self.stackedWidget.insertWidget(0,self.login)
        self.stackedWidget.setCurrentWidget(self.login)
        self.stackedWidget.insertWidget(1,self.edit)        
        self.stackedWidget.setCurrentWidget(self.edit)
        self.stackedWidget.insertWidget(2,self.mapping)
        self.stackedWidget.setCurrentWidget(self.mapping)
        self.stackedWidget.setCurrentIndex(0)
        self.listWidget.setCurrentRow(0)

def main():
    app = 0
    app = QApplication(sys.argv)
    main_window = mainBackend()
    main_window.show()
    app.exec_()

if __name__ == "__main__":
    main()

相关问题 更多 >