Найти - Пользователи
Полная версия: Прошу критики и подсказки (Qt, велосипед)
Начало » Python для экспертов » Прошу критики и подсказки (Qt, велосипед)
1
pmus
Вот, пишу библиотечку, чтобы не заморачиваться постоянно с QT

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]
, но как-то не пойму, как сослаться-то правильно.

Третий: а как можно создать новую переменную, взяв ее название из строки?
Rodegast
У меня пока только один вопрос “Зачем всё это нужно”?
pmus
Rodegast
У меня пока только один вопрос “Зачем всё это нужно”?

Чтобы не писать каждый раз развесистый класс для GUI, если мне нужно 5-7 полей ввода и три кнопки.

Хочу просто написать: вот файл с окошком, вот обработчики кнопок, вот поля ввода текста, и поехали дальше.
sergeek
pmus
почитай что-нибудь по наследованию в классах
mironich
ТС прочитайте про pyuic, зачем велосипед свой.
Ну и есть же uic модуль в PyQt который позволяет грузить ui файлы.
pmus
mironich
Ну и есть же uic модуль в PyQt который позволяет грузить ui файлы.

Так я его и использую!
 # Now load this UI
from PyQt4 import QtGui, QtCore, uic

Просто хочу этой библиотекой упростить и ускорить процесс работы разработки с *.ui файлами.

Чтобы не писать каждый раз в программе такое:

 QtCore.QObject.connect(getattr(self.window, func), QtCore.SIGNAL("clicked()"), button)

И не вспоминать, где там .toPlainText, а где .text, например:
        jobs = self.window.text_jobs.toPlainText()
        login = self.window.text_login.text()

, а сделать, чтобы вместо этого можно было писать вот так:
gui = gui_file('main.ui', buttons=[okbutton, nobutton, gobutton], inputs=[text_jobs, text_login])
#...
jobs = gui.text_jobs
login = gui.text_login
То есть, в итоге писать совсем уж ленивый и короткий код.
mironich
pmus
И не вспоминать, где там .toPlainText, а где .text, например:
Это надо знать, запомнить не так уж и сложно..
QLineInput - text()
QPlainTextEdit - toPlainText()
QSpinBox - value()

и.т.д..
Все это легко запоминается, когда относительно часто используешь Qt
pmus
mironich
Это надо знать, запомнить не так уж и сложно..

А зачем мне это запоминать, если я могу один раз и навсегда написать библиотеку, и больше не возвращаться к вопросу? Есть же принцип DRY? (ну и KISS, конечно)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB