Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- #coding: utf-8
- # Скрипт делает в трее иконку с меню избранных путей и при клике открывает их с помощью nemo. Замените имя nemo на имя вашего файлового менеджера и попробуйте.
- import wx
- import os
- import re
- import sys
- import codecs
- # import yaml
- # Выбираем файловый менеджер
- FILE_MANAGER = 'nemo'
- # FILE_MANAGER = 'krusader'
- # FILE_MANAGER = 'dolphin'
- class TaskBarIcon(wx.TaskBarIcon):
- def __init__(self, parent):
- self.curpath = os.path.realpath(os.path.dirname(sys.argv[0])) # Возвращает путь к каталогу запущенного скрипта
- if not os.path.isfile(self.curpath + '/config'): # Если существует ini-файл, то
- # wx.MessageBox("Отсутствует конфигурационный файл", "Ошибка", wx.OK | wx.ICON_ERROR)
- self.CreateConf() # создаём начальный конфиг
- # sys.exit()
- wx.TaskBarIcon.__init__(self)
- self.parentApp = parent
- self.myIcon = wx.Icon(self.curpath + "/images/SaveFolders.png",wx.BITMAP_TYPE_PNG) # Создаст иконку как объект
- self.SetIcon(self.myIcon, "SaveFolders") # Назначит иконку и текст (имя программы)
- self.CreateMenu() # вызов функции создания меню, см. ниже
- def CreateMenu(self):
- self.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.ShowMenu) # Связать событие с "Показать меню"
- self.Bind(wx.EVT_TASKBAR_LEFT_UP, self.ShowMenu) # Связать событие с "Показать меню"
- # self.Bind(wx.EVT_MENU, self.OnLoad1, id=LOAD1) # Связать событие с "Настройки"
- # Тест для пунктов меню, а фактически имена секций нужны для категорий (вместо self.submenu_load)
- with codecs.open(self.curpath + '/config', "r", "utf-8") as f:
- string = f.read()
- # with open(self.curpath + '/config') as f:
- # content = f.read()
- # проблема yaml - возвращаемый список непоследовательный конфигу
- # with open(self.curpath + '/config', 'r') as fd:
- # cfg = yaml.load(fd)
- cfg_section = re.findall(r'(?s)\[([^\v]*?)\]\n(.*?)(?=\n\n\[|\n*\Z)', string) # разрешить пробелы. Возвращает имена секций и их содержимое
- self.menu = wx.Menu()
- i=0
- j=9999 # чтобы посторонние id не мешали упорядоченному id полезных пунктов
- # global a # чтобы массив был виден в функциях
- self.a = []
- # global tmp # чтобы tmp родительского цикла были видны в tmp вложенного цикла и наоборот
- for x in cfg_section:
- j -= 1
- self.tmp = wx.Menu()
- # self.menu.AppendMenu(j, x[0], self.tmp)
- item = wx.MenuItem(self.menu,j, x[0]) # Создаём пункт
- item.SetBitmap(wx.Bitmap(self.curpath + '/images/folder.png')) # Назначаем значок
- item.SetSubMenu(self.tmp) # Делаем пункт раскрывающимся (подменю)
- self.menu.AppendItem(item) # Добавляем пункт в родительское меню
- # self.menu.AppendItem(item)
- s = x[1].split('\n')
- self.a += s # Делаем список всех путей, с помощью GetId() узнаём id кликнутого пукнта, чтобы использовать из массива соответс. строку?
- for z in s:
- i += 1
- self.Bind(wx.EVT_MENU, self.OnLoad, id=i)
- if len(z) > 40:
- z = re.sub(r'(^.{3,11}/|.{11})(.*)(/.{6,27}|.{27})$', r'\1...\3', z)
- item = wx.MenuItem(self.tmp, i, z)
- item.SetBitmap(wx.Bitmap(self.curpath + '/images/folder.png'))
- self.tmp.AppendItem(item)
- else:
- item = wx.MenuItem(self.tmp, i, z)
- item.SetBitmap(wx.Bitmap(self.curpath + '/images/folder.png'))
- self.tmp.AppendItem(item)
- self.menu.AppendSeparator()
- self.opt = wx.Menu()
- item = wx.MenuItem(self.menu,j, 'Меню') # Создаём пункт
- item.SetBitmap(wx.Bitmap(self.curpath + '/images/setting.png')) # Назначаем значок
- item.SetSubMenu(self.opt) # Делаем пункт раскрывающимся (подменю)
- self.menu.AppendItem(item) # Добавляем пункт в родительское меню
- # self.menu.AppendMenu(j, 'Меню', self.opt)
- item = wx.MenuItem(self.opt, 9997, u'Открыть конфиг')
- item.SetBitmap(wx.Bitmap(self.curpath + '/images/config.png'))
- self.opt.AppendItem(item)
- self.Bind(wx.EVT_MENU, self.open_config, id=9997)
- item = wx.MenuItem(self.opt, 9998, u'Папка программы')
- item.SetBitmap(wx.Bitmap(self.curpath + '/images/folder.png'))
- self.opt.AppendItem(item)
- self.Bind(wx.EVT_MENU, self.folder_prog, id=9998)
- item = wx.MenuItem(self.opt, 9999, u'Выход')
- item.SetBitmap(wx.Bitmap(self.curpath + '/images/exit.png'))
- self.opt.AppendItem(item)
- self.Bind(wx.EVT_MENU, self.exitApp, id=9999) # wx.ID_EXIT вместо 9999 и появится иконка
- # print wx.ID_EXIT # проверка id (5006), думал системные будут в диапазоне отрицательных чисел
- # Цикл проверки
- # for x in a:
- # print x
- def ShowMenu(self,event): # Показать меню
- self.PopupMenu(self.menu)
- def exitApp(self,event): # Функция завершения скрипта
- self.RemoveIcon() # Удаление иконки из трея
- self.Destroy() # Удаление элемента TaskBarIcon (меню, освобождение памяти)
- sys.exit() # Собственно завершение скрипта
- def OnLoad(self,event):
- path = self.a[event.GetId() - 1] # Получить путь из массива по id
- path = codecs.encode(path, 'utf_8') # Кодировать в utf-8
- path = os.path.expanduser(path) # Раскрыть переменные в пути
- os.system(FILE_MANAGER + ' "' + path + '" &') # команда <nemo "путь" &>, где & - выполнить в фоне
- def folder_prog(self,event):
- os.system(FILE_MANAGER + ' "' + self.curpath + '" &')
- def open_config(self,event):
- # if os.path.exists('geany'): # Если существует текстовый редактор geany, то
- # os.system('geany "' + self.curpath + '/config"')
- if os.path.exists('/bin/geany'):
- os.system('/bin/geany "' + self.curpath + '/config" &')
- elif os.path.exists('/bin/gedit'):
- os.system('/bin/gedit "' + self.curpath + '/config" &')
- else:
- wx.MessageBox("Не найден текстовый редактор", "Ошибка", wx.OK | wx.ICON_ERROR)
- def CreateConf(self):
- # Эти данные осхраняются в файл с именем "config" при его отсутствии
- config = """[Nemo]
- /usr/share/themes
- /usr/share/icons
- /usr/share/locale/ru/LC_MESSAGES
- /usr/share/nemo/actions
- /usr/share/cinnamon/applets/keyboard@cinnamon.org/flags
- /usr/share/cinnamon/thumbnails/metacity-1
- [usr]
- /usr/share/applications
- /usr/share/backgrounds
- /usr/share/doc
- /usr/share/fonts
- /usr/share/icons
- /usr/share/locale
- /usr/share/mime
- /usr/share/pixmaps
- /usr/share/themes
- [local]
- ~/.icons
- ~/.themes
- ~/.config
- ~/.local/share
- ~/.kde/share
- ~/.fonts
- """
- # Запись в файл
- with open(self.curpath + '/config', 'wb') as f:
- f.write(config)
- # Запуск программы
- def main(argv=None):
- app = wx.App()
- TaskBarIcon(None)
- app.MainLoop()
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement