Я создаю много очень простых 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_()
Почему бы вам просто не сделать свою собственную библиотеку высокого уровня поверх PyQt4 и использовать ее вместо этого? Это будет более ремонтопригодным, чем создание исходного кода Python. – Blender
Ну, я не застрял во всем. У меня есть pyQT, мне просто нужно знать лучший способ интерпретировать строку следующим образом: слайдер (атрибуты) – rgathmann
Блендер, после проведения большего исследования, теперь я могу оценить ценность вашего подхода. Следуя этому примеру [link] (http://stackoverflow.com/questions/8651742/dynamically-adding-and-removing-widgets-in-pyqt), я могу видеть, как вы динамически добавляете виджетов в форму путем написания классов в библиотеке. – rgathmann