PythonScript 2.0
-
Yea, I believe I tried pywin32 at some point and found it strange.
-
Example for ctypes:
https://github.com/bruderstein/PythonScript/blob/master/scripts/Samples/ReplaceDefaultReplaceDialog.pyCurrently already available is https://github.com/bruderstein/PythonScript/releases/download/v1.3.0/PythonScript_TclTk_1.3.0.0.zip
, see https://github.com/bruderstein/PythonScript/blob/master/scripts/Samples/Sorter.py -
Yea…except that Tk sucks. :(
In fact, most Python GUIs except PyQt and wxPython (or whatever it is called now) are so bad they aren’t useful. My opinions only, people, don’t go nuts on me.
-
you are absolutely right and I would say, there is a MUST DO READ those samples
for everyone starting investing pythonscript plugin as it nearly covers any aspect of
manipulating either notepad++ or scintilla or how to extend npp - as far as I can see.But using ctypes is … uncomfortable, as you have to declare every piece,
with the risk of making it wrong. pywin32 did this already for you and Tk is a different beast.
I haven’t found out how one can create a Tk UI which can be docked.
Please don’t get me wrong - not having pywin32 isn’t a showstopper at all - it is just convenient.
And, at any time, one could install a local python and replace the python dll with the one of the local installation and can benefit from pip. -
You mean like this stuff is “uncomfortable” when doing ctypes?:
self.WNDENUMPROC = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM) self.FindWindow = ctypes.windll.user32.FindWindowW self.EnumChildWindows = ctypes.windll.user32.EnumChildWindows self.GetClassName = ctypes.windll.user32.GetClassNameW self.GetWindowText = ctypes.windll.user32.GetWindowTextW self.GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW self.SetWindowText = ctypes.windll.user32.SetWindowTextW self.GetACP = ctypes.windll.kernel32.GetACP self.create_unicode_buffer = ctypes.create_unicode_buffer
It really isn’t that bad, once you get some boilerplate (word of the day!) worked up. :)
-
yes, but the real pain starts when you have to do something like this ;-)
LVS_ICON = 0x0 LVS_REPORT = 0x1 LVS_SMALLICON = 0x2 LVS_LIST = 0x3 LVS_TYPEMASK = 0x3 LVS_SINGLESEL = 0x4 LVS_SHOWSELALWAYS = 0x8 LVS_SORTASCENDING = 0x10 LVS_SORTDESCENDING = 0x20 LVS_SHAREIMAGELISTS = 0x40 LVS_NOLABELWRAP = 0x80 LVS_AUTOARRANGE = 0x100 LVS_EDITLABELS = 0x200 LVS_OWNERDATA = 0x1000 LVS_NOSCROLL = 0x2000 LVS_TYPESTYLEMASK = 0xFC00 LVS_ALIGNTOP = 0x0 LVS_ALIGNLEFT = 0x800 LVS_ALIGNMASK = 0xC00 LVS_OWNERDRAWFIXED = 0x400 LVS_NOCOLUMNHEADER = 0x4000 LVS_NOSORTHEADER = 0x8000 LVS_EX_GRIDLINES = 0x1 LVS_EX_SUBITEMIMAGES = 0x2 LVS_EX_CHECKBOXES = 0x4 LVS_EX_TRACKSELECT = 0x8 LVS_EX_HEADERDRAGDROP = 0x10 LVS_EX_FULLROWSELECT = 0x20 # applies to report mode only LVS_EX_ONECLICKACTIVATE = 0x40 LVS_EX_TWOCLICKACTIVATE = 0x80 LVS_EX_FLATSB = 0x100 # cannot be cleared - Win32 & IE4 and later LVS_EX_REGIONAL = 0x200 LVS_EX_INFOTIP = 0x400 LVM_FIRST = 0x1000 # ListView Messages LVM_GETBKCOLOR = LVM_FIRST + 0 LVM_SETBKCOLOR = LVM_FIRST + 1 LVM_GETIMAGELIST = LVM_FIRST + 2 LVM_SETIMAGELIST = LVM_FIRST + 3 LVM_GETITEMCOUNT = LVM_FIRST + 4 LVM_DELETEITEM = LVM_FIRST + 8 LVM_DELETEALLITEMS = LVM_FIRST + 9 LVM_GETCALLBACKMASK = LVM_FIRST + 10 LVM_SETCALLBACKMASK = LVM_FIRST + 11 LVM_GETNEXTITEM = LVM_FIRST + 12 LVM_SETITEMPOSITION = LVM_FIRST + 15 LVM_GETITEMPOSITION = LVM_FIRST + 16 LVM_HITTEST = LVM_FIRST + 18 LVM_ENSUREVISIBLE = LVM_FIRST + 19 LVM_SCROLL = LVM_FIRST + 20 LVM_REDRAWITEMS = LVM_FIRST + 21 LVM_ARRANGE = LVM_FIRST + 22 LVM_GETEDITCONTROL = LVM_FIRST + 24 LVM_DELETECOLUMN = LVM_FIRST + 28 LVM_GETCOLUMNWIDTH = LVM_FIRST + 29 LVM_SETCOLUMNWIDTH = LVM_FIRST + 30 LVM_GETHEADER = LVM_FIRST + 31 LVM_CREATEDRAGIMAGE = LVM_FIRST + 33 LVM_GETVIEWRECT = LVM_FIRST + 34 LVM_GETTEXTCOLOR = LVM_FIRST + 35 LVM_SETTEXTCOLOR = LVM_FIRST + 36 LVM_GETTEXTBKCOLOR = LVM_FIRST + 37 LVM_SETTEXTBKCOLOR = LVM_FIRST + 38 LVM_GETTOPINDEX = LVM_FIRST + 39 LVM_GETCOUNTPERPAGE = LVM_FIRST + 40 LVM_GETORIGIN = LVM_FIRST + 41 LVM_UPDATE = LVM_FIRST + 42 LVM_SETITEMSTATE = LVM_FIRST + 43 LVM_GETITEMSTATE = LVM_FIRST + 44 LVM_SETITEMCOUNT = LVM_FIRST + 47 LVM_SORTITEMS = LVM_FIRST + 48 LVM_SETITEMPOSITION32 = LVM_FIRST + 49 LVM_GETSELECTEDCOUNT = LVM_FIRST + 50 LVM_GETITEMSPACING = LVM_FIRST + 51 LVM_SETICONSPACING = LVM_FIRST + 53 LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54 LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55 LVM_GETSUBITEMRECT = LVM_FIRST + 56 LVM_SUBITEMHITTEST = LVM_FIRST + 57 LVM_SETCOLUMNORDERARRAY = LVM_FIRST + 58 LVM_GETCOLUMNORDERARRAY = LVM_FIRST + 59 LVM_SETHOTITEM = LVM_FIRST + 60 LVM_GETHOTITEM = LVM_FIRST + 61 LVM_SETHOTCURSOR = LVM_FIRST + 62 LVM_GETHOTCURSOR = LVM_FIRST + 63 LVM_APPROXIMATEVIEWRECT = LVM_FIRST + 64 LVM_SETWORKAREA = LVM_FIRST + 65 LVM_GETSELECTIONMARK = LVM_FIRST + 66 LVM_SETSELECTIONMARK = LVM_FIRST + 67 LVM_GETWORKAREA = LVM_FIRST + 70 LVM_SETHOVERTIME = LVM_FIRST + 71 LVM_GETHOVERTIME = LVM_FIRST + 72 LVM_GETITEM = LVM_FIRST + 75 LVM_SETITEM = LVM_FIRST + 76 LVM_INSERTITEMW = LVM_FIRST + 77 LVM_INSERTITEM = LVM_INSERTITEMW LVM_FINDITEMW = LVM_FIRST + 83 LVM_FINDITEM = LVM_FINDITEMW LVM_GETSTRINGWIDTHW = LVM_FIRST + 87 LVM_GETSTRINGWIDTH = LVM_GETSTRINGWIDTHW LVM_EDITLABELW = LVM_FIRST + 118 LVM_EDITLABEL = LVM_EDITLABELW LVM_GETCOLUMNW = LVM_FIRST + 95 LVM_GETCOLUMN = LVM_GETCOLUMNW LVM_SETCOLUMNW = LVM_FIRST + 96 LVM_SETCOLUMN = LVM_SETCOLUMNW LVM_INSERTCOLUMNW = LVM_FIRST + 97 LVM_INSERTCOLUMN = LVM_INSERTCOLUMNW LVM_GETITEMTEXTW = LVM_FIRST + 115 LVM_GETITEMTEXT = LVM_GETITEMTEXTW LVM_SETITEMTEXTW = LVM_FIRST + 116 LVM_SETITEMTEXT = LVM_SETITEMTEXTW LVM_GETISEARCHSTRINGW = LVM_FIRST + 117 LVM_GETISEARCHSTRING = LVM_GETISEARCHSTRINGW LVM_GETBKIMAGEW = LVM_FIRST + 139 LVM_SETBKIMAGEW = LVM_FIRST + 138 # LVBKIMAGE = LVBKIMAGEW # LPLVBKIMAGE = LPLVBKIMAGEW LVM_SETBKIMAGE = LVM_SETBKIMAGEW LVM_GETBKIMAGE = LVM_GETBKIMAGEW LVCF_FMT = 0x1 LVCF_WIDTH = 0x2 LVCF_TEXT = 0x4 LVCF_SUBITEM = 0x8 LVCF_IMAGE = 0x10 LVCF_ORDER = 0x20 LVCFMT_LEFT = 0x0 LVCFMT_RIGHT = 0x1 LVCFMT_CENTER = 0x2 LVCFMT_JUSTIFYMASK = 0x3 LVCFMT_IMAGE = 0x800 LVCFMT_BITMAP_ON_RIGHT = 0x1000 LVCFMT_COL_HAS_IMAGES = 0x8000 LVIF_TEXT = 0x1 LVSCW_AUTOSIZE = -1 class LVCOLUMN(ctypes.Structure): _fields_ = [('mask', wintypes.UINT), ('fmt', wintypes.INT), ('cx', wintypes.INT), ('pszText', wintypes.LPWSTR), ('cchTextMax', wintypes.INT), ('iSubItem', wintypes.INT), ('iImage', wintypes.INT), ('iOrder', wintypes.INT), ('cxMin', wintypes.INT), ('cxDefault', wintypes.INT), ('cxIdeal', wintypes.INT), ] class LVITEM(ctypes.Structure): _fields_ = [('mask', wintypes.UINT), ('iItem', wintypes.INT), ('iSubItem', wintypes.INT), ('state', wintypes.UINT), ('stateMask', wintypes.UINT), ('pszText', wintypes.LPWSTR), ('cchTextMax', wintypes.INT), ('iImage', wintypes.INT), ('lParam', wintypes.LPARAM), ('iIndent', wintypes.INT), ('iGroupId', wintypes.INT), ('cColumns', wintypes.UINT), ('puColumns', PUINT), ('piColFmt', wintypes.INT), ('iGroup', wintypes.INT), ] class NMITEMACTIVATE(ctypes.Structure): _fields_ = [('hdr', LPNMHDR), ('iItem', wintypes.INT), ('iSubItem', wintypes.INT), ('uNewState', wintypes.UINT), ('uOldState', wintypes.UINT), ('uChanged', wintypes.UINT), ('ptAction', wintypes.POINT), ('lParam', wintypes.LPARAM), ('uKeyFlags', wintypes.UINT), ] LPNMITEMACTIVATE = ctypes.POINTER(NMITEMACTIVATE) ...
-
Even that isn’t that bad (all in a separate file that is imported), but I admit it will get a bit tedious when posting scripts here and just going to get the ones needed for the scripts. But overall I find ctypes an amazing thing. And the things that you can use it for in a PS under Notepad++…also amazing. :)
But some of the constructs get pretty tricky. I’ve used nulledge to find examples I need.
-
… and just going to get the ones needed for the scripts …
at the end that’s exactly where it is handy to have it already defined.
Of course, now that I have made it, I can use it but if I want to post a script which
would use it, it isn’t that easy anymore as I might have to undo some parts to make it work …But some of the constructs get pretty tricky. I’ve used nulledge to find examples I need.
To be honest, if I don’t understand how it should work I’m looking for VB6 examples :-)
Most of the time those can be used just by converting and using the right python syntax. -
So if you have some example scripts worth sharing guys you could create a PR at pythonscript and I will merge them.
-
The beauty of the code on nulledge is that it is already in Python. But oops, it appears that nulledge has gone 404. :( Maybe my future needs will have VB6 searches involved.