You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.4 KiB
196 lines
5.4 KiB
"""
|
|
|
|
IdleX Windows Configuration
|
|
|
|
Adds/removes "Edit with IdleX" to the right-click context menu
|
|
for .py files.
|
|
|
|
Author: Roger D. Serwy
|
|
Date: 2011-11-28
|
|
2012-04-13 modified to work with setup.py
|
|
|
|
License: See LICENSE.txt
|
|
|
|
"""
|
|
|
|
|
|
import os
|
|
import sys
|
|
import shlex
|
|
|
|
WINREG = True
|
|
|
|
if sys.version < '3':
|
|
import Tkinter as tk
|
|
import tkMessageBox as mb
|
|
try:
|
|
import _winreg as W
|
|
except:
|
|
WINREG = False
|
|
else:
|
|
import tkinter as tk
|
|
import tkinter.messagebox as mb
|
|
try:
|
|
import winreg as W
|
|
except:
|
|
WINREG = False
|
|
|
|
|
|
if 'linux' in sys.platform:
|
|
# For Testing on Non-Windows platforms
|
|
class dummy_winreg:
|
|
def dummy(*args, **kwargs):
|
|
pass
|
|
def CreateKey(self, *args, **kwargs):
|
|
raise Exception('This is not Windows')
|
|
DeleteKey = CreateKey
|
|
def QueryValue(self, *args, **kwargs):
|
|
return r'C:\\Python32\\python.exe'
|
|
def __getattr__(self, *args, **kwargs):
|
|
return self.dummy
|
|
__file__ = 'LINUX'
|
|
W = dummy_winreg()
|
|
WINREG = True
|
|
|
|
if WINREG == False:
|
|
mb.showerror(title='Edit with IdleX',
|
|
message='Unable to import winreg')
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
def get_python_executable():
|
|
""" Get path to python.exe """
|
|
reg = W.ConnectRegistry(None, W.HKEY_CLASSES_ROOT)
|
|
p = W.OpenKey(reg, r'Python.File\shell\Edit with IDLE\command')
|
|
v = W.QueryValue(p, None)
|
|
path_to_python = shlex.split(v)[0]
|
|
return path_to_python
|
|
|
|
def get_idlex_module():
|
|
try:
|
|
mod = __import__('idlexlib')
|
|
except:
|
|
return None
|
|
return mod
|
|
|
|
def get_idlex_path():
|
|
# This assumes EditWithIdleX.py is in same directory as idlex.py
|
|
|
|
mod = get_idlex_module()
|
|
if mod:
|
|
head, tail = os.path.split(os.path.abspath(mod.__file__))
|
|
path_to_idlex = os.path.join(head, 'launch.py')
|
|
else:
|
|
head, tail = os.path.split(os.path.abspath(__file__))
|
|
head, tail = os.path.split(head)
|
|
path_to_idlex = os.path.join(head, 'idlex.py')
|
|
if os.path.exists(path_to_idlex):
|
|
return path_to_idlex
|
|
else:
|
|
return 'NOT FOUND. Make sure idlex.py is in same directory as EditWithIdleX.py.'
|
|
|
|
def build_registry_value():
|
|
""" Build the value for "Edit with IdleX" """
|
|
path_to_python = get_python_executable()
|
|
path_to_idlex = get_idlex_path()
|
|
if not os.path.exists(path_to_idlex):
|
|
raise Exception('Path to IdleX is not valid.')
|
|
|
|
regval = '"%(python)s" "%(idlex)s" -e "%%1"' % {'python':path_to_python,
|
|
'idlex':path_to_idlex}
|
|
return regval
|
|
|
|
def create_registry_key():
|
|
""" Create the "Edit with IdleX" registry key. """
|
|
regval = build_registry_value()
|
|
_create_registry_key_helper(regval)
|
|
|
|
def _create_registry_key_helper(regval):
|
|
reg = W.ConnectRegistry(None, W.HKEY_CURRENT_USER)
|
|
p = W.OpenKey(reg, r'Software\Classes', 0, W.KEY_SET_VALUE)
|
|
p2 = W.CreateKey(p, 'Python.File\shell\Edit with IdleX\command')
|
|
W.SetValue(p2, '', W.REG_SZ, regval)
|
|
W.CloseKey(p2)
|
|
W.CloseKey(p)
|
|
W.CloseKey(reg)
|
|
|
|
def delete_registry_key():
|
|
""" Delete the "Edit with IdleX" registry key """
|
|
reg = W.ConnectRegistry(None, W.HKEY_CURRENT_USER)
|
|
p = W.OpenKey(reg, r'Software\Classes\Python.File\shell', 0, W.KEY_ALL_ACCESS)
|
|
p2 = W.DeleteKey(p, 'Edit with IdleX\command')
|
|
p3 = W.DeleteKey(p, 'Edit with IdleX')
|
|
W.CloseKey(p)
|
|
W.CloseKey(reg)
|
|
|
|
def errorbox(err):
|
|
mb.showerror(title='Error occurred',
|
|
message=err)
|
|
|
|
def successbox(op=''):
|
|
mb.showinfo(title='Success',
|
|
message='Operation Successful. %s' % op)
|
|
|
|
def add_menu_item():
|
|
try:
|
|
create_registry_key()
|
|
successbox("'Edit with IdleX' added.")
|
|
except Exception as err:
|
|
errorbox(err)
|
|
|
|
|
|
def delete_menu_item():
|
|
try:
|
|
delete_registry_key()
|
|
successbox("'Edit with IdleX' removed.")
|
|
except Exception as err:
|
|
errorbox(err)
|
|
|
|
def quitprog():
|
|
root.destroy()
|
|
|
|
def build_gui():
|
|
f1 = tk.Frame(root)
|
|
f1.config(borderwidth=2, relief=tk.GROOVE)
|
|
f1.pack(side=tk.TOP, fill=tk.BOTH, expand=1, padx=5, pady=5)
|
|
|
|
msg = ["This will configure the right-click context menu",
|
|
"item 'Edit with IdleX'. This will sit alongside the",
|
|
"'Edit with IDLE' menu item.",
|
|
"",
|
|
"Python found at: %r" % get_python_executable(),
|
|
"IdleX found at: %r" % get_idlex_path(),
|
|
"",
|
|
"If you change the location of IdleX, re-run this script.",
|
|
"Otherwise, no action will occur if you click 'Edit with IdleX'.",
|
|
"",
|
|
"This program creates a registry key here:",
|
|
r"HKEY_CURRENT_USER\Software\Classes\Python.File\shell\Edit with IdleX\command",
|
|
]
|
|
L = tk.Label(f1, text='\n'.join(msg),
|
|
wraplength=300, justify=tk.LEFT)
|
|
|
|
|
|
b1 = tk.Button(f1, text="Add 'Edit with IdleX' to context menu",
|
|
command=add_menu_item)
|
|
|
|
b2 = tk.Button(f1, text="Remove 'Edit with IdleX' from context menu",
|
|
command=delete_menu_item)
|
|
|
|
b3 = tk.Button(f1, text='Exit this program',
|
|
command=quitprog)
|
|
|
|
TOP = tk.TOP
|
|
L.pack(side=TOP, fill=tk.X, expand=True)
|
|
b1.pack(side=TOP, fill=tk.X, expand=True)
|
|
b2.pack(side=TOP, fill=tk.X, expand=True)
|
|
b3.pack(side=TOP, fill=tk.X, expand=True)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
root = tk.Tk()
|
|
root.title('Edit with IdleX')
|
|
build_gui()
|
|
root.mainloop()
|