将 GUI 与主代码分离
Separating GUI from main code
我正在尝试改进我的编码方法,我想尝试的一件事是采用 TDD 方法。我读了很多关于它的文章和教程,但通常情况下,如果没有实际示例或测试,这不会在我脑海中停留太久,我会错过很多细节。
这就是为什么我要尝试开发一个简单的应用程序来对文件夹中的文件和目录进行研究。但是,这是我的问题:我想使用 GUI,而不是像应用程序这样的控制台。
我已经将 PySide 用于其他应用程序并且我知道它的基础知识,但我总是避免为分离 UI 和主要应用程序功能而烦恼(我知道,非常糟糕!)
对于 TDD 方法,我认为现在是学习如何做的正确时机。事实上,我可以读到要使用 GUI 进行 TDD,图形部分在逻辑上必须只是一个 "bonus layer",添加在逻辑的顶部,并且测试应该首先测试内部逻辑,然后开发人员可以或多或少地手动测试 UI...
所以问题来了:如何将我的 UI class(派生自使用 pyside-uic 生成的 class)与我的程序的其余部分分开,我如何才能让它们进行通信(仅用于简单的应用程序数据 IO)?我如何发出和使用此 class 之外的信号?
提前感谢您的帮助和建议,希望我的英文写作能被理解!
马努
编辑:我的第一个想法和读物是通过 subclassing QThread 并与 signal/slot 机制通信......这是绝对必要的并且是唯一的方法吗?
将您的主要应用程序逻辑实现为 类,或者,如果这对您的用例没有意义,则仅在单独的文件中实现函数库。然后,为您的 GUI 脚本创建另一个文件,该文件导入您的其他 files/classes.
my_example_functions_library.py
import sys
def print_message():
print "You pressed the `Enter` key!"
my_gui.py
import sys
from PySide import QtGui, QtCore
from my_example_functions_library import *
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Event handler')
self.show()
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_Enter:
print_message()
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
我正在尝试改进我的编码方法,我想尝试的一件事是采用 TDD 方法。我读了很多关于它的文章和教程,但通常情况下,如果没有实际示例或测试,这不会在我脑海中停留太久,我会错过很多细节。
这就是为什么我要尝试开发一个简单的应用程序来对文件夹中的文件和目录进行研究。但是,这是我的问题:我想使用 GUI,而不是像应用程序这样的控制台。
我已经将 PySide 用于其他应用程序并且我知道它的基础知识,但我总是避免为分离 UI 和主要应用程序功能而烦恼(我知道,非常糟糕!)
对于 TDD 方法,我认为现在是学习如何做的正确时机。事实上,我可以读到要使用 GUI 进行 TDD,图形部分在逻辑上必须只是一个 "bonus layer",添加在逻辑的顶部,并且测试应该首先测试内部逻辑,然后开发人员可以或多或少地手动测试 UI...
所以问题来了:如何将我的 UI class(派生自使用 pyside-uic 生成的 class)与我的程序的其余部分分开,我如何才能让它们进行通信(仅用于简单的应用程序数据 IO)?我如何发出和使用此 class 之外的信号?
提前感谢您的帮助和建议,希望我的英文写作能被理解!
马努
编辑:我的第一个想法和读物是通过 subclassing QThread 并与 signal/slot 机制通信......这是绝对必要的并且是唯一的方法吗?
将您的主要应用程序逻辑实现为 类,或者,如果这对您的用例没有意义,则仅在单独的文件中实现函数库。然后,为您的 GUI 脚本创建另一个文件,该文件导入您的其他 files/classes.
my_example_functions_library.py
import sys
def print_message():
print "You pressed the `Enter` key!"
my_gui.py
import sys
from PySide import QtGui, QtCore
from my_example_functions_library import *
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Event handler')
self.show()
def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_Enter:
print_message()
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()