0

別のファイルの単純なクラスメソッドに基づいてフォームを自動的に生成する方法を模索しています。アイデアは、私の「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_())

コードは実際には機能しているように見えますが、私がやろうとしていることを実行するためのより良い方法があるかどうか疑問に思いました。

4

0 に答える 0