別のファイルの単純なクラスメソッドに基づいてフォームを自動的に生成する方法を模索しています。アイデアは、私の「items.py」パッケージが大きくなるにつれて、「gui.py」は自動的にタブと少しの検証さえも保持するということです。私は実際に少し機能しているものを手に入れました:
関数ファイル:
def PrintHelloSomeone(str_someone):
print "Hello %s" % str_someone
def PrintN(int_N):
print "%i" % int_N
def PrintRange(int_min, int_max):
print range(int_min, int_max)
GUIファイル:
import inspect
from PySide import QtGui
class AutoForm(QtGui.QFormLayout):
ARG2GUI = {
'int' : (QtGui.QSpinBox, 'value'),
'str' : (QtGui.QLineEdit, 'text'),
}
def __init__(self, (name, function)):
super(AutoForm, self).__init__()
self.function = function
self.addRow(QtGui.QLabel(name))
self.call_list = []
for arg in inspect.getargspec(function).args:
self.call_list.append(self.arg2widget(arg))
button = QtGui.QPushButton("Run")
button.clicked.connect(self.call_function)
self.addRow(None, button)
def arg2widget(self, arg):
tp, name = arg.split('_')
widget_obj, call = self.ARG2GUI[tp]
widget = widget_obj()
widget_call = getattr(widget, call)
self.addRow(name, widget)
return widget_call
def call_function(self):
args = [call() for call in self.call_list]
self.function(*args)
if __name__ == '__main__':
import sys
import stuff
app = QtGui.QApplication(sys.argv)
w = QtGui.QWidget()
w.show()
w.setLayout(QtGui.QHBoxLayout())
for function in inspect.getmembers(stuff, inspect.isfunction):
w.layout().addLayout(AutoForm(function))
sys.exit(app.exec_())
コードは実際には機能しているように見えますが、私がやろうとしていることを実行するためのより良い方法があるかどうか疑問に思いました。