QT pythonを使用して、非常に基本的なQT反復プログラムを多数作成し、py2exeを使用してコンパイルします。これらは、別のプログラムのコントローラーで同僚によって使用されます。Processingが単純化されたコードをjavaに変換するのと同じように、単純なコマンドを実際のpythonコードに変換するPythonインタープリターをどのように構築できるのだろうか。
たとえば、「単純なコード」ファイルは次のようになります。
slider('Distance', 'dist', 50, 100, 'int')
button('Apply Changes', 'apply')
次に、以下のタイプを使用してpyQTプログラムフォームに解釈します。
slider(label, name, min, max, type)
button(label, name)
これらはすべて新しいPythonファイルに書き込まれ、実行すると適切なフォームが生成されます。私がこだわっているのは、「単純なコード」をPythonコードに解釈する方法です。
前もって感謝します
解決策#1
以下のコードは、SPEN-zarによる正規表現と分割のアイデアを使用してウィジェットタイプを識別し、入力を解析して必要な出力を生成します。明らかに、これは実際のpyQTファイルを生成するために拡張されますが、これは基本的なロジックを示す基本的なものです。
お手伝いありがとう。
import re
input = ["slider('Distance', 'dist', 50, 100, 'int')", "button('Apply Changes', 'apply')"]
pattern = r"([a-z]+)\s*\((.*)\)"
rexp = re.compile(pattern)
for line in input:
content = rexp.findall(line)
if content[0][0] == 'slider':
params = content[0][1].split(',')
name = params[0]
label = params[1]
minimum = float(params[2])
maximum = float(params[3])
print 'Slider Type: name-%s, label-%s, min-%f, max-%f' % (name, label, minimum, maximum)
elif content[0][0] == 'button':
params = content[0][1].split(',')
name = params[0]
label = params[1]
print 'Button Type: name-%s, label-%s' % (name, label)
else:
print 'This widget type is not recognized'
解決策#2
Blenderの提案をさらに調査した後、クラスを使用してボタンを定義する以下のコードを変更しました。このクラスは、必要な回数だけフォームに簡単に追加できます。必要なすべてのタイプのクラスを構築することにより、フォームの生成とライブラリの保守および追加が簡単になります。
from PyQt4 import QtGui, QtCore
import sys
class Main(QtGui.QMainWindow):
def __init__(self, parent = None):
super(Main, self).__init__(parent)
# main button
self.addButton = QtGui.QPushButton('button to add other widgets')
self.addButton.clicked.connect(self.addWidget)
# scroll area widget contents - layout
self.scrollLayout = QtGui.QFormLayout()
# scroll area widget contents
self.scrollWidget = QtGui.QWidget()
self.scrollWidget.setLayout(self.scrollLayout)
# scroll area
self.scrollArea = QtGui.QScrollArea()
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setWidget(self.scrollWidget)
# main layout
self.mainLayout = QtGui.QVBoxLayout()
# add all main to the main vLayout
self.mainLayout.addWidget(self.addButton)
self.mainLayout.addWidget(self.scrollArea)
# central widget
self.centralWidget = QtGui.QWidget()
self.centralWidget.setLayout(self.mainLayout)
# set central widget
self.setCentralWidget(self.centralWidget)
def addButton(self):
self.scrollLayout.addRow(Test())
class Test(QtGui.QWidget):
def __init__( self, parent=None):
super(Test, self).__init__(parent)
self.pushButton = QtGui.QPushButton('I am in Test widget')
self.pushButton.clicked.connect(self.testPush)
layout = QtGui.QHBoxLayout()
layout.addWidget(self.pushButton)
self.setLayout(layout)
def testPush(self):
print "The test button was pushed!"
app = QtGui.QApplication(sys.argv)
myWidget = Main()
for i in xrange(5):
myWidget.addButton()
myWidget.show()
app.exec_()