从另一个文件访问PyQt GUI元素

3

我正在学习PyQt,来自网页设计背景,所以请原谅这个问题可能有很明显的答案。我正在构建一个PyQt应用程序,并希望将方法分散到多个文件中,以对应GUI的不同部分。如何从fileB.py中访问位于fileA.py中的文本框?

#fileA.py
import sys
from PyQt4 import QtGui, QtCore
from gui1 import Ui_MainWindow
import fileB

class MyApp(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)


if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        window = MyApp()
        window.show()

        #This works all fine
        def pressed():
            window.plainTextEdit.appendPlainText("Hello")


        window.pushButton.pressed.connect(pressed)


        window.button2.pressed.connect(fileB.func3)
        sys.exit(app.exec_())    

现在,在这个文件中,我想使用来自fileA.py的文本框。
#fileB.py
import fileA

    #How do I access window.plainTextEdit from fileA.py
def func3():
    print "hello"
    fileA.window.plainTextEdit.appendPlainText("Hello")

我哪里做错了?如果不是这样,最好的方法是将功能扩展到多个文件中?

感谢您抽出时间阅读此文。

2个回答

2
您可以利用Python的类继承,像这样: fileA.py:
import sys
from PyQt4 import QtGui, QtCore
from gui1 import Ui_MainWindow
import fileB

class MyApp(fileB.MyApp, QtGui.QMainWindow):
  def __init__(self):
     self.MyMethod()
     # Should print 'foo'

fileB.py:

import sys
from PyQt4 import QtGui, QtCore
from gui1 import Ui_MainWindow

class MyApp(QtGui.QMainWindow):
  def MyMethod(self):
    print 'foo'

1
首先,在if __name__ == "__main__"下的代码在导入fileA.py时永远不会运行,因此fileA.window不存在。这就是它应该做的:只有在__name__"__main__"时才运行,即作为顶级程序运行。相反,您应该导入fileA.py,再次创建QApplicationwindow,然后访问window.plainTextEdit。但是,这会在代码之间创建非常紧密的耦合,因为您正在直接从fileB访问MyApp中的小部件。如果您暴露了MyApp中附加到文本框的方法,而不是让fileB.py直接执行它,那么可能会更好。因此,您可能需要考虑一下要做什么以及如何构建程序的结构。
当然,您不必以这种方式构建代码;您可以简单地执行以下操作
window = MyApp()
window.plainTextEdit.appendPlainText("Hello")

如果需要的话,可以在fileB中进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接