file: lego.py
class gui_file(): # add also GUI_FORM def __init__(self, filename, **args): self.debug = 1 if self.debug == 1: print ('Received:', args) for f in args['buttons']: print ('=> %s' % f.__name__) # first we get all inputs, buttons from lxml import etree from StringIO import StringIO # Read all .ui file and get its widgets f = open(filename) xml = f.read() f.close() self.funcdict = {} # Parse all buttons from this file tree = etree.parse(StringIO(xml)) context = etree.iterparse(StringIO(xml)) for action, elem in context: if elem.tag == 'widget': if self.debug == 1: print ("%s -- (%s)" % (elem.attrib['name'], elem.attrib['class'])) for f in args['buttons']: if f.__name__ == elem.attrib['name']: if self.debug == 1: print 'func for %s found' % f.__name__ name = elem.attrib['name'] self.funcdict [name] = f.__name__ #print self.funcdict # Now load this UI from PyQt4 import QtGui, QtCore, uic from sys import argv as myarg self.app = QtGui.QApplication(myarg) self.window = uic.loadUi(filename) # Whistles, anyone? try: if args['style']: #print args['style'] self.app.setStyle(QtGui.QStyleFactory.create(args['style'])) except: pass # Now assign them to each other for func in self.funcdict: for button in args['buttons']: # <-- Да, это криво! if button.__name__ == func: QtCore.QObject.connect(getattr(self.window, func), QtCore.SIGNAL("clicked()"), button) if self.debug == 1: print ('assigned', getattr(self.window, func), 'to', button) def show(self): self.window.show()
Дальше делаю .ui файл в QT Desighner, с 3 кнопками.
file: test_gui.py
# -*- coding: utf-8 -*- from lego import gui_file from sys import exit def okbutton(): print ('OK pressed!') def nobutton(): print ('NO pressed!') def gobutton(): print ('GO button pressed!') if __name__ == "__main__": gui = gui_file('main.ui', buttons=[okbutton, nobutton, gobutton]) gui.show() exit(gui.app.exec_())
Собсно, вопросов несколько…
Первый: получится ли таким образом работать с QT без падений? (раньше у меня были заморочки с тредами)
Второй:
for button in args['buttons']: # <-- Да, это криво!
Как-то не получается сделать что-то типа:
if button.__name__ == args['buttons'][name]
Третий: а как можно создать новую переменную, взяв ее название из строки?