在 PyQt 中从外部 GUI class 访问 GUI 元素
Accessing GUI elements from outside GUI class in PyQt
注意:我已经阅读了 this post,但不幸的是我没看懂。
我的目录设置有点像这样:
Main_Folder
|_ Base_Gui_File.py
|_ Child_directory (a directory inside Main_Folder)
|_ __init__.py
|_ some_other.py
我在 Base_Gui_File.py
文件中获得了所有 GUI 代码,该文件是从 designer
(PyQt4) 生成的。有一个文本输入字段 QLineEdit
、一个按钮 QPushButton
和一个文本区域 QTextBrowser
。
默认情况下 QTextBrowser
是隐藏的。但是,我想做的是,当有人在 QLineEdit
中键入内容并单击 QPushButton
时,它会将字符串从 QLineEdit
发送到 [=23] 中的方法=] 文件在 Child_Directory
中。在对该字符串执行某些操作后,some_other.py
文件中的方法将 show
Base_Gui_File.py
中的 QTextBrowser
并在 QTextBrowser
中打印一些内容。
到目前为止,我已经能够通过从 QLineEdit
获取输入,将字符串从 Base_GUI_File.py
发送到 some_other.py
文件。这是两个文件的代码:
some_other.py:
import sys
sys.path.append("..")
from Base_Gui_File import Ui_MainWindow
class childone(object):
"""docstring for childone"""
def __init__(self):
super(childone, self).__init__()
def somemethod(self, url):
pass
print 'Hey!'
final_string = str(url) + "Just tying this!"
print final_string
Base_Gui_file.py:
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 544)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.MyPushButton = QtGui.QPushButton(self.centralwidget)
self.MyPushButton.setGeometry(QtCore.QRect(680, 40, 75, 23))
self.MyPushButton.setObjectName(_fromUtf8("MyPushButton"))
self.MyLabel = QtGui.QLabel(self.centralwidget)
self.MyLabel.setGeometry(QtCore.QRect(30, 30, 46, 13))
self.MyLabel.setObjectName(_fromUtf8("MyLabel"))
self.MyTextArea = QtGui.QTextBrowser(self.centralwidget)
self.MyTextArea.setGeometry(QtCore.QRect(20, 110, 721, 361))
self.MyTextArea.setObjectName(_fromUtf8("MyTextArea"))
self.MyTextField = QtGui.QLineEdit(self.centralwidget)
self.MyTextField.setGeometry(QtCore.QRect(100, 30, 571, 41))
self.MyTextField.setObjectName(_fromUtf8("MyTextField"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
self.menuFIle = QtGui.QMenu(self.menubar)
self.menuFIle.setObjectName(_fromUtf8("menuFIle"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.menubar.addAction(self.menuFIle.menuAction())
self.MyPushButton.clicked.connect(self.download_click)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.MyPushButton.setText(_translate("MainWindow", "PushButton", None))
self.MyLabel.setText(_translate("MainWindow", "TextLabel", None))
self.menuFIle.setTitle(_translate("MainWindow", "FIle", None))
def download_click(self):
self.MyTextArea.textCursor().insertHtml('Im HERE!') # This is working as it should
url = str(self.MyTextField.text())
from Child_directory.some_other import childone
childone().somemethod(url)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我该怎么做?我 2 天前开始进行 GUI 和 OO 编程 (Python),所以我对它还很陌生。所以,即使它只是一个正确方向的指南,那也很棒!
正如我在您链接的答案中所说:编辑由 pyuic
生成的模块总是错误的。它应该是您导入主程序的静态模块。
此外,您程序的当前结构看起来是倒退的。主脚本应该在顶层,所有模块都应该在它下面的包中。这将确保您不需要执行任何奇怪的 sys.path
操作来导入您自己的模块。结构应该如下所示:
program
|_ main.py
|_ package
|_ __init__.py
|_ app.py
|_ gui.py
|_ utils.py
您的 main.py
脚本应该非常简单,如下所示:
if __name__ == '__main__':
import sys
from package import app
sys.exit(app.run())
这样做很重要,因为这个脚本的路径将成为sys.path
中的第一个条目。这意味着您可以在程序的 任何其他模块中执行 from package import xxx
,导入将始终正常工作。
app
模块应该如下所示:
import sys
from PyQt4 import QtCore, QtGui
from package.gui import Ui_MainWindow
from package import utils
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.MyPushButton.clicked.connect(self.download_click)
def download_click(self):
self.MyTextArea.textCursor().insertHtml('Hello World!')
url = str(self.MyTextField.text())
utils.some_func(url)
def run():
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
return app.exec_()
请注意,我已将您对 gui 模块所做的编辑移动到应用程序模块中。 MainWindow
class 将拉入您在 Qt Designer 中添加的所有小部件,它们将成为 class 实例的属性。所以一旦你重新安排了你的程序,你应该使用 pyuic
.
重新生成 gui 模块
注意:我已经阅读了 this post,但不幸的是我没看懂。 我的目录设置有点像这样:
Main_Folder
|_ Base_Gui_File.py
|_ Child_directory (a directory inside Main_Folder)
|_ __init__.py
|_ some_other.py
我在 Base_Gui_File.py
文件中获得了所有 GUI 代码,该文件是从 designer
(PyQt4) 生成的。有一个文本输入字段 QLineEdit
、一个按钮 QPushButton
和一个文本区域 QTextBrowser
。
默认情况下 QTextBrowser
是隐藏的。但是,我想做的是,当有人在 QLineEdit
中键入内容并单击 QPushButton
时,它会将字符串从 QLineEdit
发送到 [=23] 中的方法=] 文件在 Child_Directory
中。在对该字符串执行某些操作后,some_other.py
文件中的方法将 show
Base_Gui_File.py
中的 QTextBrowser
并在 QTextBrowser
中打印一些内容。
到目前为止,我已经能够通过从 QLineEdit
获取输入,将字符串从 Base_GUI_File.py
发送到 some_other.py
文件。这是两个文件的代码:
some_other.py:
import sys
sys.path.append("..")
from Base_Gui_File import Ui_MainWindow
class childone(object):
"""docstring for childone"""
def __init__(self):
super(childone, self).__init__()
def somemethod(self, url):
pass
print 'Hey!'
final_string = str(url) + "Just tying this!"
print final_string
Base_Gui_file.py:
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 544)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.MyPushButton = QtGui.QPushButton(self.centralwidget)
self.MyPushButton.setGeometry(QtCore.QRect(680, 40, 75, 23))
self.MyPushButton.setObjectName(_fromUtf8("MyPushButton"))
self.MyLabel = QtGui.QLabel(self.centralwidget)
self.MyLabel.setGeometry(QtCore.QRect(30, 30, 46, 13))
self.MyLabel.setObjectName(_fromUtf8("MyLabel"))
self.MyTextArea = QtGui.QTextBrowser(self.centralwidget)
self.MyTextArea.setGeometry(QtCore.QRect(20, 110, 721, 361))
self.MyTextArea.setObjectName(_fromUtf8("MyTextArea"))
self.MyTextField = QtGui.QLineEdit(self.centralwidget)
self.MyTextField.setGeometry(QtCore.QRect(100, 30, 571, 41))
self.MyTextField.setObjectName(_fromUtf8("MyTextField"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
self.menuFIle = QtGui.QMenu(self.menubar)
self.menuFIle.setObjectName(_fromUtf8("menuFIle"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.menubar.addAction(self.menuFIle.menuAction())
self.MyPushButton.clicked.connect(self.download_click)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.MyPushButton.setText(_translate("MainWindow", "PushButton", None))
self.MyLabel.setText(_translate("MainWindow", "TextLabel", None))
self.menuFIle.setTitle(_translate("MainWindow", "FIle", None))
def download_click(self):
self.MyTextArea.textCursor().insertHtml('Im HERE!') # This is working as it should
url = str(self.MyTextField.text())
from Child_directory.some_other import childone
childone().somemethod(url)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我该怎么做?我 2 天前开始进行 GUI 和 OO 编程 (Python),所以我对它还很陌生。所以,即使它只是一个正确方向的指南,那也很棒!
正如我在您链接的答案中所说:编辑由 pyuic
生成的模块总是错误的。它应该是您导入主程序的静态模块。
此外,您程序的当前结构看起来是倒退的。主脚本应该在顶层,所有模块都应该在它下面的包中。这将确保您不需要执行任何奇怪的 sys.path
操作来导入您自己的模块。结构应该如下所示:
program
|_ main.py
|_ package
|_ __init__.py
|_ app.py
|_ gui.py
|_ utils.py
您的 main.py
脚本应该非常简单,如下所示:
if __name__ == '__main__':
import sys
from package import app
sys.exit(app.run())
这样做很重要,因为这个脚本的路径将成为sys.path
中的第一个条目。这意味着您可以在程序的 任何其他模块中执行 from package import xxx
,导入将始终正常工作。
app
模块应该如下所示:
import sys
from PyQt4 import QtCore, QtGui
from package.gui import Ui_MainWindow
from package import utils
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.MyPushButton.clicked.connect(self.download_click)
def download_click(self):
self.MyTextArea.textCursor().insertHtml('Hello World!')
url = str(self.MyTextField.text())
utils.some_func(url)
def run():
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.show()
return app.exec_()
请注意,我已将您对 gui 模块所做的编辑移动到应用程序模块中。 MainWindow
class 将拉入您在 Qt Designer 中添加的所有小部件,它们将成为 class 实例的属性。所以一旦你重新安排了你的程序,你应该使用 pyuic
.