• Login
Community
  • Login

PythonScript 2.0

Scheduled Pinned Locked Moved Notepad++ & Plugin Development
19 Posts 4 Posters 4.2k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E
    Ekopalypse @Alan Kilborn
    last edited by Apr 17, 2019, 6:27 PM

    @Alan-Kilborn

    thank you, didn’t know about this site.
    pywin32 advantage is not only the easy to build uis but although the already defined win api functions.
    No need to check and see which function/structure needs to be create how but
    have to admit, that the usage of a few functions is a little bit different to what msdn states.

    I think the custom dialogs mentioned would be a little different,

    For example

    A 1 Reply Last reply Apr 17, 2019, 7:11 PM Reply Quote 2
    • A
      Alan Kilborn @Ekopalypse
      last edited by Apr 17, 2019, 7:11 PM

      @Ekopalypse

      Yea, I believe I tried pywin32 at some point and found it strange.

      1 Reply Last reply Reply Quote 0
      • C
        chcg
        last edited by Apr 17, 2019, 7:18 PM

        Example for ctypes:
        https://github.com/bruderstein/PythonScript/blob/master/scripts/Samples/ReplaceDefaultReplaceDialog.py

        Currently 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

        A E 2 Replies Last reply Apr 17, 2019, 7:35 PM Reply Quote 3
        • A
          Alan Kilborn @chcg
          last edited by Apr 17, 2019, 7:35 PM

          @chcg

          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.

          1 Reply Last reply Reply Quote 1
          • E
            Ekopalypse @chcg
            last edited by Ekopalypse Apr 17, 2019, 7:39 PM Apr 17, 2019, 7:38 PM

            @chcg

            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.

            A 1 Reply Last reply Apr 17, 2019, 7:45 PM Reply Quote 0
            • A
              Alan Kilborn @Ekopalypse
              last edited by Apr 17, 2019, 7:45 PM

              @Ekopalypse

              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. :)

              E 1 Reply Last reply Apr 17, 2019, 7:51 PM Reply Quote 3
              • E
                Ekopalypse @Alan Kilborn
                last edited by Ekopalypse Apr 17, 2019, 7:51 PM Apr 17, 2019, 7:51 PM

                @Alan-Kilborn

                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)
                ...
                
                A 1 Reply Last reply Apr 17, 2019, 7:54 PM Reply Quote 2
                • A
                  Alan Kilborn @Ekopalypse
                  last edited by Alan Kilborn Apr 17, 2019, 7:55 PM Apr 17, 2019, 7:54 PM

                  @Ekopalypse

                  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.

                  E 1 Reply Last reply Apr 17, 2019, 8:02 PM Reply Quote 2
                  • E
                    Ekopalypse @Alan Kilborn
                    last edited by Apr 17, 2019, 8:02 PM

                    @Alan-Kilborn

                    … 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.

                    A 1 Reply Last reply Apr 17, 2019, 8:05 PM Reply Quote 1
                    • C
                      chcg
                      last edited by Apr 17, 2019, 8:05 PM

                      So if you have some example scripts worth sharing guys you could create a PR at pythonscript and I will merge them.

                      1 Reply Last reply Reply Quote 3
                      • A
                        Alan Kilborn @Ekopalypse
                        last edited by Apr 17, 2019, 8:05 PM

                        @Ekopalypse

                        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.

                        1 Reply Last reply Reply Quote 2
                        18 out of 19
                        • First post
                          18/19
                          Last post
                        The Community of users of the Notepad++ text editor.
                        Powered by NodeBB | Contributors