Найти - Пользователи
Полная версия: Pyqt4, menubar через dict
Начало » GUI » Pyqt4, menubar через dict
1 2
apologize828
Всем привет! Решил попробовать создать меню используя словарь:
#-*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui

class My_Widget(QtGui.QMainWindow):
def __init__(self,parent=None):
QtGui.QWidget.__init__(self,parent)

self.resize(300,100)
self.statusBar()
menu_list={'Файл':{'Создать...':['','Ctrl+N','Создание нового документа.'],'Открыть...':['','Ctrl+O','Открытие существующего документа.'],'Сохранить':['','Ctrl+S','Сохранение активного документа.'],'Печать':['','Ctrl+P','Печать активного документа.'],'Сохранить как...':['','','Сохранение активного документа под новым именем.']},'Правка':{'Отменить':['','Ctrl+Z','Отмена последнего выполненного действия.']},'Вставка':{'Дата и время...':['','',''],'Объект':['','','']},'Формат':{'Шрифт...':['','',''],'Абзац...':['','','']}}
for key,val in menu_list.items():
menu=self.menuBar().addMenu(key)
for key_1,val_1 in val.items():
action=QtGui.QAction(QtGui.QIcon(val_1[0]),key_1,self)
action.setShortcut(val_1[1])
action.setStatusTip(val_1[2])

menu.addAction(action)

if __name__=='__main__':
app=QtGui.QApplication(sys.argv)
wg=My_Widget()
wg.show()
app.exec_()
В принципе не смертельно,но вот , что мне не нравится:
меню строится не так как указано в словаре:Подскажите что нужно сделать чтобы все выстроилось как в словаре?
..либо как-то надо отсортировать словарь?
..либо проще сделать через список списков?
..или там еще проще все делается)
Zubchick
Словарь не упорядочен, поэтому делайте через вложенные списки или как-то там.
apologize828
Zubchick
Словарь не упорядочен, поэтому делайте через вложенные списки или как-то там.
ну я так и думал список списков)))
ZZZ
OrderedDict?
apologize828
ZZZ
OrderedDict?
спасибо ZZZ
разобрался то что надо.
apologize828
В общем изобрел такую вот вещь:
o_d это from collections import OrderedDict as o_d
......
menu_list=o_d([('Файл',o_d([('Создать...',['','Ctrl+N','Создание нового документа.',False,False,False]),('Открыть...',['','Ctrl+O','Открытие существующего документа.',False,False,False]),('Сохранить',['','Ctrl+S','Сохранение активного документа.',False,False,False]),('Сохранить как...',['','','Сохранение активного документа под новым именем.',False,False,True]),('Печать',['','Ctrl+P','Печать активного документа.',False,False,True]),('Выход',['','','Завершение работы с приложением; сохранение документов.',False,False,False])])),('Правка',o_d([('Отменить',['','Ctrl+Z','Отмена последнего действия.',False,False,True]),('Вырезать',['','Ctrl+X','Удаление выделенного фрагмента в буфер обмена.',False,False,False])])),('Вид',o_d([('Панель инструментов',['','','Вывод и скрытие панели инструментов.',True,True,False]),('Панель форматирования',['','','Вывод и скрытие панели форматирования.',True,True,False])])),('Вставка',o_d([('Дата и время...',['','','Вставка в текст текущих даты и/или времени.',False,False,False]),('Объект',['','','Вставка в документ нового объекта.',False,False,False])])),('Формат',o_d([('Шрифт...',['','','Выбор шрифта для выделенного фрагмента текста.',False,False,False]),('Абзац...',['','','Форматирование текущего либо выделенных абзацев.',False,False,False])])),('Справка',o_d([('Вызов справки',['','','Вывод содержания встроенной справки.',False,False,True]),('О программе',['','','Вывод сведений о программе, ее версии и авторских правах.',False,False,False])]))])
for key,val in menu_list.items():
menu=self.menuBar().addMenu(key)
for k,v in val.items():
action=QtGui.QAction(QtGui.QIcon(v[0]),k,self)
action.setShortcut(v[1])
action.setStatusTip(v[2])
action.setCheckable(v[3])
action.setChecked(v[4])
menu.addAction(action)
separator=v[5]
if separator==True:
menu.addSeparator()
......
Но на этом этапе мне нужен совет такого рода, т.к никогда раньше не делал таких вещей:
Меню у нас имеется и теперь надо написать и приделать к каждому пункту функцию, подскажите как это правильно сделать?
У меня есть такая идея:
Допустим у нас есть все функции и осталось их только приделать куда надо.Тут я взял и добавил для каждого пункта нужную функцию в тот же самый словарь и тогда потом только надо будет добавить вот эту строчку в код выше:
....
action.triggered.connect(v[6])
....
где v и будет нужная функция,переданная нами в словарь
если так нельзя, то скажите как делать правильно.
ZZZ
Так можно, но… “Flat is better than nested” и “Readability counts”.
apologize828
ZZZ
Так можно, но… “Flat is better than nested” и “Readability counts”.
Как я понял вложение не есть гуд,так как пострадает читабельность кода.
А как тогда можно избежать вложения функций в словарь?
Короче как можно по-другому сделать?
Можно пример или можно просто написать смысл.
ZZZ
А зачем вообще menu_list? Может просто наполнить menuBar руками? :-)
ИМХО, это куда более понятное решение.
apologize828
ZZZ
А зачем вообще menu_list? Может просто наполнить menuBar руками? :-)
ИМХО, это куда более понятное решение.
Понятно что руками можно все написать ‘'тупо в лоб’', но тогда кода намного больше займет, тем более что придется можно сказать повторять один и тот же код, а это не есть красиво и не есть гуд…
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