Advertisement
AZJIO

Меню путей

Jan 22nd, 2015
943
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.77 KB | None | 0 0
  1. #!/usr/bin/python
  2. #coding: utf-8
  3.  
  4. # Скрипт делает в трее иконку с меню избранных путей и при клике открывает их с помощью nemo. Замените имя nemo на имя вашего файлового менеджера и попробуйте.
  5.  
  6.  
  7. import wx
  8. import os
  9. import re
  10. import sys
  11. import codecs
  12. # import yaml
  13.  
  14. # Выбираем файловый менеджер
  15. FILE_MANAGER = 'nemo'
  16. # FILE_MANAGER = 'krusader'
  17. # FILE_MANAGER = 'dolphin'
  18.  
  19.  
  20. class TaskBarIcon(wx.TaskBarIcon):
  21.  
  22.     def __init__(self, parent):
  23.         self.curpath = os.path.realpath(os.path.dirname(sys.argv[0])) # Возвращает путь к каталогу запущенного скрипта
  24.         if not os.path.isfile(self.curpath + '/config'): # Если существует ini-файл, то
  25.             # wx.MessageBox("Отсутствует конфигурационный файл", "Ошибка", wx.OK | wx.ICON_ERROR)
  26.             self.CreateConf() # создаём начальный конфиг
  27.             # sys.exit()
  28.         wx.TaskBarIcon.__init__(self)
  29.         self.parentApp = parent
  30.         self.myIcon = wx.Icon(self.curpath + "/images/SaveFolders.png",wx.BITMAP_TYPE_PNG) # Создаст иконку как объект
  31.         self.SetIcon(self.myIcon, "SaveFolders") # Назначит иконку и текст (имя программы)
  32.         self.CreateMenu() # вызов функции создания меню, см. ниже
  33.  
  34.     def CreateMenu(self):
  35.         self.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.ShowMenu) # Связать событие с "Показать меню"
  36.         self.Bind(wx.EVT_TASKBAR_LEFT_UP, self.ShowMenu) # Связать событие с "Показать меню"
  37.         # self.Bind(wx.EVT_MENU, self.OnLoad1, id=LOAD1) # Связать событие с "Настройки"
  38.  
  39.         # Тест для пунктов меню, а фактически имена секций нужны для категорий (вместо self.submenu_load)
  40.  
  41.         with codecs.open(self.curpath + '/config', "r", "utf-8") as f:
  42.             string = f.read()
  43.         # with open(self.curpath + '/config') as f:
  44.             # content = f.read()
  45.         # проблема yaml - возвращаемый список непоследовательный конфигу
  46.         # with open(self.curpath + '/config', 'r') as fd:
  47.             # cfg = yaml.load(fd)
  48.  
  49.         cfg_section = re.findall(r'(?s)\[([^\v]*?)\]\n(.*?)(?=\n\n\[|\n*\Z)', string) # разрешить пробелы. Возвращает имена секций и их содержимое
  50.         self.menu = wx.Menu()
  51.         i=0
  52.         j=9999 # чтобы посторонние id не мешали упорядоченному id полезных пунктов
  53.         # global a # чтобы массив был виден в функциях
  54.         self.a = []
  55.         # global tmp # чтобы tmp родительского цикла были видны в tmp вложенного цикла и наоборот
  56.  
  57.         for x in cfg_section:
  58.             j -= 1
  59.             self.tmp = wx.Menu()
  60.             # self.menu.AppendMenu(j, x[0], self.tmp)
  61.             item = wx.MenuItem(self.menu,j, x[0]) # Создаём пункт
  62.             item.SetBitmap(wx.Bitmap(self.curpath + '/images/folder.png')) # Назначаем значок
  63.             item.SetSubMenu(self.tmp) # Делаем пункт раскрывающимся (подменю)
  64.             self.menu.AppendItem(item) # Добавляем пункт в родительское меню
  65.             # self.menu.AppendItem(item)
  66.             s = x[1].split('\n')
  67.             self.a += s # Делаем список всех путей, с помощью GetId() узнаём id кликнутого пукнта, чтобы использовать из массива соответс. строку?
  68.             for z in s:
  69.                 i += 1
  70.                 self.Bind(wx.EVT_MENU, self.OnLoad, id=i)
  71.                 if len(z) > 40:
  72.                     z = re.sub(r'(^.{3,11}/|.{11})(.*)(/.{6,27}|.{27})$', r'\1...\3', z)
  73.                     item = wx.MenuItem(self.tmp, i, z)
  74.                     item.SetBitmap(wx.Bitmap(self.curpath + '/images/folder.png'))
  75.                     self.tmp.AppendItem(item)
  76.                 else:
  77.                     item = wx.MenuItem(self.tmp, i, z)
  78.                     item.SetBitmap(wx.Bitmap(self.curpath + '/images/folder.png'))
  79.                     self.tmp.AppendItem(item)
  80.         self.menu.AppendSeparator()
  81.         self.opt = wx.Menu()
  82.         item = wx.MenuItem(self.menu,j, 'Меню') # Создаём пункт
  83.         item.SetBitmap(wx.Bitmap(self.curpath + '/images/setting.png')) # Назначаем значок
  84.         item.SetSubMenu(self.opt) # Делаем пункт раскрывающимся (подменю)
  85.         self.menu.AppendItem(item) # Добавляем пункт в родительское меню
  86.         # self.menu.AppendMenu(j, 'Меню', self.opt)
  87.        
  88.         item = wx.MenuItem(self.opt, 9997, u'Открыть конфиг')
  89.         item.SetBitmap(wx.Bitmap(self.curpath + '/images/config.png'))
  90.         self.opt.AppendItem(item)
  91.         self.Bind(wx.EVT_MENU, self.open_config, id=9997)
  92.        
  93.         item = wx.MenuItem(self.opt, 9998, u'Папка программы')
  94.         item.SetBitmap(wx.Bitmap(self.curpath + '/images/folder.png'))
  95.         self.opt.AppendItem(item)
  96.         self.Bind(wx.EVT_MENU, self.folder_prog, id=9998)
  97.        
  98.         item = wx.MenuItem(self.opt, 9999, u'Выход')
  99.         item.SetBitmap(wx.Bitmap(self.curpath + '/images/exit.png'))
  100.         self.opt.AppendItem(item)
  101.         self.Bind(wx.EVT_MENU, self.exitApp, id=9999) # wx.ID_EXIT вместо 9999 и появится иконка
  102.        
  103.         # print wx.ID_EXIT # проверка id (5006), думал системные будут в диапазоне отрицательных чисел
  104.         # Цикл проверки
  105.         # for x in a:
  106.             # print x
  107.  
  108.     def ShowMenu(self,event): # Показать меню
  109.         self.PopupMenu(self.menu)
  110.  
  111.     def exitApp(self,event): # Функция завершения скрипта
  112.         self.RemoveIcon() # Удаление иконки из трея
  113.         self.Destroy() # Удаление элемента TaskBarIcon (меню, освобождение памяти)
  114.         sys.exit() # Собственно завершение скрипта
  115.  
  116.     def OnLoad(self,event):
  117.         path = self.a[event.GetId() - 1] # Получить путь из массива по id
  118.         path = codecs.encode(path, 'utf_8') # Кодировать в utf-8
  119.         path = os.path.expanduser(path) # Раскрыть переменные в пути
  120.         os.system(FILE_MANAGER + ' "' + path + '" &') #  команда <nemo "путь" &>, где & - выполнить в фоне
  121.  
  122.     def folder_prog(self,event):
  123.         os.system(FILE_MANAGER + ' "' + self.curpath + '" &')
  124.  
  125.     def open_config(self,event):
  126.         # if os.path.exists('geany'): # Если существует текстовый редактор geany, то
  127.             # os.system('geany "' + self.curpath + '/config"')
  128.  
  129.         if os.path.exists('/bin/geany'):
  130.             os.system('/bin/geany "' + self.curpath + '/config" &')
  131.         elif os.path.exists('/bin/gedit'):
  132.             os.system('/bin/gedit "' + self.curpath + '/config" &')
  133.         else:
  134.             wx.MessageBox("Не найден текстовый редактор", "Ошибка", wx.OK | wx.ICON_ERROR)
  135.  
  136.     def CreateConf(self):
  137.         # Эти данные осхраняются в файл с именем "config" при его отсутствии
  138.         config = """[Nemo]
  139. /usr/share/themes
  140. /usr/share/icons
  141. /usr/share/locale/ru/LC_MESSAGES
  142. /usr/share/nemo/actions
  143. /usr/share/cinnamon/applets/keyboard@cinnamon.org/flags
  144. /usr/share/cinnamon/thumbnails/metacity-1
  145.  
  146. [usr]
  147. /usr/share/applications
  148. /usr/share/backgrounds
  149. /usr/share/doc
  150. /usr/share/fonts
  151. /usr/share/icons
  152. /usr/share/locale
  153. /usr/share/mime
  154. /usr/share/pixmaps
  155. /usr/share/themes
  156.  
  157. [local]
  158. ~/.icons
  159. ~/.themes
  160. ~/.config
  161. ~/.local/share
  162. ~/.kde/share
  163. ~/.fonts
  164. """
  165.         # Запись в файл
  166.         with open(self.curpath + '/config', 'wb') as f:
  167.             f.write(config)
  168.  
  169. # Запуск программы
  170. def main(argv=None):
  171.     app = wx.App()
  172.     TaskBarIcon(None)
  173.     app.MainLoop()
  174.  
  175. if __name__ == '__main__':
  176.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement