Уведомления

Группа в Telegram: @pythonsu

#1 Июль 1, 2010 15:02:45

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

Pyqt4, menubar через dict

Всем привет! Решил попробовать создать меню используя словарь:

#-*- 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_()
В принципе не смертельно,но вот , что мне не нравится:
меню строится не так как указано в словаре:Подскажите что нужно сделать чтобы все выстроилось как в словаре?
..либо как-то надо отсортировать словарь?
..либо проще сделать через список списков?
..или там еще проще все делается)



Офлайн

#2 Июль 1, 2010 16:48:33

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyqt4, menubar через dict

Словарь не упорядочен, поэтому делайте через вложенные списки или как-то там.



Офлайн

#3 Июль 1, 2010 17:02:19

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

Pyqt4, menubar через dict

Zubchick
Словарь не упорядочен, поэтому делайте через вложенные списки или как-то там.
ну я так и думал список списков)))



Офлайн

#4 Июль 1, 2010 17:55:06

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Pyqt4, menubar через dict

OrderedDict?



Офлайн

#5 Июль 1, 2010 21:27:46

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

Pyqt4, menubar через dict

ZZZ
OrderedDict?
спасибо ZZZ
разобрался то что надо.



Отредактировано (Июль 1, 2010 23:29:12)

Офлайн

#6 Июль 2, 2010 14:53:36

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

Pyqt4, menubar через dict

В общем изобрел такую вот вещь:
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 и будет нужная функция,переданная нами в словарь
если так нельзя, то скажите как делать правильно.



Отредактировано (Июль 2, 2010 14:56:40)

Офлайн

#7 Июль 2, 2010 17:31:39

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Pyqt4, menubar через dict

Так можно, но… “Flat is better than nested” и “Readability counts”.



Офлайн

#8 Июль 2, 2010 19:25:35

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

Pyqt4, menubar через dict

ZZZ
Так можно, но… “Flat is better than nested” и “Readability counts”.
Как я понял вложение не есть гуд,так как пострадает читабельность кода.
А как тогда можно избежать вложения функций в словарь?
Короче как можно по-другому сделать?
Можно пример или можно просто написать смысл.



Отредактировано (Июль 2, 2010 19:32:03)

Офлайн

#9 Июль 4, 2010 20:13:58

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Pyqt4, menubar через dict

А зачем вообще menu_list? Может просто наполнить menuBar руками? :-)
ИМХО, это куда более понятное решение.



Офлайн

#10 Июль 4, 2010 20:22:17

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

Pyqt4, menubar через dict

ZZZ
А зачем вообще menu_list? Может просто наполнить menuBar руками? :-)
ИМХО, это куда более понятное решение.
Понятно что руками можно все написать ‘'тупо в лоб’', но тогда кода намного больше займет, тем более что придется можно сказать повторять один и тот же код, а это не есть красиво и не есть гуд…



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version