1

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_()
4

1 に答える 1

0

.ui 形式に解析してみましたか? それが XML であり、非常に単純です。

どちらの出力形式を使用する場合でも、字句解析と解析には PLY を試してください。それ以外の場合は、正規表現を使用して "(" ")" で囲まれた部分文字列を検索し.split(',')、引数を取得するために使用します。それが私の見解です。

于 2013-03-14T03:39:01.597 に答える