Skip to content

Instantly share code, notes, and snippets.

@Atreyagaurav
Last active November 27, 2020 09:47
Show Gist options
  • Save Atreyagaurav/2a7c108fa0dd5749a0e730651f6529fd to your computer and use it in GitHub Desktop.
Save Atreyagaurav/2a7c108fa0dd5749a0e730651f6529fd to your computer and use it in GitHub Desktop.
script which shows menu for most used scripts configurable in json.
from PyQt5 import QtGui, QtWidgets, QtCore
from PyQt5.QtDBus import QDBusConnection, QDBusMessage
import sys
import json
import subprocess
import os
def exe_script(name,all_action_dict):
action = all_action_dict[name.text()]
if action == 'exit':
sys.exit(0)
elif action == 'refresh':
refresh_menu()
return
subprocess.Popen(action.split())
def read_actions():
with open('/home/gaurav/scripts/config/scripts.json') as r:
config = json.load(r)
all_actions = {v['name']:v['script'] for v in config['scripts']}
all_actions['Exit'] = 'exit'
all_actions['Refresh'] = 'refresh'
return all_actions
def get_menu(all_actions):
menu = QtWidgets.QMenu()
actions = []
for i,name in enumerate(all_actions.keys()):
mi = QtWidgets.QAction(name,menu)
actions.append(mi)
menu.addAction(mi)
menu.triggered.connect(lambda q:exe_script(q,all_actions))
return menu,actions
def refresh_menu():
print(os.path.abspath(__file__))
os.execv(sys.executable,['python',os.path.abspath(__file__)])
def on_click(num):
if num == QtWidgets.QSystemTrayIcon.Trigger:
pass
elif num == QtWidgets.QSystemTrayIcon.Context:
pass
else:
print("Click event:",num)
class QDBhandler(QtCore.QObject):
def __init__(self,icon):
super(QDBhandler,self).__init__()
bus = QDBusConnection.systemBus()
bus.registerObject('/', self)
bus.connect(
'',
'/',
'gaurav.menu',
'toggle',
self.dmsg
)
self.icon = icon
@QtCore.pyqtSlot(QDBusMessage)
def dmsg(self, message):
menu = self.icon.contextMenu()
if menu.isVisible():
menu.close()
else:
menu.show()
def main():
app = QtWidgets.QApplication(sys.argv)
img = QtGui.QIcon('/home/gaurav/Pictures/auto_icon.png')
icon = QtWidgets.QSystemTrayIcon(img)
handler = QDBhandler(icon)
icon.setToolTip('Execute Scripts')
actions_dict = read_actions()
menu,actions = get_menu(actions_dict)
icon.setContextMenu(menu)
icon.activated.connect(on_click)
icon.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
{
"bgcolor": "black",
"scripts":[
{
"name": "Next Chapter",
"script":"/home/gaurav/scripts/next_episode.py",
"tooltip":"While in firefox, change the address to next chapter or episode"
},{
"name": "Animes/Series Log",
"script": "emacs /home/gaurav/personal.org",
"tooltip": "Org note on anime i am watching in emacs"
},{
"name":"c2 picture",
"script":"feh /home/gaurav/Pictures/cc.jpg",
"tooltip":"c2 background incase I need black blackground for transparent windows"
},{
"name": "Play Songs Vid",
"script": "mpv ~/media_volumn/songs_vid/ --geometry=300-0-0 --shuffle",
"tooltip": "Play the songs in mpv player, so I can put it in scratchpad"
},{
"name": "Update Packages",
"script": "terminator -T Updating -x sudo pacman -Syu",
"tooltip": "Update the packages with pacman"
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment