urwid 2.6.15__py3-none-any.whl → 3.0.5__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.
- urwid/__init__.py +30 -20
- urwid/canvas.py +34 -53
- urwid/command_map.py +6 -4
- urwid/container.py +1 -1
- urwid/decoration.py +1 -1
- urwid/display/__init__.py +53 -48
- urwid/display/_posix_raw_display.py +20 -8
- urwid/display/_raw_display_base.py +21 -16
- urwid/display/_win32_raw_display.py +16 -17
- urwid/display/common.py +45 -74
- urwid/display/curses.py +3 -5
- urwid/display/escape.py +28 -13
- urwid/display/lcd.py +8 -10
- urwid/display/web.py +11 -16
- urwid/event_loop/asyncio_loop.py +35 -15
- urwid/event_loop/main_loop.py +18 -23
- urwid/event_loop/tornado_loop.py +4 -5
- urwid/event_loop/trio_loop.py +1 -1
- urwid/font.py +19 -22
- urwid/numedit.py +65 -65
- urwid/signals.py +19 -27
- urwid/split_repr.py +9 -3
- urwid/str_util.py +105 -60
- urwid/text_layout.py +14 -13
- urwid/util.py +8 -19
- urwid/version.py +22 -4
- urwid/vterm.py +20 -47
- urwid/widget/__init__.py +0 -6
- urwid/widget/attr_map.py +10 -10
- urwid/widget/attr_wrap.py +11 -13
- urwid/widget/bar_graph.py +3 -8
- urwid/widget/big_text.py +8 -9
- urwid/widget/box_adapter.py +6 -6
- urwid/widget/columns.py +52 -83
- urwid/widget/container.py +29 -75
- urwid/widget/divider.py +6 -6
- urwid/widget/edit.py +50 -50
- urwid/widget/filler.py +14 -14
- urwid/widget/frame.py +31 -40
- urwid/widget/grid_flow.py +25 -110
- urwid/widget/line_box.py +31 -18
- urwid/widget/listbox.py +16 -51
- urwid/widget/monitored_list.py +75 -49
- urwid/widget/overlay.py +4 -37
- urwid/widget/padding.py +31 -68
- urwid/widget/pile.py +179 -158
- urwid/widget/popup.py +2 -2
- urwid/widget/progress_bar.py +17 -18
- urwid/widget/scrollable.py +26 -34
- urwid/widget/solid_fill.py +3 -3
- urwid/widget/text.py +44 -30
- urwid/widget/treetools.py +27 -48
- urwid/widget/widget.py +13 -130
- urwid/widget/widget_decoration.py +6 -35
- urwid/widget/wimp.py +61 -61
- urwid/wimp.py +1 -1
- {urwid-2.6.15.dist-info → urwid-3.0.5.dist-info}/METADATA +24 -24
- urwid-3.0.5.dist-info/RECORD +74 -0
- {urwid-2.6.15.dist-info → urwid-3.0.5.dist-info}/WHEEL +1 -1
- urwid-2.6.15.dist-info/RECORD +0 -74
- {urwid-2.6.15.dist-info → urwid-3.0.5.dist-info/licenses}/COPYING +0 -0
- {urwid-2.6.15.dist-info → urwid-3.0.5.dist-info}/top_level.txt +0 -0
|
@@ -37,7 +37,7 @@ class WidgetDecoration(Widget, typing.Generic[WrappedWidget]): # pylint: disabl
|
|
|
37
37
|
Don't actually do this -- use a WidgetDecoration subclass instead, these are not real widgets:
|
|
38
38
|
|
|
39
39
|
>>> from urwid import Text
|
|
40
|
-
>>> WidgetDecoration(Text(
|
|
40
|
+
>>> WidgetDecoration(Text("hi"))
|
|
41
41
|
<WidgetDecoration fixed/flow widget <Text fixed/flow widget 'hi'>>
|
|
42
42
|
|
|
43
43
|
.. Warning:
|
|
@@ -71,32 +71,15 @@ class WidgetDecoration(Widget, typing.Generic[WrappedWidget]): # pylint: disabl
|
|
|
71
71
|
self._original_widget = original_widget
|
|
72
72
|
self._invalidate()
|
|
73
73
|
|
|
74
|
-
def _get_original_widget(self) -> WrappedWidget:
|
|
75
|
-
warnings.warn(
|
|
76
|
-
f"Method `{self.__class__.__name__}._get_original_widget` is deprecated, "
|
|
77
|
-
f"please use property `{self.__class__.__name__}.original_widget`",
|
|
78
|
-
DeprecationWarning,
|
|
79
|
-
stacklevel=2,
|
|
80
|
-
)
|
|
81
|
-
return self.original_widget
|
|
82
|
-
|
|
83
|
-
def _set_original_widget(self, original_widget: WrappedWidget) -> None:
|
|
84
|
-
warnings.warn(
|
|
85
|
-
f"Method `{self.__class__.__name__}._set_original_widget` is deprecated, "
|
|
86
|
-
f"please use property `{self.__class__.__name__}.original_widget`",
|
|
87
|
-
DeprecationWarning,
|
|
88
|
-
stacklevel=2,
|
|
89
|
-
)
|
|
90
|
-
self.original_widget = original_widget
|
|
91
|
-
|
|
92
74
|
@property
|
|
93
75
|
def base_widget(self) -> Widget:
|
|
94
76
|
"""
|
|
95
|
-
Return the widget without decorations.
|
|
96
|
-
|
|
77
|
+
Return the widget without decorations.
|
|
78
|
+
|
|
79
|
+
If there is only one Decoration, then this is the same as original_widget.
|
|
97
80
|
|
|
98
81
|
>>> from urwid import Text
|
|
99
|
-
>>> t = Text(
|
|
82
|
+
>>> t = Text("hello")
|
|
100
83
|
>>> wd1 = WidgetDecoration(t)
|
|
101
84
|
>>> wd2 = WidgetDecoration(wd1)
|
|
102
85
|
>>> wd3 = WidgetDecoration(wd2)
|
|
@@ -107,22 +90,10 @@ class WidgetDecoration(Widget, typing.Generic[WrappedWidget]): # pylint: disabl
|
|
|
107
90
|
"""
|
|
108
91
|
visited = {self}
|
|
109
92
|
w = self
|
|
110
|
-
while
|
|
111
|
-
w = w._original_widget
|
|
112
|
-
if w in visited:
|
|
113
|
-
break
|
|
93
|
+
while (w := getattr(w, "_original_widget", w)) not in visited:
|
|
114
94
|
visited.add(w)
|
|
115
95
|
return w
|
|
116
96
|
|
|
117
|
-
def _get_base_widget(self) -> Widget:
|
|
118
|
-
warnings.warn(
|
|
119
|
-
f"Method `{self.__class__.__name__}._get_base_widget` is deprecated, "
|
|
120
|
-
f"please use property `{self.__class__.__name__}.base_widget`",
|
|
121
|
-
DeprecationWarning,
|
|
122
|
-
stacklevel=2,
|
|
123
|
-
)
|
|
124
|
-
return self.base_widget
|
|
125
|
-
|
|
126
97
|
def selectable(self) -> bool:
|
|
127
98
|
return self._original_widget.selectable()
|
|
128
99
|
|
urwid/widget/wimp.py
CHANGED
|
@@ -84,7 +84,7 @@ class SelectableIcon(Text):
|
|
|
84
84
|
Render the text content of this widget with a cursor when
|
|
85
85
|
in focus.
|
|
86
86
|
|
|
87
|
-
>>> si = SelectableIcon(
|
|
87
|
+
>>> si = SelectableIcon("[!]")
|
|
88
88
|
>>> si
|
|
89
89
|
<SelectableIcon selectable fixed/flow widget '[!]'>
|
|
90
90
|
>>> si.render((4,), focus=True).cursor
|
|
@@ -170,10 +170,10 @@ class CheckBox(WidgetWrap[Columns]):
|
|
|
170
170
|
def __init__(
|
|
171
171
|
self,
|
|
172
172
|
label: str | tuple[Hashable, str] | list[str | tuple[Hashable, str]],
|
|
173
|
-
state: bool = False,
|
|
174
|
-
has_mixed: typing.Literal[
|
|
175
|
-
on_state_change: Callable[[Self, bool], typing.Any] | None = None,
|
|
176
|
-
user_data:
|
|
173
|
+
state: typing.Literal["mixed"] | bool = False,
|
|
174
|
+
has_mixed: typing.Literal[True] = True,
|
|
175
|
+
on_state_change: Callable[[Self, bool | typing.Literal["mixed"], _T], typing.Any] | None = None,
|
|
176
|
+
user_data: _T = ...,
|
|
177
177
|
checked_symbol: str | None = ...,
|
|
178
178
|
) -> None: ...
|
|
179
179
|
|
|
@@ -181,10 +181,10 @@ class CheckBox(WidgetWrap[Columns]):
|
|
|
181
181
|
def __init__(
|
|
182
182
|
self,
|
|
183
183
|
label: str | tuple[Hashable, str] | list[str | tuple[Hashable, str]],
|
|
184
|
-
state:
|
|
185
|
-
has_mixed: typing.Literal[
|
|
186
|
-
on_state_change: Callable[[Self, bool
|
|
187
|
-
user_data:
|
|
184
|
+
state: bool = False,
|
|
185
|
+
has_mixed: typing.Literal[False] = False,
|
|
186
|
+
on_state_change: Callable[[Self, bool], typing.Any] | None = None,
|
|
187
|
+
user_data: None = None,
|
|
188
188
|
checked_symbol: str | None = ...,
|
|
189
189
|
) -> None: ...
|
|
190
190
|
|
|
@@ -206,8 +206,8 @@ class CheckBox(WidgetWrap[Columns]):
|
|
|
206
206
|
has_mixed: typing.Literal[False, True] = False, # MyPy issue: Literal[True, False] is not equal `bool`
|
|
207
207
|
on_state_change: (
|
|
208
208
|
Callable[[Self, bool, _T], typing.Any]
|
|
209
|
-
| Callable[[Self, bool], typing.Any]
|
|
210
209
|
| Callable[[Self, bool | typing.Literal["mixed"], _T], typing.Any]
|
|
210
|
+
| Callable[[Self, bool], typing.Any]
|
|
211
211
|
| Callable[[Self, bool | typing.Literal["mixed"]], typing.Any]
|
|
212
212
|
| None
|
|
213
213
|
) = None,
|
|
@@ -228,12 +228,12 @@ class CheckBox(WidgetWrap[Columns]):
|
|
|
228
228
|
|
|
229
229
|
Register signal handler with::
|
|
230
230
|
|
|
231
|
-
urwid.connect_signal(check_box,
|
|
231
|
+
urwid.connect_signal(check_box, "change", callback, user_data)
|
|
232
232
|
|
|
233
233
|
where callback is callback(check_box, new_state [,user_data])
|
|
234
234
|
Unregister signal handlers with::
|
|
235
235
|
|
|
236
|
-
urwid.disconnect_signal(check_box,
|
|
236
|
+
urwid.disconnect_signal(check_box, "change", callback, user_data)
|
|
237
237
|
|
|
238
238
|
>>> CheckBox("Confirm")
|
|
239
239
|
<CheckBox selectable fixed/flow widget 'Confirm' state=False>
|
|
@@ -303,10 +303,10 @@ class CheckBox(WidgetWrap[Columns]):
|
|
|
303
303
|
label -- markup for label. See Text widget for description
|
|
304
304
|
of text markup.
|
|
305
305
|
|
|
306
|
-
>>> cb = CheckBox(
|
|
306
|
+
>>> cb = CheckBox("foo")
|
|
307
307
|
>>> cb
|
|
308
308
|
<CheckBox selectable fixed/flow widget 'foo' state=False>
|
|
309
|
-
>>> cb.set_label((
|
|
309
|
+
>>> cb.set_label(("bright_attr", "bar"))
|
|
310
310
|
>>> cb
|
|
311
311
|
<CheckBox selectable fixed/flow widget 'bar' state=False>
|
|
312
312
|
"""
|
|
@@ -318,12 +318,12 @@ class CheckBox(WidgetWrap[Columns]):
|
|
|
318
318
|
"""
|
|
319
319
|
Return label text.
|
|
320
320
|
|
|
321
|
-
>>> cb = CheckBox(
|
|
321
|
+
>>> cb = CheckBox("Seriously")
|
|
322
322
|
>>> print(cb.get_label())
|
|
323
323
|
Seriously
|
|
324
324
|
>>> print(cb.label)
|
|
325
325
|
Seriously
|
|
326
|
-
>>> cb.set_label([(
|
|
326
|
+
>>> cb.set_label([("bright_attr", "flashy"), " normal"])
|
|
327
327
|
>>> print(cb.label) # only text is returned
|
|
328
328
|
flashy normal
|
|
329
329
|
"""
|
|
@@ -348,20 +348,20 @@ class CheckBox(WidgetWrap[Columns]):
|
|
|
348
348
|
... changes.append("A %r %r" % (state, user_data))
|
|
349
349
|
>>> def callback_b(cb, state):
|
|
350
350
|
... changes.append("B %r" % state)
|
|
351
|
-
>>> cb = CheckBox(
|
|
352
|
-
>>> key1 = connect_signal(cb,
|
|
353
|
-
>>> key2 = connect_signal(cb,
|
|
354
|
-
>>> cb.set_state(True)
|
|
351
|
+
>>> cb = CheckBox("test", False, False)
|
|
352
|
+
>>> key1 = connect_signal(cb, "change", callback_a, user_args=("user_a",))
|
|
353
|
+
>>> key2 = connect_signal(cb, "change", callback_b)
|
|
354
|
+
>>> cb.set_state(True) # both callbacks will be triggered
|
|
355
355
|
>>> cb.state
|
|
356
356
|
True
|
|
357
|
-
>>> disconnect_signal(cb,
|
|
357
|
+
>>> disconnect_signal(cb, "change", callback_a, user_args=("user_a",))
|
|
358
358
|
>>> cb.state = False
|
|
359
359
|
>>> cb.state
|
|
360
360
|
False
|
|
361
361
|
>>> cb.set_state(True)
|
|
362
362
|
>>> cb.state
|
|
363
363
|
True
|
|
364
|
-
>>> cb.set_state(False, False)
|
|
364
|
+
>>> cb.set_state(False, False) # don't send signal
|
|
365
365
|
>>> changes
|
|
366
366
|
["A True 'user_a'", 'B True', 'B False', 'B True']
|
|
367
367
|
"""
|
|
@@ -392,16 +392,16 @@ class CheckBox(WidgetWrap[Columns]):
|
|
|
392
392
|
"""
|
|
393
393
|
Toggle state on 'activate' command.
|
|
394
394
|
|
|
395
|
-
>>> assert CheckBox._command_map[
|
|
396
|
-
>>> assert CheckBox._command_map[
|
|
395
|
+
>>> assert CheckBox._command_map[" "] == "activate"
|
|
396
|
+
>>> assert CheckBox._command_map["enter"] == "activate"
|
|
397
397
|
>>> size = (10,)
|
|
398
|
-
>>> cb = CheckBox(
|
|
398
|
+
>>> cb = CheckBox("press me")
|
|
399
399
|
>>> cb.state
|
|
400
400
|
False
|
|
401
|
-
>>> cb.keypress(size,
|
|
401
|
+
>>> cb.keypress(size, " ")
|
|
402
402
|
>>> cb.state
|
|
403
403
|
True
|
|
404
|
-
>>> cb.keypress(size,
|
|
404
|
+
>>> cb.keypress(size, " ")
|
|
405
405
|
>>> cb.state
|
|
406
406
|
False
|
|
407
407
|
"""
|
|
@@ -446,7 +446,7 @@ class CheckBox(WidgetWrap[Columns]):
|
|
|
446
446
|
>>> cb = CheckBox("clickme")
|
|
447
447
|
>>> cb.state
|
|
448
448
|
False
|
|
449
|
-
>>> cb.mouse_event(size,
|
|
449
|
+
>>> cb.mouse_event(size, "mouse press", 1, 2, 0, True)
|
|
450
450
|
True
|
|
451
451
|
>>> cb.state
|
|
452
452
|
True
|
|
@@ -510,23 +510,23 @@ class RadioButton(CheckBox):
|
|
|
510
510
|
|
|
511
511
|
Register signal handler with::
|
|
512
512
|
|
|
513
|
-
urwid.connect_signal(radio_button,
|
|
513
|
+
urwid.connect_signal(radio_button, "change", callback, user_data)
|
|
514
514
|
|
|
515
515
|
where callback is callback(radio_button, new_state [,user_data])
|
|
516
516
|
Unregister signal handlers with::
|
|
517
517
|
|
|
518
|
-
urwid.disconnect_signal(radio_button,
|
|
518
|
+
urwid.disconnect_signal(radio_button, "change", callback, user_data)
|
|
519
519
|
|
|
520
|
-
>>> bgroup = []
|
|
521
|
-
>>> b1 = RadioButton(bgroup,
|
|
522
|
-
>>> b2 = RadioButton(bgroup,
|
|
520
|
+
>>> bgroup = [] # button group
|
|
521
|
+
>>> b1 = RadioButton(bgroup, "Agree")
|
|
522
|
+
>>> b2 = RadioButton(bgroup, "Disagree")
|
|
523
523
|
>>> len(bgroup)
|
|
524
524
|
2
|
|
525
525
|
>>> b1
|
|
526
526
|
<RadioButton selectable fixed/flow widget 'Agree' state=True>
|
|
527
527
|
>>> b2
|
|
528
528
|
<RadioButton selectable fixed/flow widget 'Disagree' state=False>
|
|
529
|
-
>>> b2.render((15,), focus=True).text
|
|
529
|
+
>>> b2.render((15,), focus=True).text # ... = b in Python 3
|
|
530
530
|
[...'( ) Disagree ']
|
|
531
531
|
"""
|
|
532
532
|
if state == "first True":
|
|
@@ -547,21 +547,21 @@ class RadioButton(CheckBox):
|
|
|
547
547
|
If state is True all other radio buttons in the same button
|
|
548
548
|
group will be set to False.
|
|
549
549
|
|
|
550
|
-
>>> bgroup = []
|
|
551
|
-
>>> b1 = RadioButton(bgroup,
|
|
552
|
-
>>> b2 = RadioButton(bgroup,
|
|
553
|
-
>>> b3 = RadioButton(bgroup,
|
|
550
|
+
>>> bgroup = [] # button group
|
|
551
|
+
>>> b1 = RadioButton(bgroup, "Agree")
|
|
552
|
+
>>> b2 = RadioButton(bgroup, "Disagree")
|
|
553
|
+
>>> b3 = RadioButton(bgroup, "Unsure")
|
|
554
554
|
>>> b1.state, b2.state, b3.state
|
|
555
555
|
(True, False, False)
|
|
556
556
|
>>> b2.set_state(True)
|
|
557
557
|
>>> b1.state, b2.state, b3.state
|
|
558
558
|
(False, True, False)
|
|
559
559
|
>>> def relabel_button(radio_button, new_state):
|
|
560
|
-
... radio_button.set_label(
|
|
561
|
-
>>> key = connect_signal(b3,
|
|
560
|
+
... radio_button.set_label("Think Harder!")
|
|
561
|
+
>>> key = connect_signal(b3, "change", relabel_button)
|
|
562
562
|
>>> b3
|
|
563
563
|
<RadioButton selectable fixed/flow widget 'Unsure' state=False>
|
|
564
|
-
>>> b3.set_state(True)
|
|
564
|
+
>>> b3.set_state(True) # this will trigger the callback
|
|
565
565
|
>>> b3
|
|
566
566
|
<RadioButton selectable fixed/flow widget 'Think Harder!' state=True>
|
|
567
567
|
"""
|
|
@@ -586,7 +586,7 @@ class RadioButton(CheckBox):
|
|
|
586
586
|
"""
|
|
587
587
|
Set state to True.
|
|
588
588
|
|
|
589
|
-
>>> bgroup = []
|
|
589
|
+
>>> bgroup = [] # button group
|
|
590
590
|
>>> b1 = RadioButton(bgroup, "Agree")
|
|
591
591
|
>>> b2 = RadioButton(bgroup, "Disagree")
|
|
592
592
|
>>> b1.state, b2.state
|
|
@@ -659,25 +659,25 @@ class Button(WidgetWrap[Columns]):
|
|
|
659
659
|
|
|
660
660
|
Register signal handler with::
|
|
661
661
|
|
|
662
|
-
urwid.connect_signal(button,
|
|
662
|
+
urwid.connect_signal(button, "click", callback, user_data)
|
|
663
663
|
|
|
664
664
|
where callback is callback(button [,user_data])
|
|
665
665
|
Unregister signal handlers with::
|
|
666
666
|
|
|
667
|
-
urwid.disconnect_signal(button,
|
|
667
|
+
urwid.disconnect_signal(button, "click", callback, user_data)
|
|
668
668
|
|
|
669
669
|
>>> from urwid.util import set_temporary_encoding
|
|
670
|
-
>>> Button(
|
|
670
|
+
>>> Button("Ok")
|
|
671
671
|
<Button selectable fixed/flow widget 'Ok'>
|
|
672
672
|
>>> b = Button("Cancel")
|
|
673
|
-
>>> b.render((15,), focus=True).text
|
|
673
|
+
>>> b.render((15,), focus=True).text # ... = b in Python 3
|
|
674
674
|
[b'< Cancel >']
|
|
675
675
|
>>> aligned_button = Button("Test", align=Align.CENTER)
|
|
676
676
|
>>> aligned_button.render((10,), focus=True).text
|
|
677
677
|
[b'< Test >']
|
|
678
678
|
>>> wrapped_button = Button("Long label", wrap=WrapMode.ELLIPSIS)
|
|
679
679
|
>>> with set_temporary_encoding("utf-8"):
|
|
680
|
-
... wrapped_button.render((7,), focus=False).text[0].decode(
|
|
680
|
+
... wrapped_button.render((7,), focus=False).text[0].decode("utf-8")
|
|
681
681
|
'< Lo… >'
|
|
682
682
|
"""
|
|
683
683
|
self._label = SelectableIcon(label, 0, align=align, wrap=wrap, layout=layout)
|
|
@@ -719,7 +719,7 @@ class Button(WidgetWrap[Columns]):
|
|
|
719
719
|
label -- markup for button label
|
|
720
720
|
|
|
721
721
|
>>> b = Button("Ok")
|
|
722
|
-
>>> b.set_label(
|
|
722
|
+
>>> b.set_label("Yup yup")
|
|
723
723
|
>>> b
|
|
724
724
|
<Button selectable fixed/flow widget 'Yup yup'>
|
|
725
725
|
"""
|
|
@@ -729,7 +729,7 @@ class Button(WidgetWrap[Columns]):
|
|
|
729
729
|
"""
|
|
730
730
|
Return label text.
|
|
731
731
|
|
|
732
|
-
>>> b = Button(
|
|
732
|
+
>>> b = Button("Ok")
|
|
733
733
|
>>> print(b.get_label())
|
|
734
734
|
Ok
|
|
735
735
|
>>> print(b.label)
|
|
@@ -743,17 +743,17 @@ class Button(WidgetWrap[Columns]):
|
|
|
743
743
|
"""
|
|
744
744
|
Send 'click' signal on 'activate' command.
|
|
745
745
|
|
|
746
|
-
>>> assert Button._command_map[
|
|
747
|
-
>>> assert Button._command_map[
|
|
746
|
+
>>> assert Button._command_map[" "] == "activate"
|
|
747
|
+
>>> assert Button._command_map["enter"] == "activate"
|
|
748
748
|
>>> size = (15,)
|
|
749
|
-
>>> b = Button(
|
|
749
|
+
>>> b = Button("Cancel")
|
|
750
750
|
>>> clicked_buttons = []
|
|
751
751
|
>>> def handle_click(button):
|
|
752
752
|
... clicked_buttons.append(button.label)
|
|
753
|
-
>>> key = connect_signal(b,
|
|
754
|
-
>>> b.keypress(size,
|
|
755
|
-
>>> b.keypress(size,
|
|
756
|
-
>>> clicked_buttons
|
|
753
|
+
>>> key = connect_signal(b, "click", handle_click)
|
|
754
|
+
>>> b.keypress(size, "enter")
|
|
755
|
+
>>> b.keypress(size, " ")
|
|
756
|
+
>>> clicked_buttons # ... = u in Python 2
|
|
757
757
|
[...'Cancel', ...'Cancel']
|
|
758
758
|
"""
|
|
759
759
|
if self._command_map[key] != Command.ACTIVATE:
|
|
@@ -767,16 +767,16 @@ class Button(WidgetWrap[Columns]):
|
|
|
767
767
|
Send 'click' signal on button 1 press.
|
|
768
768
|
|
|
769
769
|
>>> size = (15,)
|
|
770
|
-
>>> b = Button(
|
|
770
|
+
>>> b = Button("Ok")
|
|
771
771
|
>>> clicked_buttons = []
|
|
772
772
|
>>> def handle_click(button):
|
|
773
773
|
... clicked_buttons.append(button.label)
|
|
774
|
-
>>> key = connect_signal(b,
|
|
775
|
-
>>> b.mouse_event(size,
|
|
774
|
+
>>> key = connect_signal(b, "click", handle_click)
|
|
775
|
+
>>> b.mouse_event(size, "mouse press", 1, 4, 0, True)
|
|
776
776
|
True
|
|
777
|
-
>>> b.mouse_event(size,
|
|
777
|
+
>>> b.mouse_event(size, "mouse press", 2, 4, 0, True) # ignored
|
|
778
778
|
False
|
|
779
|
-
>>> clicked_buttons
|
|
779
|
+
>>> clicked_buttons # ... = u in Python 2
|
|
780
780
|
[...'Ok']
|
|
781
781
|
"""
|
|
782
782
|
if button != 1 or not is_mouse_press(event):
|
urwid/wimp.py
CHANGED
|
@@ -17,7 +17,7 @@ __all__ = (
|
|
|
17
17
|
warnings.warn(
|
|
18
18
|
f"{__name__!r} is not expected to be imported directly. "
|
|
19
19
|
'Please use public access from "urwid" package. '
|
|
20
|
-
f"Module {__name__!r} is deprecated and will be removed in the
|
|
20
|
+
f"Module {__name__!r} is deprecated and will be removed in the version 4.0.",
|
|
21
21
|
DeprecationWarning,
|
|
22
22
|
stacklevel=3,
|
|
23
23
|
)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: urwid
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.5
|
|
4
4
|
Summary: A full-featured console (xterm et al.) user interface library
|
|
5
|
-
Home-page: https://urwid.org/
|
|
6
5
|
Author-email: Ian Ward <ian@excess.org>
|
|
7
|
-
License: LGPL-2.1-only
|
|
6
|
+
License-Expression: LGPL-2.1-only
|
|
8
7
|
Project-URL: Homepage, https://urwid.org/
|
|
9
8
|
Project-URL: Documentation, https://urwid.org/manual/index.html
|
|
10
9
|
Project-URL: Repository, https://github.com/urwid/urwid
|
|
@@ -15,7 +14,6 @@ Classifier: Development Status :: 5 - Production/Stable
|
|
|
15
14
|
Classifier: Environment :: Console
|
|
16
15
|
Classifier: Environment :: Console :: Curses
|
|
17
16
|
Classifier: Intended Audience :: Developers
|
|
18
|
-
Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
|
|
19
17
|
Classifier: Operating System :: POSIX
|
|
20
18
|
Classifier: Operating System :: Unix
|
|
21
19
|
Classifier: Operating System :: MacOS :: MacOS X
|
|
@@ -23,37 +21,37 @@ Classifier: Operating System :: Microsoft :: Windows
|
|
|
23
21
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
24
22
|
Classifier: Topic :: Software Development :: Widget Sets
|
|
25
23
|
Classifier: Programming Language :: Python :: 3
|
|
26
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
27
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
28
24
|
Classifier: Programming Language :: Python :: 3.9
|
|
29
25
|
Classifier: Programming Language :: Python :: 3.10
|
|
30
26
|
Classifier: Programming Language :: Python :: 3.11
|
|
31
27
|
Classifier: Programming Language :: Python :: 3.12
|
|
28
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
29
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
32
30
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
33
31
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
34
32
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
35
|
-
Requires-Python:
|
|
33
|
+
Requires-Python: >=3.9.0
|
|
36
34
|
Description-Content-Type: text/x-rst
|
|
37
35
|
License-File: COPYING
|
|
38
|
-
Requires-Dist:
|
|
39
|
-
Requires-Dist: wcwidth
|
|
36
|
+
Requires-Dist: wcwidth>=0.4
|
|
40
37
|
Provides-Extra: curses
|
|
41
|
-
Requires-Dist: windows-curses
|
|
38
|
+
Requires-Dist: windows-curses; sys_platform == "win32" and extra == "curses"
|
|
42
39
|
Provides-Extra: glib
|
|
43
|
-
Requires-Dist: PyGObject
|
|
44
|
-
Provides-Extra: lcd
|
|
45
|
-
Requires-Dist: pyserial ; extra == 'lcd'
|
|
46
|
-
Provides-Extra: serial
|
|
47
|
-
Requires-Dist: pyserial ; extra == 'serial'
|
|
40
|
+
Requires-Dist: PyGObject; extra == "glib"
|
|
48
41
|
Provides-Extra: tornado
|
|
49
|
-
Requires-Dist: tornado
|
|
42
|
+
Requires-Dist: tornado>=5.0; extra == "tornado"
|
|
50
43
|
Provides-Extra: trio
|
|
51
|
-
Requires-Dist: trio
|
|
52
|
-
Requires-Dist: exceptiongroup
|
|
44
|
+
Requires-Dist: trio>=0.24.0; extra == "trio"
|
|
45
|
+
Requires-Dist: exceptiongroup; python_version < "3.11" and extra == "trio"
|
|
53
46
|
Provides-Extra: twisted
|
|
54
|
-
Requires-Dist: twisted
|
|
47
|
+
Requires-Dist: twisted; extra == "twisted"
|
|
55
48
|
Provides-Extra: zmq
|
|
56
|
-
Requires-Dist: zmq
|
|
49
|
+
Requires-Dist: zmq; extra == "zmq"
|
|
50
|
+
Provides-Extra: serial
|
|
51
|
+
Requires-Dist: pyserial; extra == "serial"
|
|
52
|
+
Provides-Extra: lcd
|
|
53
|
+
Requires-Dist: pyserial; extra == "lcd"
|
|
54
|
+
Dynamic: license-file
|
|
57
55
|
|
|
58
56
|
Urwid
|
|
59
57
|
=====
|
|
@@ -76,7 +74,7 @@ It includes many features useful for text console application developers includi
|
|
|
76
74
|
- Display modules include raw, curses, and experimental LCD and web displays
|
|
77
75
|
- Support for UTF-8, simple 8-bit and CJK encodings
|
|
78
76
|
- 24-bit (true color), 256 color, and 88 color mode support
|
|
79
|
-
- Compatible with Python 3.
|
|
77
|
+
- Compatible with Python 3.9+ and PyPy
|
|
80
78
|
|
|
81
79
|
Home Page:
|
|
82
80
|
http://urwid.org/
|
|
@@ -106,6 +104,8 @@ Alternatively if you are on Debian or Ubuntu
|
|
|
106
104
|
Windows support notes
|
|
107
105
|
=====================
|
|
108
106
|
|
|
107
|
+
Windows support is limited to the Windows 10+ due to ANSI support requirement.
|
|
108
|
+
|
|
109
109
|
* Not supported:
|
|
110
110
|
|
|
111
111
|
1. Terminal widget and all related render API (TermCanvas, TermCharset, TermModes, TermScroller)
|
|
@@ -142,12 +142,12 @@ To test code in all Python versions:
|
|
|
142
142
|
Supported Python versions
|
|
143
143
|
=========================
|
|
144
144
|
|
|
145
|
-
- 3.7
|
|
146
|
-
- 3.8
|
|
147
145
|
- 3.9
|
|
148
146
|
- 3.10
|
|
149
147
|
- 3.11
|
|
150
148
|
- 3.12
|
|
149
|
+
- 3.13
|
|
150
|
+
- 3.14
|
|
151
151
|
- pypy3
|
|
152
152
|
|
|
153
153
|
Authors
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
urwid/__init__.py,sha256=hpJEP1iuzHRRIdSpxS_dT-QeZtmTi_Wsy_7ptDfGhrQ,8423
|
|
2
|
+
urwid/canvas.py,sha256=W6gVxeuC2PiLo8U5suNPZ7BpamfC_Y_-1HU2_PKWGA0,46316
|
|
3
|
+
urwid/command_map.py,sha256=UUOC11O0SlNhMiBoYqNaSAfGcg0RmjjGEgz6Xt96iA4,4369
|
|
4
|
+
urwid/container.py,sha256=WOodISzyS4NSs3arijXuXLsDvF1GVIn4ufcPzfxSkdA,1594
|
|
5
|
+
urwid/decoration.py,sha256=dwoYY0tiZS4toGgrxEAALKeVvnoDV9W-LadkV9G4CZg,1777
|
|
6
|
+
urwid/font.py,sha256=8u3ntQ6ijnfxhMF7kwM5LKAAmgQYqE-pM9bsWmv7y2w,31882
|
|
7
|
+
urwid/graphics.py,sha256=pVGGU5kOWV56iXawDROgQWQwIbgaoh32JHE2COcGesQ,2481
|
|
8
|
+
urwid/numedit.py,sha256=wF5U2c_hOhD2Css-7-WBVvKtp3TpXwucOfvL_IPoLe0,13363
|
|
9
|
+
urwid/signals.py,sha256=GvpWeYkNK_xWvAJxUkddc5R9eCU9LtFNXO7jPZ8soeg,12925
|
|
10
|
+
urwid/split_repr.py,sha256=gtL1QBbQRY5rAfkLHfGznF0mu5Bx5QAQ5ncTZAqxYsk,3954
|
|
11
|
+
urwid/str_util.py,sha256=hIgc6vWGR4ucs1msZGI6hXjb28voC0ZSoUkowVa10go,13015
|
|
12
|
+
urwid/text_layout.py,sha256=d3Qx1XBl01Be0GEGoI6O9FQ5JSlskKFN8X3mZwkUT44,22795
|
|
13
|
+
urwid/util.py,sha256=bmBEblNfXwlklGesxhuLywe-FLGXZ8Azr9YZnrmTXG4,15337
|
|
14
|
+
urwid/version.py,sha256=_gKIfMQTTMv5Ihot0rROuF4g7Ko3dtcxxIbmQxKrBug,704
|
|
15
|
+
urwid/vterm.py,sha256=4LqmO0qf1YlEuReSRiWCc2qIdDZMBDu-s4kwUWAhsk8,57775
|
|
16
|
+
urwid/wimp.py,sha256=CRpUWYsrCSrnTX1AH7FnBI_8EvLHHy6eypg8-zno5MI,572
|
|
17
|
+
urwid/display/__init__.py,sha256=NX2D_wZ9YgtCcJ1HV_H-Q-tf01R3Fu4jBfwmUS0qn9o,2048
|
|
18
|
+
urwid/display/_posix_raw_display.py,sha256=PcrTvzCsOkxnNJaNPBCn9ETjETPCIv3SWHLDauyVyb0,15050
|
|
19
|
+
urwid/display/_raw_display_base.py,sha256=_TOwGxWNt-3XCfwh13_KJI5kP5XMFRxWMvk-3B7gzcI,33705
|
|
20
|
+
urwid/display/_web.css,sha256=6HarEsIspH2egt51HSrgI8Yl2lGi-DbziWOdS4RHNlk,359
|
|
21
|
+
urwid/display/_web.js,sha256=aWEOQ4EsADsiNgdw-zHEUMCRD2bnfR8M1mu4dOc2Tqk,12947
|
|
22
|
+
urwid/display/_win32.py,sha256=hD4hytElpfIv5qxGNTMSa2QeBNByqJDNVpmiiQSj6CM,5401
|
|
23
|
+
urwid/display/_win32_raw_display.py,sha256=VL6TiUId1bI5jszxAyqrso2XBnyVIWM_GWMKvV5kbOw,9176
|
|
24
|
+
urwid/display/common.py,sha256=LrgrgAHJxqizO9M0bjRcTQf4wF-lx5s5N8wzcGHtdzw,38607
|
|
25
|
+
urwid/display/curses.py,sha256=XNmIl8ah0zFHiXIo9daFpwGBxkvYz4DoyR9FokWTcNY,22728
|
|
26
|
+
urwid/display/escape.py,sha256=G8oImGhqW_Ye-woR8rxSMfqmX1D2nP2RugKKGLTbSHM,18190
|
|
27
|
+
urwid/display/html_fragment.py,sha256=lQRqr-hTrknQyZTtzPDp9zr-TWOT4NcuSsusS-LXIOU,8547
|
|
28
|
+
urwid/display/lcd.py,sha256=XwBmdtzegbSTk68VoaYloo4T5vgrs-vZBFOFjObp6oE,17604
|
|
29
|
+
urwid/display/raw.py,sha256=TSkIEM6KnQHPmmpBkWKdirZOwVXhSV67k7hWmuuR2OY,1125
|
|
30
|
+
urwid/display/web.py,sha256=13uzZm049YfmnNJtcWKuE-3jQNOU3wPoDc2G94QPRtg,19148
|
|
31
|
+
urwid/event_loop/__init__.py,sha256=6di4AYD6HbCf6v5p0rZOoteKnM9U5tfk4NKcWMH4FV4,1199
|
|
32
|
+
urwid/event_loop/abstract_loop.py,sha256=6Kkw3KCJ4ndiI2I1P8fPdtHzjuekRxUuvzFOiR0Myok,5494
|
|
33
|
+
urwid/event_loop/asyncio_loop.py,sha256=RS9OZjWaoMUEbNzoce8dGmyllkujNQi7GvVpIZAWv_M,9204
|
|
34
|
+
urwid/event_loop/glib_loop.py,sha256=GFoLAenoWKm-13rTBKzCF2JdCEryJKpMo25aidZ7BWs,9351
|
|
35
|
+
urwid/event_loop/main_loop.py,sha256=LCasuuzdBc0d7KE4qOvq8L4BZKJaiaJ5eVjFa05VI1k,25982
|
|
36
|
+
urwid/event_loop/select_loop.py,sha256=5ZkIPqyIVJdWRTC89Ca5h8ub_-jpqXjFZaKqiWhdkDg,7534
|
|
37
|
+
urwid/event_loop/tornado_loop.py,sha256=WBtDVy704GeVNtyvKSJa9SMWTwbZ-SOU4QB4MBGZOXo,7100
|
|
38
|
+
urwid/event_loop/trio_loop.py,sha256=bizthoPnwA7KUtB0jEWWJBma5p6vKlQ-eBZcuVjx5ag,10594
|
|
39
|
+
urwid/event_loop/twisted_loop.py,sha256=CtpWBzxNp_y7LHejnXIS67B-iboM3irb_MuI_FtXzc0,9219
|
|
40
|
+
urwid/event_loop/zmq_loop.py,sha256=YK_AkfLf8tayWrpCgQtKwWYuj-F1uMBluUJxPQLagNs,9114
|
|
41
|
+
urwid/widget/__init__.py,sha256=CbZjvN9hrE36hmSMo5URMEm2Da75kLv_q1X7N_NKOWM,4581
|
|
42
|
+
urwid/widget/attr_map.py,sha256=EZRLqhGeeyNysrjoiIh7W3lJItL-xm8JJCAEJhOzSWM,6205
|
|
43
|
+
urwid/widget/attr_wrap.py,sha256=v0Jern2jnmQUupnxf6GYflqabNGSA0S-n77pEBQixVA,4918
|
|
44
|
+
urwid/widget/bar_graph.py,sha256=uXC1_yBln7OvZ6Njaker_dNU6837cV0UMONcxOkkeoI,21518
|
|
45
|
+
urwid/widget/big_text.py,sha256=Xi30p2wgx76Ajb-_6dR3Rc5oIqJePiaNV22_R5AJVc4,2325
|
|
46
|
+
urwid/widget/box_adapter.py,sha256=IfNtjSoVGiNhtdsXHdLKY_uKBqPKA1NGasduREGnlRE,4335
|
|
47
|
+
urwid/widget/columns.py,sha256=PZF6yg5fpvVvjSfOTmfsfSTEn3TMDFNjjsfMmk7W148,45375
|
|
48
|
+
urwid/widget/constants.py,sha256=bNvw1OoT6jFWzDc_NDJRcle1uIX-ENswhvy2S6mIUEk,15313
|
|
49
|
+
urwid/widget/container.py,sha256=Cs1VycRfLfmPrvqO0xTdf4bxjJldvqXiWgGdAle2e3s,5841
|
|
50
|
+
urwid/widget/divider.py,sha256=onvR2AWr9Zp1xUNxn66fU9NKm7dmH3orHZY45eLk4Tw,3247
|
|
51
|
+
urwid/widget/edit.py,sha256=EEB9uYXOdsuNlh3xNt6FtAslk1OBB48o9OlC86WIilc,23553
|
|
52
|
+
urwid/widget/filler.py,sha256=F_Pwjne0P5A2uvAX2-SL6pBnoqIqAK_P-fss23HYhqs,14799
|
|
53
|
+
urwid/widget/frame.py,sha256=L2jPpc5Sey7xZ3h_m9sgMYgmQ53Q6rmT4HmkpfO84Hs,21494
|
|
54
|
+
urwid/widget/grid_flow.py,sha256=sAKZv9l-a9B-9vjjqq5Z8iuoCRC1MFyRrZzUOXqzA_o,18549
|
|
55
|
+
urwid/widget/line_box.py,sha256=eN0HztGZSSG9Gf29Lyn2fiByKkrmkG39JM7Wsgr-_xE,7551
|
|
56
|
+
urwid/widget/listbox.py,sha256=FMM8rGIa3w8PDYijiAwGatqEnVE5XeMZ4lZ4npIm1tk,73269
|
|
57
|
+
urwid/widget/monitored_list.py,sha256=UpoMpWqXw_NIryeNAGk_yF5t1k9p1lClbOR-NcrM2oU,19678
|
|
58
|
+
urwid/widget/overlay.py,sha256=A0ypqnCtOSR_axmE0zHiUZfonY1-aRMbTiymYulYQNc,33319
|
|
59
|
+
urwid/widget/padding.py,sha256=k9zoUOa6kVohxEzhbSAo8JLT7rx9V63kxpJ1jYJ0niA,19848
|
|
60
|
+
urwid/widget/pile.py,sha256=RubgdaaGcShT-w8tiXVpTTJY_xK8p83uyijv44BgejY,39705
|
|
61
|
+
urwid/widget/popup.py,sha256=waiQ9y7Ted2YWF5yT2Hz2I_KutvuFbeobemrdCsFdXA,5961
|
|
62
|
+
urwid/widget/progress_bar.py,sha256=YT3qiV9pUENLQSJC3HzsDdjNQ1QzYgGyT3WaWz42pMQ,4613
|
|
63
|
+
urwid/widget/scrollable.py,sha256=U7DoOIwr5CE4B-U0kM-9Pg0xpXawOahwJrdiTYQRilw,24451
|
|
64
|
+
urwid/widget/solid_fill.py,sha256=_mNy135irEnyPdghjbyt1cm3ial6u49zuGeDZN5GO2o,1262
|
|
65
|
+
urwid/widget/text.py,sha256=wW7Go7uEJTOvp5kpZeT9UsmNg9jrSCc5PQfAJ-vFvWQ,12789
|
|
66
|
+
urwid/widget/treetools.py,sha256=NehR7ELL2vvBHIlwtRCGyTfPLdx0Uis5opufC3xNkcE,17031
|
|
67
|
+
urwid/widget/widget.py,sha256=lpZFuEMz4yGWAsyc859qeU6_BPmQWGe4XmDV5lTPToo,26438
|
|
68
|
+
urwid/widget/widget_decoration.py,sha256=pfefCD2Cyyu9u2vuYs22Ph45dt0v_oYjQji2csfiyUI,4620
|
|
69
|
+
urwid/widget/wimp.py,sha256=_-gTLInG60SoeJn5FePJmIsv5Rm0HgURE5ryfXYD1Kc,27299
|
|
70
|
+
urwid-3.0.5.dist-info/licenses/COPYING,sha256=NrbT-keRaUP9X-wxPFhHhJRgR-wTN6eLRA5ZkstZX4k,26434
|
|
71
|
+
urwid-3.0.5.dist-info/METADATA,sha256=lRPKYW-3lPFW8stcEHSzz9LPdpBQCjvre12sy2JxJj0,11028
|
|
72
|
+
urwid-3.0.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
73
|
+
urwid-3.0.5.dist-info/top_level.txt,sha256=AwxQA43kNkjHbhYELXHBKrQ01X5CR2KnDzU07cVqilY,6
|
|
74
|
+
urwid-3.0.5.dist-info/RECORD,,
|