从另一个模块Python

时间:2018-12-13 14:11:07

标签: python pyqt5

我有这个:

oknoGlowne.py-主模块:

    from oknoNazwa import oknoNazwa
    from oknoKola import oknoKola
    from oknoIkona import oknoIkona
    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *

    class Main(QMainWindow):

        def __init__(self):
            QMainWindow.__init__(self)
            self.initUI()

        def initMenu(self):
            menu = self.menuBar()

            dialog = menu.addMenu("Dialog")

            nazwa = QAction("Nazwa okna głównego", self)
            nazwa.setCheckable(1)
            self.oknoNazwa = oknoNazwa()
            nazwa.triggered.connect(lambda: self.oknoNazwa.show())
            kola = QAction("Ustaw koła", self)
            kola.setCheckable(1)
            self.oknoKola = oknoKola()
            kola.triggered.connect(lambda: self.oknoKola.show())
            ikona = QAction("Zmień ikonę", self)
            ikona.setCheckable(1)
            self.oknoIkona = oknoIkona()
            ikona.triggered.connect(lambda: self.oknoIkona.show())

            dialog.addAction(nazwa)
            dialog.addAction(kola)
            dialog.addAction(ikona)

        def initUI(self):
            self.setGeometry(100, 100, 300, 200)
            self.setMinimumSize(300,200)
            self.setWindowTitle("Notatnik")
            self.initMenu()

        def zmianaNazwy(self, tekst):
            self.setWindowTitle(tekst)


    def main():

        app = QApplication(sys.argv)

        okno = Main()
        okno.show()

        sys.exit(app.exec_())

    if __name__ == "__main__":
        main()

和oknoNazwa.py-辅助模块:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class oknoNazwa(QDialog):

    def __init__(self):
        QDialog.__init__(self)
        self.initUI()


    def initUI(self):
        self.setModal(0)
        self.resize(200,60)
        self.setWindowTitle("Zmień nazwę")
        vbox = QVBoxLayout()
        label = QLabel("Podaj nową nazwę programu:")
        vbox.addWidget(label)
        pole=QLineEdit()
        vbox.addWidget(pole)
        buttony = QWidget()
        vbox.addWidget(buttony)
        hbox = QHBoxLayout()
        okButton = QPushButton("Zatwierdź")
        cancelButton = QPushButton("Anuluj")
        hbox.addWidget(okButton)
        hbox.addWidget(cancelButton)
        buttony.setLayout(hbox)

        okButton.clicked.connect(lambda: self.zmienNazwe)
        cancelButton.clicked.connect(lambda: self.done(1))
        self.setLayout(vbox)

    def zmienNazwe(self):
        self.Main.zmianaNazwy(self.pole.text())
        self.done(1)

如何在辅助模块中调用属于主模块的函数-zmianaNazwy(),该辅助模块是具有包含新主窗口标题的字符串值的文本字段的对话框。 我也想将该函数包装到另一个函数中,以便可以将其动作附加到按钮上,但这也许是不必要的,并且需要调用主模块 名称更改功能就足够了。那么问题是我该怎么办?

正如您所看到的,我已经尝试使用self.main类来执行此操作,但这是行不通的,甚至self.done(1)也没有执行,我想这是因为self被当作QPushButton但我可能错了,所以请澄清一下。

2LDR->如何在对话框中的主模块中调用功能(并将其分配给该对话框中的按钮动作),该功能位于另一个模块中,而该模块在主模块中按下按钮时被调用?

2 个答案:

答案 0 :(得分:0)

deneme2.py

class package1:
    def main(self):
        print('a')

deneme1.py

from deneme2 import package1

package1().main()

输出:

a

答案 1 :(得分:0)

首先,当您想要一个对象访问另一个对象的方法时,请不要以“模块”和“功能”来思考。您的 Object obj = VcsDataKeys.COMMIT_MESSAGE_CONTROL.getData(actionEvent.getDataContext()); String cntrl = "null"; if (obj instanceof com.intellij.openapi.vcs.ui.CommitMessage) { cntrl = ((com.intellij.openapi.vcs.ui.CommitMessage)obj).getComment(); } 对象所需的不是“调用主模块的函数zmianaNazwy()”,而是调用oknoNazwa.oknoNazwa实例的.zmianaNazwy() 方法创建了main.Main实例。

显然,这里的解决方案是更改oknoNazwa.oknoNazwa,以使其引用oknoNazwa.oknoNazwa实例本身或当前main.Main实例的main.Main方法的引用( (因为python方法也是对象),那么要使.zmianaNazwy本身(或者是main.Main方法)传递给.zmianaNazwy。玩具示例:

oknoNazwa.oknoNazwa

# sub.py
class Sub(object):
    def __init__(self, main):
        self.main = main

    def do_this(self):
        print(self.main.do_that(42))

请注意:命名约定是对模块名称使用all_lower_with_underscore,对类使用# main.py from sub import Sub class Main(object): def __init__(self, name): self.name = name self.sub = Sub(self) def do_that(self, bar): return "hello, I'm {} and the answer is {}".format(self.name, bar) def run(self): self.sub.dot_this() m = Main("Arthur") m.run() ,因此应使用“ oknonazwa”(模块)和“ OknoNazwa”(类)。另外,Python并没有强制(也不推荐)类似Java的“每个类一个文件”方法-您可以在同一模块中拥有多个类,函数等。最后,如果您重视自己的理智,应该避免开始导入(即CamelCase)-即使lib的文档指出“没关系”并在所有示例中都使用了它,这仍然是一件很糟糕的事情/可维护性。