Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 19, 2013 20:29:33

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу критики и подсказки (Qt, велосипед)

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

Третий: а как можно создать новую переменную, взяв ее название из строки?

Отредактировано pmus (Дек. 19, 2013 20:36:05)

Офлайн

#2 Дек. 19, 2013 21:12:29

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2751
Репутация: +  184  -
Профиль   Отправить e-mail  

Прошу критики и подсказки (Qt, велосипед)

У меня пока только один вопрос “Зачем всё это нужно”?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Дек. 19, 2013 21:16:52)

Офлайн

#3 Дек. 20, 2013 03:51:40

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу критики и подсказки (Qt, велосипед)

Rodegast
У меня пока только один вопрос “Зачем всё это нужно”?

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

Хочу просто написать: вот файл с окошком, вот обработчики кнопок, вот поля ввода текста, и поехали дальше.

Отредактировано pmus (Дек. 20, 2013 07:57:37)

Офлайн

#4 Дек. 20, 2013 08:02:14

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Прошу критики и подсказки (Qt, велосипед)

pmus
почитай что-нибудь по наследованию в классах

Офлайн

#5 Дек. 20, 2013 12:55:11

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Прошу критики и подсказки (Qt, велосипед)

ТС прочитайте про pyuic, зачем велосипед свой.
Ну и есть же uic модуль в PyQt который позволяет грузить ui файлы.



Офлайн

#6 Дек. 20, 2013 16:50:33

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу критики и подсказки (Qt, велосипед)

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
То есть, в итоге писать совсем уж ленивый и короткий код.

Отредактировано pmus (Дек. 20, 2013 17:21:25)

Офлайн

#7 Дек. 21, 2013 10:56:48

mironich
От:
Зарегистрирован: 2011-05-23
Сообщения: 118
Репутация: +  2  -
Профиль   Отправить e-mail  

Прошу критики и подсказки (Qt, велосипед)

pmus
И не вспоминать, где там .toPlainText, а где .text, например:
Это надо знать, запомнить не так уж и сложно..
QLineInput - text()
QPlainTextEdit - toPlainText()
QSpinBox - value()

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



Офлайн

#8 Дек. 21, 2013 11:21:39

pmus
Зарегистрирован: 2013-04-03
Сообщения: 46
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу критики и подсказки (Qt, велосипед)

mironich
Это надо знать, запомнить не так уж и сложно..

А зачем мне это запоминать, если я могу один раз и навсегда написать библиотеку, и больше не возвращаться к вопросу? Есть же принцип DRY? (ну и KISS, конечно)

Отредактировано pmus (Дек. 21, 2013 11:23:59)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version