mwxlib 0.99.9__py3-none-any.whl → 1.0rc4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mwxlib might be problematic. Click here for more details.
- mwx/framework.py +27 -22
- mwx/graphman.py +30 -40
- mwx/matplot2g.py +6 -3
- mwx/nutshell.py +21 -21
- mwx/plugins/ffmpeg_view.py +0 -1
- mwx/plugins/fft_view.py +1 -1
- mwx/plugins/frame_listview.py +1 -1
- mwx/plugins/line_profile.py +1 -1
- mwx/wxpdb.py +0 -9
- mwx/wxwit.py +0 -2
- {mwxlib-0.99.9.dist-info → mwxlib-1.0rc4.dist-info}/METADATA +8 -13
- mwxlib-1.0rc4.dist-info/RECORD +28 -0
- {mwxlib-0.99.9.dist-info → mwxlib-1.0rc4.dist-info}/WHEEL +1 -1
- mwxlib-0.99.9.dist-info/RECORD +0 -28
- {mwxlib-0.99.9.dist-info → mwxlib-1.0rc4.dist-info}/LICENSE +0 -0
- {mwxlib-0.99.9.dist-info → mwxlib-1.0rc4.dist-info}/top_level.txt +0 -0
mwx/framework.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#! python3
|
|
2
2
|
"""mwxlib framework.
|
|
3
3
|
"""
|
|
4
|
-
__version__ = "
|
|
4
|
+
__version__ = "1.0rc4"
|
|
5
5
|
__author__ = "Kazuya O'moto <komoto@jeol.co.jp>"
|
|
6
6
|
|
|
7
7
|
from contextlib import contextmanager
|
|
@@ -165,22 +165,6 @@ _speckeys = {
|
|
|
165
165
|
|
|
166
166
|
_speckeys_wxkmap = dict((v, k) for k, v in _speckeys.items())
|
|
167
167
|
|
|
168
|
-
def getKeyState(key):
|
|
169
|
-
"""Returns state of speckey (cf. wx.GetKeyState)."""
|
|
170
|
-
try:
|
|
171
|
-
return wx.GetKeyState(_speckeys_wxkmap[key])
|
|
172
|
-
except KeyError:
|
|
173
|
-
pass
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
def setKeyState(key, state):
|
|
177
|
-
"""Makes you feel like having pressed/released speckey."""
|
|
178
|
-
vk = wx.UIActionSimulator()
|
|
179
|
-
if state:
|
|
180
|
-
vk.KeyDown(_speckeys_wxkmap[key])
|
|
181
|
-
else:
|
|
182
|
-
vk.KeyUp(_speckeys_wxkmap[key])
|
|
183
|
-
|
|
184
168
|
|
|
185
169
|
def hotkey(evt):
|
|
186
170
|
"""Interpret evt.KeyCode as hotkey:str and overwrite evt.key.
|
|
@@ -226,10 +210,29 @@ class KeyCtrlInterfaceMixin:
|
|
|
226
210
|
spec-map : 'C-c'
|
|
227
211
|
esc-map : 'escape'
|
|
228
212
|
"""
|
|
213
|
+
message = print # override this in subclass
|
|
214
|
+
|
|
229
215
|
@postcall
|
|
230
216
|
def post_message(self, *args, **kwargs):
|
|
231
217
|
return self.message(*args, **kwargs)
|
|
232
218
|
|
|
219
|
+
@staticmethod
|
|
220
|
+
def getKeyState(key):
|
|
221
|
+
"""Returns state of speckey (cf. wx.GetKeyState)."""
|
|
222
|
+
try:
|
|
223
|
+
return wx.GetKeyState(_speckeys_wxkmap[key])
|
|
224
|
+
except KeyError:
|
|
225
|
+
pass
|
|
226
|
+
|
|
227
|
+
@staticmethod
|
|
228
|
+
def setKeyState(key, state):
|
|
229
|
+
"""Makes you feel like having pressed/released speckey."""
|
|
230
|
+
vk = wx.UIActionSimulator()
|
|
231
|
+
if state:
|
|
232
|
+
vk.KeyDown(_speckeys_wxkmap[key])
|
|
233
|
+
else:
|
|
234
|
+
vk.KeyUp(_speckeys_wxkmap[key])
|
|
235
|
+
|
|
233
236
|
def make_keymap(self, keymap):
|
|
234
237
|
"""Make a basis of extension map in the handler.
|
|
235
238
|
"""
|
|
@@ -259,9 +262,8 @@ class KeyCtrlInterfaceMixin:
|
|
|
259
262
|
})
|
|
260
263
|
|
|
261
264
|
def pre_command_hook(self, evt):
|
|
262
|
-
"""
|
|
263
|
-
Check text selection for [C-c/C-x].
|
|
264
|
-
"""
|
|
265
|
+
"""Called when entering extension mode (internal use only)."""
|
|
266
|
+
## Check text selection for [C-c/C-x].
|
|
265
267
|
wnd = wx.Window.FindFocus()
|
|
266
268
|
if isinstance(wnd, wx.TextEntry) and wnd.StringSelection\
|
|
267
269
|
or isinstance(wnd, stc.StyledTextCtrl) and wnd.SelectedText:
|
|
@@ -272,6 +274,7 @@ class KeyCtrlInterfaceMixin:
|
|
|
272
274
|
evt.Skip()
|
|
273
275
|
|
|
274
276
|
def post_command_hook(self, evt):
|
|
277
|
+
"""Called when exiting extension mode (internal use only)."""
|
|
275
278
|
keymap = self.handler.previous_state
|
|
276
279
|
if keymap:
|
|
277
280
|
self.message("{} {}".format(keymap, evt.key))
|
|
@@ -334,8 +337,6 @@ class CtrlInterface(KeyCtrlInterfaceMixin):
|
|
|
334
337
|
"""
|
|
335
338
|
handler = property(lambda self: self.__handler)
|
|
336
339
|
|
|
337
|
-
message = print # override this in subclass
|
|
338
|
-
|
|
339
340
|
def __init__(self):
|
|
340
341
|
self.__key = ''
|
|
341
342
|
self.__button = ''
|
|
@@ -1736,6 +1737,8 @@ class ShellFrame(MiniFrame):
|
|
|
1736
1737
|
self.popup_window(self.linfo)
|
|
1737
1738
|
self.add_log("<-- Beginning of debugger\r\n")
|
|
1738
1739
|
self.indicator.Value = 2
|
|
1740
|
+
if wx.IsBusy():
|
|
1741
|
+
wx.EndBusyCursor()
|
|
1739
1742
|
|
|
1740
1743
|
def on_debug_next(self, frame):
|
|
1741
1744
|
"""Called from cmdloop."""
|
|
@@ -1772,6 +1775,8 @@ class ShellFrame(MiniFrame):
|
|
|
1772
1775
|
del shell.locals
|
|
1773
1776
|
del shell.globals
|
|
1774
1777
|
self.indicator.Value = 1
|
|
1778
|
+
if wx.IsBusy():
|
|
1779
|
+
wx.EndBusyCursor()
|
|
1775
1780
|
|
|
1776
1781
|
def set_hookable(self, editor, traceable=True):
|
|
1777
1782
|
"""Bind pointer to set/unset trace."""
|
mwx/graphman.py
CHANGED
|
@@ -166,8 +166,8 @@ class Thread:
|
|
|
166
166
|
msg += '\n\n'
|
|
167
167
|
try:
|
|
168
168
|
self.event.clear() # suspend
|
|
169
|
-
if wx.MessageBox(
|
|
170
|
-
"Do you want to terminate the process?",
|
|
169
|
+
if wx.MessageBox( # Confirm terminatation.
|
|
170
|
+
msg + "Do you want to terminate the process?",
|
|
171
171
|
style=wx.OK|wx.CANCEL|wx.ICON_WARNING) == wx.OK:
|
|
172
172
|
self.Stop()
|
|
173
173
|
return False
|
|
@@ -574,8 +574,9 @@ class MyFileDropLoader(wx.FileDropTarget):
|
|
|
574
574
|
for fn in filenames:
|
|
575
575
|
name, ext = os.path.splitext(fn)
|
|
576
576
|
if ext == '.py' or os.path.isdir(fn):
|
|
577
|
-
self.loader.load_plug(fn, show=1,
|
|
578
|
-
|
|
577
|
+
self.loader.load_plug(fn, show=1,
|
|
578
|
+
floating_pos=pos,
|
|
579
|
+
force=wx.GetKeyState(wx.WXK_ALT))
|
|
579
580
|
elif ext == '.jssn':
|
|
580
581
|
self.loader.load_session(fn)
|
|
581
582
|
elif ext == '.index':
|
|
@@ -946,6 +947,7 @@ class Frame(mwx.Frame):
|
|
|
946
947
|
shown = plug.IsShown()
|
|
947
948
|
except AttributeError:
|
|
948
949
|
shown = pane.IsShown()
|
|
950
|
+
|
|
949
951
|
if show and not shown:
|
|
950
952
|
if isinstance(win, aui.AuiNotebook):
|
|
951
953
|
j = win.GetPageIndex(plug)
|
|
@@ -962,6 +964,11 @@ class Frame(mwx.Frame):
|
|
|
962
964
|
else:
|
|
963
965
|
win.handler('page_closed', win)
|
|
964
966
|
|
|
967
|
+
if pane.dock_direction:
|
|
968
|
+
pane.Dock()
|
|
969
|
+
else:
|
|
970
|
+
pane.Float()
|
|
971
|
+
|
|
965
972
|
## Modify the floating position of the pane when displayed.
|
|
966
973
|
## Note: This is a known bug in wxWidgets 3.17 -- 3.20,
|
|
967
974
|
## and will be fixed in wxPython 4.2.1.
|
|
@@ -972,39 +979,27 @@ class Frame(mwx.Frame):
|
|
|
972
979
|
self._mgr.Update()
|
|
973
980
|
return (show != shown)
|
|
974
981
|
|
|
975
|
-
def update_pane(self, name,
|
|
976
|
-
"""Update the layout of the pane.
|
|
982
|
+
def update_pane(self, name, **props):
|
|
983
|
+
"""Update the layout of the pane (internal use only).
|
|
977
984
|
|
|
978
985
|
Note:
|
|
979
986
|
This is called automatically from load_plug,
|
|
980
987
|
and should not be called directly from user.
|
|
981
988
|
"""
|
|
982
989
|
pane = self.get_pane(name)
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
pane.dock_row = kwargs.get('row', 0)
|
|
987
|
-
pane.dock_proportion = kwargs.get('prop') or pane.dock_proportion
|
|
988
|
-
pane.floating_pos = kwargs.get('floating_pos') or pane.floating_pos
|
|
989
|
-
pane.floating_size = kwargs.get('floating_size') or pane.floating_size
|
|
990
|
+
for k, v in props.items():
|
|
991
|
+
if v is not None:
|
|
992
|
+
setattr(pane, k, v)
|
|
990
993
|
|
|
991
994
|
plug = self.get_plug(name)
|
|
992
995
|
if plug:
|
|
993
996
|
dock = plug.dockable
|
|
994
|
-
if not isinstance(dock, bool):
|
|
995
|
-
|
|
997
|
+
if not isinstance(dock, bool):
|
|
998
|
+
pane.dock_direction = dock
|
|
996
999
|
if not plug.caption:
|
|
997
1000
|
pane.CaptionVisible(False) # no caption bar
|
|
998
1001
|
pane.Gripper(dock not in (0, 5)) # show a grip when docked
|
|
999
1002
|
pane.Dockable(dock)
|
|
1000
|
-
|
|
1001
|
-
dock = kwargs.get('dock')
|
|
1002
|
-
pane.dock_direction = dock or 0
|
|
1003
|
-
if dock:
|
|
1004
|
-
pane.Dock()
|
|
1005
|
-
else:
|
|
1006
|
-
pane.Float()
|
|
1007
|
-
return self.show_pane(name, show)
|
|
1008
1003
|
|
|
1009
1004
|
def OnPaneClose(self, evt): #<wx.aui.AuiManagerEvent>
|
|
1010
1005
|
pane = evt.GetPane()
|
|
@@ -1113,9 +1108,9 @@ class Frame(mwx.Frame):
|
|
|
1113
1108
|
self.register(cls, module)
|
|
1114
1109
|
return module
|
|
1115
1110
|
|
|
1116
|
-
def load_plug(self, root, force=False, session=None,
|
|
1117
|
-
|
|
1118
|
-
|
|
1111
|
+
def load_plug(self, root, force=False, session=None, show=False,
|
|
1112
|
+
dock=0, floating_pos=None, floating_size=None,
|
|
1113
|
+
**kwargs):
|
|
1119
1114
|
"""Load plugin.
|
|
1120
1115
|
|
|
1121
1116
|
Args:
|
|
@@ -1126,10 +1121,6 @@ class Frame(mwx.Frame):
|
|
|
1126
1121
|
session : Conditions for initializing the plug and starting session
|
|
1127
1122
|
show : the pane is shown after loaded
|
|
1128
1123
|
dock : dock_direction (1:top, 2:right, 3:bottom, 4:left, 5:center)
|
|
1129
|
-
layer : dock_layer
|
|
1130
|
-
pos : dock_pos
|
|
1131
|
-
row : dock_row position
|
|
1132
|
-
prop : dock_proportion < 1e6 ?
|
|
1133
1124
|
floating_pos: posision of floating window
|
|
1134
1125
|
floating_size: size of floating window
|
|
1135
1126
|
|
|
@@ -1141,14 +1132,16 @@ class Frame(mwx.Frame):
|
|
|
1141
1132
|
Note:
|
|
1142
1133
|
The root module must have a class Plugin <Layer>
|
|
1143
1134
|
"""
|
|
1144
|
-
props = dict(
|
|
1145
|
-
floating_pos=floating_pos,
|
|
1135
|
+
props = dict(dock_direction=dock,
|
|
1136
|
+
floating_pos=floating_pos,
|
|
1137
|
+
floating_size=floating_size)
|
|
1146
1138
|
|
|
1147
1139
|
_dirname, name = split_paths(root)
|
|
1148
1140
|
|
|
1149
1141
|
plug = self.get_plug(name)
|
|
1150
1142
|
if plug and not force:
|
|
1151
1143
|
self.update_pane(name, **props)
|
|
1144
|
+
self.show_pane(name, show)
|
|
1152
1145
|
try:
|
|
1153
1146
|
if session:
|
|
1154
1147
|
plug.load_session(session)
|
|
@@ -1178,15 +1171,11 @@ class Frame(mwx.Frame):
|
|
|
1178
1171
|
if name not in self.plugins:
|
|
1179
1172
|
raise NameError("Plugin name must not be the same as any other panes")
|
|
1180
1173
|
|
|
1174
|
+
show = show or pane.IsShown()
|
|
1181
1175
|
props.update(
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
pos = pane.dock_pos,
|
|
1186
|
-
row = pane.dock_row,
|
|
1187
|
-
prop = pane.dock_proportion,
|
|
1188
|
-
floating_pos = floating_pos or pane.floating_pos[:], # copy (pane unloaded)
|
|
1189
|
-
floating_size = floating_size or pane.floating_size[:], # copy
|
|
1176
|
+
dock_direction = pane.IsDocked() and pane.dock_direction,
|
|
1177
|
+
floating_pos = floating_pos or pane.floating_pos[:], # copy unloading pane
|
|
1178
|
+
floating_size = floating_size or pane.floating_size[:], # copy unloading pane
|
|
1190
1179
|
)
|
|
1191
1180
|
except (AttributeError, NameError) as e:
|
|
1192
1181
|
traceback.print_exc()
|
|
@@ -1248,6 +1237,7 @@ class Frame(mwx.Frame):
|
|
|
1248
1237
|
plug.Name = name
|
|
1249
1238
|
|
|
1250
1239
|
self.update_pane(name, **props)
|
|
1240
|
+
self.show_pane(name, show)
|
|
1251
1241
|
|
|
1252
1242
|
## Create a menu
|
|
1253
1243
|
plug.__Menu_item = None
|
mwx/matplot2g.py
CHANGED
|
@@ -31,7 +31,7 @@ def _imcv(src):
|
|
|
31
31
|
return src
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
def _to_buffer(img):
|
|
34
|
+
def _to_buffer(img, grayscale=True):
|
|
35
35
|
if isinstance(img, Image.Image):
|
|
36
36
|
## return np.asarray(img) # ref
|
|
37
37
|
return np.array(img) # copy
|
|
@@ -43,6 +43,9 @@ def _to_buffer(img):
|
|
|
43
43
|
w, h = img.GetSize()
|
|
44
44
|
buf = np.frombuffer(img.GetDataBuffer(), dtype='uint8')
|
|
45
45
|
return buf.reshape(h, w, 3)
|
|
46
|
+
|
|
47
|
+
if img.ndim > 2 and grayscale:
|
|
48
|
+
return cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
|
|
46
49
|
return img
|
|
47
50
|
|
|
48
51
|
|
|
@@ -965,12 +968,12 @@ class GraphPlot(MatplotPanel):
|
|
|
965
968
|
data = GraphPlot.clipboard_data
|
|
966
969
|
if name:
|
|
967
970
|
self.message("Read buffer from clipboard.")
|
|
968
|
-
self.load(data)
|
|
969
971
|
GraphPlot.clipboard_name = None
|
|
970
972
|
GraphPlot.clipboard_data = None
|
|
971
973
|
else:
|
|
972
974
|
self.message("Read image from clipboard.")
|
|
973
|
-
|
|
975
|
+
data = Clipboard.imread()
|
|
976
|
+
self.load(data)
|
|
974
977
|
except Exception as e:
|
|
975
978
|
traceback.print_exc()
|
|
976
979
|
self.message("- No data in clipboard.", e)
|
mwx/nutshell.py
CHANGED
|
@@ -49,7 +49,6 @@ py_where_re = r'> +([^*?"<>|\r\n]+?):([0-9]+)'
|
|
|
49
49
|
py_break_re = r'at ([^*?"<>|\r\n]+?):([0-9]+)'
|
|
50
50
|
|
|
51
51
|
## Custom constants in wx.stc
|
|
52
|
-
stc.STC_P_WORD3 = 20 # deprecated
|
|
53
52
|
stc.STC_STYLE_CARETLINE = 40
|
|
54
53
|
stc.STC_STYLE_ANNOTATION = 41
|
|
55
54
|
|
|
@@ -635,9 +634,9 @@ class EditorInterface(AutoCompInterfaceMixin, CtrlInterface):
|
|
|
635
634
|
|
|
636
635
|
self.IndicatorSetStyle(11, stc.STC_INDIC_STRAIGHTBOX)
|
|
637
636
|
self.IndicatorSetUnder(11, True)
|
|
638
|
-
self.IndicatorSetAlpha(11,
|
|
639
|
-
self.IndicatorSetOutlineAlpha(11,
|
|
640
|
-
self.IndicatorSetForeground(11, "
|
|
637
|
+
self.IndicatorSetAlpha(11, 60)
|
|
638
|
+
self.IndicatorSetOutlineAlpha(11, 60)
|
|
639
|
+
self.IndicatorSetForeground(11, "light gray")
|
|
641
640
|
|
|
642
641
|
self.IndicatorSetStyle(2, stc.STC_INDIC_DOTS)
|
|
643
642
|
self.IndicatorSetForeground(2, "light gray")
|
|
@@ -804,11 +803,11 @@ class EditorInterface(AutoCompInterfaceMixin, CtrlInterface):
|
|
|
804
803
|
self.mark = self.cpos
|
|
805
804
|
|
|
806
805
|
def set_pointer(self):
|
|
807
|
-
if self.pointer == self.cline:
|
|
806
|
+
if self.pointer == self.cline: # toggle
|
|
808
807
|
self.pointer = -1
|
|
809
808
|
else:
|
|
810
|
-
self.pointer = self.cline
|
|
811
|
-
|
|
809
|
+
self.pointer = self.cline # reset
|
|
810
|
+
self.red_pointer = -1
|
|
812
811
|
|
|
813
812
|
def exchange_point_and_mark(self):
|
|
814
813
|
p = self.cpos
|
|
@@ -1419,15 +1418,15 @@ class EditorInterface(AutoCompInterfaceMixin, CtrlInterface):
|
|
|
1419
1418
|
def _format(ln):
|
|
1420
1419
|
return "{:4d} {}".format(ln+1, self.GetLine(ln).strip())
|
|
1421
1420
|
|
|
1422
|
-
pts = self.StyleGetSize(stc.STC_STYLE_DEFAULT)
|
|
1423
|
-
self.StyleSetSize(stc.STC_STYLE_DEFAULT, pts-1)
|
|
1421
|
+
## pts = self.StyleGetSize(stc.STC_STYLE_DEFAULT)
|
|
1422
|
+
## self.StyleSetSize(stc.STC_STYLE_DEFAULT, pts-1)
|
|
1424
1423
|
|
|
1425
1424
|
self.AutoCompSetSeparator(ord('\n'))
|
|
1426
1425
|
self.AutoCompShow(0, '\n'.join(map(_format, self.__itextlines)))
|
|
1427
1426
|
self.AutoCompSelect("{:4d}".format(self.cline+1))
|
|
1428
1427
|
self.Bind(stc.EVT_STC_AUTOCOMP_SELECTION, self.on_itext_selection)
|
|
1429
1428
|
|
|
1430
|
-
self.StyleSetSize(stc.STC_STYLE_DEFAULT, pts)
|
|
1429
|
+
## self.StyleSetSize(stc.STC_STYLE_DEFAULT, pts)
|
|
1431
1430
|
|
|
1432
1431
|
def on_itext_exit(self, evt):
|
|
1433
1432
|
"""Called when exiting filter_text mode."""
|
|
@@ -2144,7 +2143,6 @@ class Buffer(EditorInterface, EditWindow):
|
|
|
2144
2143
|
self.AnnotationSetStyle(lx, stc.STC_STYLE_ANNOTATION)
|
|
2145
2144
|
self.AnnotationSetText(lx, msg)
|
|
2146
2145
|
self.message(e)
|
|
2147
|
-
## print(msg, file=sys.__stderr__)
|
|
2148
2146
|
else:
|
|
2149
2147
|
self.code = code
|
|
2150
2148
|
del self.pointer # Reset pointer (debugger hook point).
|
|
@@ -2583,19 +2581,21 @@ class Interpreter(interpreter.Interpreter):
|
|
|
2583
2581
|
interpreter.Interpreter.showtraceback(self)
|
|
2584
2582
|
|
|
2585
2583
|
t, v, tb = sys.exc_info()
|
|
2586
|
-
|
|
2587
|
-
|
|
2584
|
+
while tb.tb_next:
|
|
2585
|
+
tb = tb.tb_next
|
|
2586
|
+
v.lineno = tb.tb_lineno
|
|
2587
|
+
v.filename = tb.tb_frame.f_code.co_filename
|
|
2588
2588
|
try:
|
|
2589
2589
|
self.parent.handler('interp_error', v)
|
|
2590
2590
|
except AttributeError:
|
|
2591
2591
|
pass
|
|
2592
2592
|
|
|
2593
|
-
def showsyntaxerror(self, filename=None):
|
|
2593
|
+
def showsyntaxerror(self, filename=None, **kwargs):
|
|
2594
2594
|
"""Display the syntax error that just occurred.
|
|
2595
2595
|
|
|
2596
2596
|
(override) Pass the syntax error info to the parent:shell.
|
|
2597
2597
|
"""
|
|
2598
|
-
interpreter.Interpreter.showsyntaxerror(self, filename)
|
|
2598
|
+
interpreter.Interpreter.showsyntaxerror(self, filename, **kwargs)
|
|
2599
2599
|
|
|
2600
2600
|
t, v, tb = sys.exc_info()
|
|
2601
2601
|
try:
|
|
@@ -3206,8 +3206,8 @@ class Nautilus(EditorInterface, Shell):
|
|
|
3206
3206
|
Note:
|
|
3207
3207
|
This is called before run, execute, and original magic.
|
|
3208
3208
|
"""
|
|
3209
|
-
sep1 = "
|
|
3210
|
-
sep2 = "`@=+-/*%<>&|^~,; \t#" # [@] ops, delims, and whitespaces
|
|
3209
|
+
sep1 = "`@=;\r\n#" # [`] no ops, no spaces, no comma
|
|
3210
|
+
sep2 = "`@=+-/*%<>&|^~,; \t\r\n#" # [@] ops, delims, and whitespaces
|
|
3211
3211
|
|
|
3212
3212
|
def _popiter(ls, f):
|
|
3213
3213
|
pred = f if callable(f) else re.compile(f).match
|
|
@@ -3328,7 +3328,7 @@ class Nautilus(EditorInterface, Shell):
|
|
|
3328
3328
|
|
|
3329
3329
|
def on_interp_error(self, e):
|
|
3330
3330
|
ln = self.LineFromPosition(self.bolc)
|
|
3331
|
-
self.
|
|
3331
|
+
self.red_pointer = ln + e.lineno - 1
|
|
3332
3332
|
|
|
3333
3333
|
## --------------------------------
|
|
3334
3334
|
## Attributes of the shell
|
|
@@ -3652,11 +3652,11 @@ class Nautilus(EditorInterface, Shell):
|
|
|
3652
3652
|
lines = [int(ln) for fn, ln in err if fn == filename]
|
|
3653
3653
|
if lines:
|
|
3654
3654
|
region = self.get_region(self.cline)
|
|
3655
|
-
|
|
3655
|
+
lx = region[0] + lines[-1] - 1
|
|
3656
|
+
self.red_pointer = lx
|
|
3656
3657
|
self.message(e)
|
|
3657
|
-
## print(msg, file=sys.__stderr__)
|
|
3658
3658
|
else:
|
|
3659
|
-
del self.
|
|
3659
|
+
del self.red_pointer
|
|
3660
3660
|
self.message("Evaluated {!r} successfully.".format(filename))
|
|
3661
3661
|
else:
|
|
3662
3662
|
self.message("No region")
|
mwx/plugins/ffmpeg_view.py
CHANGED
mwx/plugins/fft_view.py
CHANGED
mwx/plugins/frame_listview.py
CHANGED
|
@@ -243,7 +243,7 @@ class CheckList(wx.ListCtrl, ListCtrlAutoWidthMixin, CtrlInterface):
|
|
|
243
243
|
class Plugin(Layer):
|
|
244
244
|
"""Property list of Graph buffers.
|
|
245
245
|
"""
|
|
246
|
-
menukey = "Plugins/Extensions/&Buffer listbox\
|
|
246
|
+
menukey = "Plugins/Extensions/&Buffer listbox\tAlt+b"
|
|
247
247
|
caption = "Property list"
|
|
248
248
|
dockable = False
|
|
249
249
|
|
mwx/plugins/line_profile.py
CHANGED
|
@@ -8,7 +8,7 @@ from mwx.matplot2lg import LineProfile
|
|
|
8
8
|
class Plugin(Layer):
|
|
9
9
|
"""Line profile of the currently selected buffers.
|
|
10
10
|
"""
|
|
11
|
-
menukey = "Plugins/Extensions/&Line profile\
|
|
11
|
+
menukey = "Plugins/Extensions/&Line profile\tAlt+l"
|
|
12
12
|
caption = "Line profile"
|
|
13
13
|
dockable = False
|
|
14
14
|
|
mwx/wxpdb.py
CHANGED
|
@@ -295,10 +295,6 @@ class Debugger(Pdb):
|
|
|
295
295
|
self.__hookpoint = None
|
|
296
296
|
self.indents = ' ' * 2
|
|
297
297
|
self.stdin.input = '' # clear stdin buffer
|
|
298
|
-
def _continue():
|
|
299
|
-
if wx.IsBusy():
|
|
300
|
-
wx.EndBusyCursor()
|
|
301
|
-
wx.CallAfter(_continue)
|
|
302
298
|
|
|
303
299
|
def on_debug_mark(self, frame):
|
|
304
300
|
"""Called when interaction."""
|
|
@@ -365,11 +361,6 @@ class Debugger(Pdb):
|
|
|
365
361
|
|
|
366
362
|
## Note: Required to terminate the reader of threading pdb.
|
|
367
363
|
self.send_input('\n')
|
|
368
|
-
|
|
369
|
-
def _continue():
|
|
370
|
-
if wx.IsBusy():
|
|
371
|
-
wx.EndBusyCursor()
|
|
372
|
-
wx.CallAfter(_continue)
|
|
373
364
|
|
|
374
365
|
def on_trace_hook(self, frame):
|
|
375
366
|
"""Called when a breakppoint is reached."""
|
mwx/wxwit.py
CHANGED
|
@@ -217,8 +217,6 @@ def dump(widget=None):
|
|
|
217
217
|
def watchit(widget=None, **kwargs):
|
|
218
218
|
"""Wx.py tool for watching widget tree structure and events."""
|
|
219
219
|
from wx.lib.inspection import InspectionTool
|
|
220
|
-
if widget:
|
|
221
|
-
kwargs.update(locals=widget.__dict__)
|
|
222
220
|
it = InspectionTool()
|
|
223
221
|
it.Init(**kwargs)
|
|
224
222
|
it.Show(widget)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: mwxlib
|
|
3
|
-
Version:
|
|
3
|
+
Version: 1.0rc4
|
|
4
4
|
Summary: A wrapper of matplotlib and wxPython (phoenix)
|
|
5
5
|
Home-page: https://github.com/komoto48g/mwxlib
|
|
6
6
|
Author: Kazuya O'moto
|
|
@@ -39,22 +39,17 @@ These instructions will get you a copy of the project up and running on your loc
|
|
|
39
39
|
- ~~Python 2.7~~ (PY2 support has ended since 0.50)
|
|
40
40
|
- ~~Python 3.5~~ (PY35 support has ended since 0.70)
|
|
41
41
|
- ~~Python 3.7~~ (PY37 support has ended since 0.80)
|
|
42
|
-
- Python 3.8 -- 3.9 (
|
|
43
|
-
|
|
42
|
+
- ~~Python 3.8 -- 3.9~~ (Deprecated since 0.90)
|
|
43
|
+
- Python 3.10 -- 3.12
|
|
44
|
+
- wxpython >= 4.2.2 (recommended)
|
|
44
45
|
- numpy
|
|
45
46
|
- pillow
|
|
46
47
|
- matplotlib
|
|
47
48
|
- opencv-python
|
|
48
|
-
- Python 3.
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
- matplotlib
|
|
53
|
-
- opencv-python
|
|
54
|
-
- Python 3.12
|
|
55
|
-
- A version of wxpython for PY312 has not yet released on PyPi.
|
|
56
|
-
* You can download the snapshot from https://wxpython.org/Phoenix/snapshot-builds/,
|
|
57
|
-
* or the latest snapshot from Azure Pipelines https://alldunn.visualstudio.com/wxPython-CI/_build?definitionId=2&_a=summary
|
|
49
|
+
- Python 3.13
|
|
50
|
+
- There are some bugs in mwxlib that remain unfixed.
|
|
51
|
+
- A version of wxpython for PY313 has released on PyPi.
|
|
52
|
+
* You can also download the snapshot from https://wxpython.org/Phoenix/snapshot-builds/,
|
|
58
53
|
|
|
59
54
|
|
|
60
55
|
### Installing
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
mwx/__init__.py,sha256=psabnAMei5VzB2TsB2qBNLrIZMX0LiqjlXCpNGmDejk,668
|
|
2
|
+
mwx/bookshelf.py,sha256=so-xSLq08sMlJBErTxOaDoKUAMa_g1CkIP2pNnff68c,5607
|
|
3
|
+
mwx/controls.py,sha256=LZqee9K8uPxs-Iqcp1zMMNBjFpGPrHbcMaIBuBOL7oo,47647
|
|
4
|
+
mwx/framework.py,sha256=AlmzB7g3rkgBOKvgxZs1UZpnIovfiI2FNsVfN-F9O5A,75810
|
|
5
|
+
mwx/graphman.py,sha256=1GGBk4kJYRQ7zkvO2rvHxHoINrIfHSB7cabQKWhTyaI,69669
|
|
6
|
+
mwx/images.py,sha256=_-Eh3xF7Khu42ivkYp97NXIzSNGbjcidqtWjZQFGtqE,47827
|
|
7
|
+
mwx/matplot2.py,sha256=zA56jIdRUdzu-wrmPai1PSOjzqV2Erqw2yFKW-jwdA8,32901
|
|
8
|
+
mwx/matplot2g.py,sha256=-vONEcU1UzAvsl5tgEluiDhebyA1_SU3HNnUN25ZQzU,64414
|
|
9
|
+
mwx/matplot2lg.py,sha256=JRWjWnLJUytbSq6wxs4P0gbVUr3xoLSF6Wwqd5V_pJI,27404
|
|
10
|
+
mwx/mgplt.py,sha256=M5rt-H7Uq1OHnlFvMA4a3945UBvppbR9L_mw8NL_YZ0,5602
|
|
11
|
+
mwx/nutshell.py,sha256=Kp4REs2TsiVhoBZn8SapcrkfcnKp_IQiOaLZJDggpuA,141809
|
|
12
|
+
mwx/utilus.py,sha256=Yyw8L1f-ikhyd7wtFXYtsOswofWxmB4GAmLOZnhUXeU,37388
|
|
13
|
+
mwx/wxmon.py,sha256=yzWqrbY6LzpfRwQeytYUeqFhFuLVm_XEvrVAL_k0HBQ,12756
|
|
14
|
+
mwx/wxpdb.py,sha256=--TQr-_zs9dWPYV2V4s3Zr4abvN14o5wD8anT9frHUg,18875
|
|
15
|
+
mwx/wxwil.py,sha256=hhyB1lPrF9ixeObxCOKQv0Theu-B-kpJg_yVU3EGSNg,5406
|
|
16
|
+
mwx/wxwit.py,sha256=1hHtMi2YEy2T_LnUpwdmrIdtCuvxMOFyykqnbq6jLP0,7294
|
|
17
|
+
mwx/plugins/__init__.py,sha256=jnJ-Sl9XJ_7BFDslD_r7dsbxsOT57q_IaEriV53XIGY,41
|
|
18
|
+
mwx/plugins/ffmpeg_view.py,sha256=ZKkSLpyuzpVuRbaPib04rChzlwAifNp3pcgxABeqE4k,10693
|
|
19
|
+
mwx/plugins/fft_view.py,sha256=08A_Y73XirV7kXpwf-v0mUA0Hr0MOfdMXv3tvL1hvWA,2789
|
|
20
|
+
mwx/plugins/frame_listview.py,sha256=gowjQ-ARNonMkDSXkQgPKq4U9YBJ-vQ0jK2krBVOdCs,10420
|
|
21
|
+
mwx/plugins/line_profile.py,sha256=zzm6_7lnAnNepLbh07ordp3nRWDFQJtu719ZVjrVf8s,819
|
|
22
|
+
mwx/py/__init__.py,sha256=xykgfOytOwNuvXsfkLoumFZSTN-iBsHOjczYXngjmUE,12
|
|
23
|
+
mwx/py/filling.py,sha256=fumUG1F5M9TL-Dfqni4G85uk7TmvnUunTbdcPDV0vfo,16857
|
|
24
|
+
mwxlib-1.0rc4.dist-info/LICENSE,sha256=PGtRKCaTkmUDlBQwpptJAxJtdqxIUtAmdBsaT9nUVkA,1091
|
|
25
|
+
mwxlib-1.0rc4.dist-info/METADATA,sha256=-ZzR93Ze3uYiaIWArAhSj9NFfTUDcJLxt0xhD-MhaGs,7260
|
|
26
|
+
mwxlib-1.0rc4.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
|
27
|
+
mwxlib-1.0rc4.dist-info/top_level.txt,sha256=SI1Mh118AstnUFGPNq5aMNKiAnVNmZk1S9Ij-OwAEpY,4
|
|
28
|
+
mwxlib-1.0rc4.dist-info/RECORD,,
|
mwxlib-0.99.9.dist-info/RECORD
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
mwx/__init__.py,sha256=psabnAMei5VzB2TsB2qBNLrIZMX0LiqjlXCpNGmDejk,668
|
|
2
|
-
mwx/bookshelf.py,sha256=so-xSLq08sMlJBErTxOaDoKUAMa_g1CkIP2pNnff68c,5607
|
|
3
|
-
mwx/controls.py,sha256=LZqee9K8uPxs-Iqcp1zMMNBjFpGPrHbcMaIBuBOL7oo,47647
|
|
4
|
-
mwx/framework.py,sha256=nJ22_22Hk2U8xSbHOszluJdSMDwYsw6XjI3lOiprcJc,75501
|
|
5
|
-
mwx/graphman.py,sha256=qX5aHEw4u9iGR8lNpZkXDnGPVMhyAH6NnBapiaUbKZw,70265
|
|
6
|
-
mwx/images.py,sha256=_-Eh3xF7Khu42ivkYp97NXIzSNGbjcidqtWjZQFGtqE,47827
|
|
7
|
-
mwx/matplot2.py,sha256=zA56jIdRUdzu-wrmPai1PSOjzqV2Erqw2yFKW-jwdA8,32901
|
|
8
|
-
mwx/matplot2g.py,sha256=gCXa8X1MEMP7n_mG73h3SkWKuNZOfjVKUTWNRXXK11c,64310
|
|
9
|
-
mwx/matplot2lg.py,sha256=JRWjWnLJUytbSq6wxs4P0gbVUr3xoLSF6Wwqd5V_pJI,27404
|
|
10
|
-
mwx/mgplt.py,sha256=M5rt-H7Uq1OHnlFvMA4a3945UBvppbR9L_mw8NL_YZ0,5602
|
|
11
|
-
mwx/nutshell.py,sha256=zJULq1K8WiOBUncMpXE8HbunqUULa9MUt0hBET5jmgs,141810
|
|
12
|
-
mwx/utilus.py,sha256=Yyw8L1f-ikhyd7wtFXYtsOswofWxmB4GAmLOZnhUXeU,37388
|
|
13
|
-
mwx/wxmon.py,sha256=yzWqrbY6LzpfRwQeytYUeqFhFuLVm_XEvrVAL_k0HBQ,12756
|
|
14
|
-
mwx/wxpdb.py,sha256=lLowkkAgMhPFHAfklD7wZHq0qbSMjRxnBFtSajmVgME,19133
|
|
15
|
-
mwx/wxwil.py,sha256=hhyB1lPrF9ixeObxCOKQv0Theu-B-kpJg_yVU3EGSNg,5406
|
|
16
|
-
mwx/wxwit.py,sha256=l7uq6NgGBhay-uAE1pQgWziSAGO9QZPJ4EpEBw1P9xU,7357
|
|
17
|
-
mwx/plugins/__init__.py,sha256=jnJ-Sl9XJ_7BFDslD_r7dsbxsOT57q_IaEriV53XIGY,41
|
|
18
|
-
mwx/plugins/ffmpeg_view.py,sha256=Mmen75o6LyA5QEHB8sCFSPCIPvEaALKzrgomym3fGAU,10721
|
|
19
|
-
mwx/plugins/fft_view.py,sha256=xxTDD-_z4l18u4t2ybPB3xAMIslJmJ0gQlTxEqJUhNI,2782
|
|
20
|
-
mwx/plugins/frame_listview.py,sha256=yEYPCdLHLSMTJwTv6iYAh3Lo4lJvYfp5BxTLP3FhW9Y,10421
|
|
21
|
-
mwx/plugins/line_profile.py,sha256=--9NIc3x5EfRB3L59JvD7rzENQHyiYfu7wWJo6AuMkA,820
|
|
22
|
-
mwx/py/__init__.py,sha256=xykgfOytOwNuvXsfkLoumFZSTN-iBsHOjczYXngjmUE,12
|
|
23
|
-
mwx/py/filling.py,sha256=fumUG1F5M9TL-Dfqni4G85uk7TmvnUunTbdcPDV0vfo,16857
|
|
24
|
-
mwxlib-0.99.9.dist-info/LICENSE,sha256=PGtRKCaTkmUDlBQwpptJAxJtdqxIUtAmdBsaT9nUVkA,1091
|
|
25
|
-
mwxlib-0.99.9.dist-info/METADATA,sha256=1-yAjrG-AehfMfbbEyPN3eMtrGErVkNft7OHtTkwSU0,7411
|
|
26
|
-
mwxlib-0.99.9.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
27
|
-
mwxlib-0.99.9.dist-info/top_level.txt,sha256=SI1Mh118AstnUFGPNq5aMNKiAnVNmZk1S9Ij-OwAEpY,4
|
|
28
|
-
mwxlib-0.99.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|