Есть необходимость срочно начать писать ГУЁвые программки под линь. После недолгого лурканья был выбран python (благо Лутца я почитал, а два тома даже прикупил). Ещё после некоторого времени лурканья для, собсно, ГУЯ была выбрана PyQt (tkinter уныл, а питоновская обвязка для gtk повергла меня в первобытный ужас). И вот здесь я столкнулся с острым недостатком информации. Современная реальность такова, что наиболее предпочтительной для освоения является связка python3 + Qt5. В то же время, практически все гайды описывают Qt4. Но не суть, методом тыка научился читать гайд про Qt4 и писать ГУЙ на Qt5, отличия минимальны. Суть в другом: все гайды по PyQt повествуют о написании ГУЯ самостоятельно. Под всеми этими гайдами есть комментарии, в которых говориться что писать ГУЙ руками не модно. Мол, в комплекте с Qt идёт замечательный WYSIWYG редактор QtDesigner, формирующий .ui файл на выходе. Сам же .ui файл можно конвертировать в .py при помощи утилиты pyuic. И вот здесь у нуба возникает проблема: получаемый .py имеет совершенно отличную структуру от написанных руками примеров из гайдов. Прошу поделиться опытом гуру, использующих данные инструменты. Как вы организуете свои питоновские проекты?
Сам я пришёл вот к какой схеме:
Файлы в проекте располагаются так:
./Designs - папка, содержащая файлы .ui и сконвертированные из них .py
./Forms - см примечание*
./main.py - вызывает основное окно
./ - содержит также разные скрипты типа progname.desktop configure.py, install.sh и т.п. См**
*Сконвертированные .py не трогаю, ибо при перерисовке и переконвертации потеряется весь набранный руками код. Значит, для каждого сконвертированного .py нужен написанный руками .py, с классом-наследником, переопределяющим всё необходимое. Если моя схема имеет право на существование, наверно пихну их в папку ./Forms Пока же они лежат прямо в ./
** ./ - корневой каталок проекта.
Как реализую сами окошки
Сконвертированный .py содержит вот какой класс:
class Ui_MainWindow(object): def setupUi(self, MainWindow): #код, преобразующий переданное MainWindow def retranslateUi(self, MainWindow): #код, создающий русские надписи
Как видно, окно данный код не создаёт. Он даже не от QtWidgets.QMainWindow наследуется! Не то, что код из гайдов. Что ж, создавать окна будет обёртка. Для главного окна это будет ./main.py:
#Разные важные import from Designes.form1 import Ui_MainWindow class mainForm(Ui_MainWindow): #Инициализация def __init__(self): Ui_MainWindow.__init__(self) self.window = QtWidgets.QMainWindow() #окно, которое должно быть передано self.setupUi(self.window) #этой функции и преображено ей self.sett.clicked.connect(self.sett_onClick) #назначаем свои обработчики событий элементам #.................. self.window.show() def sett_onClick(self): #код обработки события клика по кнопке "настройки" #................... if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) form = maneForm() sys.exit(app.exec_())
Этот способ то, к чему пришёл я. Но я нуб, и потому ищу