我使用QT python构建了许多非常基本的QT重复程序,然后用py2exe编译它们。这些是我的同事在控制器上用于另一个程序。我很想知道如何构建一个将简单命令转换为实际python代码的python解释器,类似于Processing将简化代码转换为java的方式。
例如,“简单代码”文件可能是:
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_()
答案 0 :(得分:0)
您是否尝试过将其解析为.ui格式?这就是XML,这非常简单。
无论您喜欢哪种输出格式,请尝试PLY进行lexing和解析。否则,只需使用正则表达式搜索周围带有“(”“)”的子字符串,并使用.split(',')
来获取参数。这是我的看法。