Package: context-menu
🗂️context_menu💻 A Python library to create and deploy cross-platform native context menus. 💻Documentation available at:https://context-menu.readthedocs.io/en/latest/Table of Contents⚙ Features ⚙🙋 What is the context menu? 🙋🖥️ What Operating Systems are supported? 🖥️🐍 What Python versions are supported? 🐍💽 Installation 💽🕹️ Quickstart 🕹️🤖 Advanced Usage 🤖TheContextMenuClassTheContextCommandClassTheFastCommandClassTheremoveMenumethodTheparamsCommand Parametercommand_varsCommand ParameterOpening on FilesActivation Types🏁 Goals 🏁🙌 Contribution 🙌📓 Important notes 📓💻 Freshen - A context_menu project! 💻💙 Support 💙⚙ Features ⚙This library lets you edit the entries on the right click menu for Windows and Linux using pure Python. It also allows you to make cascading context menus!context_menu was created as due to the lack of an intuitive and easy to use cross-platform context menu library. The
library allows you to create your own context menu entries and control their behavior seamlessly in native Python. The
library has the following features:Written in pure python with no other dependenciesExtremely intuitive design inspired by Keras TensorflowSwift installation from Python's Package Manager (pip)Painless context menu creationCascading context menu supportThe ability to natively integrate python functions from a context entry callDetailed documentation🙋 What is the context menu? 🙋The context menu is the window that is displayed when you right click:The context menu is different depending on what was right clicked. For example, right clicking a folder will give you
different options than right clicking a file.🖥️ What Operating Systems are supported? 🖥️Currently, the only operating systems supported are:Windows 7Windows 10Windows 11Linux (Using Nautilus)🐍 What Python versions are supported? 🐍All python versions 3.1 and aboveare supported.💽 Installation 💽If you haven't installed Python, download and run an installer from the official
website:https://www.python.org/downloads/Once you have Python, the rest is super simple. Simply just run the following command in a terminal to install the
package:python -m pip install context_menuor if you're on Linux:python3 -m pip install context_menuNote: If you're on Windows and it says the command isn't recognized, make sure to
addPython to your pathand run the command prompt as
administrator🕹️ Quickstart 🕹️Let's say you want to make a basic context menu entry when you right click a file.If you haven't already Install the library via pip:python -m pip install context_menuCreate and compile the menu:It's super easy!
You can create entries in as little as 3 lines:fromcontext_menuimportmenusfc=menus.FastCommand('Example Fast Command 1',type='FILES',command='echo Hello')fc.compile()All you have to do is import the library and define the type of context entry you want. The options are:A context menu (an entry that has more entries)A fast command (a single context menu entry to kick a running script)A context command which can be added to menus for more complex commandsYou can also create much more complicated nested menus:deffoo2(filenames,params):print('foo2')print(filenames)input()deffoo3(filenames,params):print('foo3')print(filenames)input()if__name__=='__main__':fromcontext_menuimportmenuscm=menus.ContextMenu('Foo menu',type='FILES')cm2=menus.ContextMenu('Foo Menu 2')cm3=menus.ContextMenu('Foo Menu 3')cm3.add_items([menus.ContextCommand('Foo One',command='echo hello > example.txt'),])cm2.add_items([menus.ContextCommand('Foo Two',python=foo2),cm3,])cm.add_items([cm2,menus.ContextCommand('Foo Three',python=foo3)])cm.compile()All context menus arepermanentunless you remove them.🤖 Advanced Usage 🤖TheContextMenuClassTheContextMenuobject
holds other context objects. It expects a name, andthe activation typeif it is the root menu(the first menu). Only
compile the root menu.ContextMenu(name:str,type:str=None)Menus can be added to menus, creating cascading context menus. You can use
the{MENU}.add_items{ITEMS}function to add context elements together, for example:cm=menus.ContextMenu('Foo menu',type='DIRECTORY_BACKGROUND')cm.add_items([menus.ContextMenu(...),menus.ContextCommand(...),menus.ContextCommand(...)])cm.compile()You have to
call{MENU}.compile()in order to create the menu.TheContextCommandClassTheContextCommandclass creates the selectable part of the menu (you can click it). It requires a name, and either a Python function or a
command(but NOT both)and has various other optionsContextCommand(name:str,command:str=None,python:'function'=None,params:str=None,command_vars:list=None)Python functions can be passed to this method, regardless of their location.However, the function must accept only
two parametersfilenames, which is a list of paths*, andparams, the parameters passed to the function. and if
the function is in the same file as the menu, you have to surround it withif __name__ == '__main__':# An example of a valid functiondefvalid_function(filenames,params):print('Im valid!')print(filenames)print(params)# Examples of invalid functionsdefinvalid_function_1(filenames,param1,param2):print('Im invalid!')print(filenames)definvalid_function_2(params):print('Im invalid!')print(params)Any command passed (as a string) will be directly ran from the shell.TheFastCommandClassTheFastCommandclass
is an extension of the ContextMenu class and allows you to quickly create a single entry menu. It expects a name, type,
and command/function.FastCommand(name:str,type:str,command:str=None,python:'function'=None,params:str='',command_vars:list=None)deffoo1(filenames,params):print(filenames)input()if__name__=='__main__':fromcontext_menuimportmenusfc=menus.FastCommand('Example Fast Command 1',type='FILES',python=foo1)fc.compile()TheremoveMenumethodYou can remove a context menu entry easily as well. Simply call the'menus.removeMenu()'method.removeMenu(name:str,type:str)For example, if I wanted to remove the menu 'Foo Menu' that activated on type 'FILES':fromcontext_menuimportmenusmenus.removeMenu('Foo Menu','FILES')and boom! It's gone 😎TheparamsCommand ParameterIn both theContextCommandclass andFastCommandclass you can pass in a parameter, defined by theparameter=Nonevariable.This value MUST be a string!This means instead of passing a list or numbers, pass it as a string
separated by spaces or whatever to delimitate it.fc=menus.FastCommand('Example Fast Command 1',type='FILES',python=foo1,params='a b c d e')fc.compile()For more information,see this.Works on theFastCommandandContextCommandclass.command_varsCommand ParameterIf you decide to pass a shell command, you can access a list of special variables. For example, if I wanted to run a
custom command with the file selected, I could use the following:fc=menus.FastCommand('Weird Copy',type='FILES',command='touch ?x',command_vars=['FILENAME'])fc.compile()which would create a new file with the name of whatever I selected with an 'x' on the end. The?variable is
interpreted from left to right and replaced with the selected
values(see this).All of the preset values are as follows:NameFunctionFILENAMEThe path to the file selectedDIR/DIRECTORYThe directory the script was ran in.PYTHONLOCThe location of the python interpreter.Works on theFastCommandandContextCommandclass.Opening on FilesLet's say you only want your context menu entry to open on a certain type of file, such as a.txtfile. You can do
this by adding atypevariable to theContextCommandorFastCommandclass.fc=menus.FastCommand('Weird Copy',type='.txt',command='touch ?x',command_vars=['FILENAME'])# opens only on .txt filesfc.compile()Now you'll only see the "Weird Copy" menu entry when you right click a .txt file.Activation TypesThere are different locations where a context menu can fire. For example, if you right click on a folder you'll get
different options than if you right click on a file. Thetypevariable controls this behavior in the library, and you
can reference this table to determine thetype:NameLocationActionFILESHKEY_CURRENT_USER\Software\Classes\*\shell\Opens on a fileDIRECTORYHKEY_CURRENT_USER\Software\Classes\Directory\shellOpens on a directoryDIRECTORY_BACKGROUNDHKEY_CURRENT_USER\Software\Classes\Directory\Background\shellOpens on the background of the DirectoryDRIVEHKEY_CURRENT_USER\Software\Classes\Drive\shellOpens on the drives(think USBs)I strongly recommend checking out theexamples folderfor more complicated examples and usage.You can check out the official documentationhere.🏁 Goals 🏁This project tackles some pretty big issues, and there's definetly some goals that I'd like to accomplish. The current roadmap is as follows:Support for other Linux distributionsBetter approach to the Linux GNOME integrationMac supportBypass 16 entry limit on windowsIf by all means you want to help reach these milestones, see contribution below.🙌 Contribution 🙌Ireallywant to add support for MacOS, but I don't have the experience required to implement it.Contributing is super simple! Create an additional branch and make a pull request with your changes. If the changes past the automated tests, it will be manually reviewed and merged accordingly.Any and all help is appreciated, and if you have any questions, feel free to contact me directly.📓 Important notes 📓Almost all the errors I've encountered in testing were when the code and the functions were in the same file. You
should make a separate file for the code or surround it withif __name__ == '__main__':.On windows, there's currently a 16 entry limit on the context menu.💻 Freshen - A context_menu project! 💻Feel free to check out afile sorterprogram I made that directly implements this library.💙 Support 💙All my work is and always will be free and open source. If you'd like to support me,please consider leaving a ⭐ star ⭐, as it motivates me and the community to keep working on this project.Thanks for reading!