2013-03-14 3 views
1

Я создаю много очень простых QT-повторяющихся программ для работы с QT-питоном, затем скомпилируем их с py2exe. Они используются моими коллегами на контроллерах для другой программы. Я удивляюсь, как я мог бы построить интерпретатор python, который преобразует простые команды в настоящий код python, подобно тому, как Processing преобразует упрощенный код в java.Интерпретация простого кода на код 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-Зар, чтобы определить тип виджета, а затем анализировать входы для генерации необходимые выходы. Очевидно, что это будет расширено для создания реального файла 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

После выполнения дальнейших исследований в предложении блендере, я модифицировал код ниже, который использует класс для определения кнопки. Затем этот класс можно легко добавить в форму столько раз, сколько необходимо. Создавая классы для всех необходимых типов, было бы легко легко создавать формы, а также поддерживать и добавлять в библиотеку.

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_() 
+3

Почему бы вам просто не сделать свою собственную библиотеку высокого уровня поверх PyQt4 и использовать ее вместо этого? Это будет более ремонтопригодным, чем создание исходного кода Python. – Blender

+0

Ну, я не застрял во всем. У меня есть pyQT, мне просто нужно знать лучший способ интерпретировать строку следующим образом: слайдер (атрибуты) – rgathmann

+0

Блендер, после проведения большего исследования, теперь я могу оценить ценность вашего подхода. Следуя этому примеру [link] (http://stackoverflow.com/questions/8651742/dynamically-adding-and-removing-widgets-in-pyqt), я могу видеть, как вы динамически добавляете виджетов в форму путем написания классов в библиотеке. – rgathmann

ответ

0

Вы пробовали просто разобрать его в формате .ui? Это XML, что довольно просто.

Какой бы выходной формат вы предпочитаете, попробуйте PLY для лексинга и синтаксического анализа. В противном случае просто используйте регулярное выражение для поиска подстроки с «(»), окружающим ее, и используйте .split(',') для получения аргументов. Это мое занятие.

+0

Хорошо, это похоже на ответ, который я искал, оба эти метода позволят мне читать строки за строкой и интерпретировать простой код и генерировать более сложный код, который мне нужен. Спасибо. – rgathmann

Смежные вопросы