从另个文件访问PyQt GUI元素
我正在学习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
,然后重新创建 QApplication
和 window
,接着再访问 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'