从另个文件访问PyQt GUI元素

3 投票
2 回答
4234 浏览
提问于 2025-04-16 18:56

我正在学习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 个回答

1

首先,if __name__ == "__main__" 下面的代码在你导入 fileA.py 时是不会被执行的,所以 fileA.window 是不存在的。这是正常的行为:只有当 __name__"__main__" 时,代码才会运行,也就是说,只有当它作为主程序运行时才会执行。相反,你应该导入 fileA.py,然后重新创建 QApplicationwindow,接着再访问 window.plainTextEdit。不过,这样做会让代码之间的联系变得很紧密,因为你直接从 fileB 访问了 MyApp 中的一个控件。也许更好的做法是,在 MyApp 中提供一个方法,用来向文本框添加内容,而不是让 fileB.py 直接去做。所以你可能需要考虑一下你想要实现什么,以及如何组织你的程序。

当然,你并不一定要这样组织你的代码;如果你愿意,也可以在 fileB 中简单地这样做:

window = MyApp()
window.plainTextEdit.appendPlainText("Hello")

fileB 中,如果你想的话。

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'

撰写回答