drawzero 0.5.4__tar.gz → 0.7.0__tar.gz

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.
Files changed (107) hide show
  1. {drawzero-0.5.4/src/drawzero.egg-info → drawzero-0.7.0}/PKG-INFO +15 -32
  2. {drawzero-0.5.4 → drawzero-0.7.0}/README.md +12 -29
  3. drawzero-0.7.0/docs/imgs/anim01.gif +0 -0
  4. drawzero-0.7.0/docs/imgs/grad01.png +0 -0
  5. drawzero-0.7.0/docs/imgs/grad02.png +0 -0
  6. drawzero-0.7.0/docs/imgs/grad03.png +0 -0
  7. drawzero-0.7.0/docs/imgs/input-controls.png +0 -0
  8. drawzero-0.7.0/docs/imgs/input-drawing.png +0 -0
  9. drawzero-0.7.0/docs/imgs/input-text-scroll.png +0 -0
  10. drawzero-0.7.0/docs/imgs/prim01.png +0 -0
  11. drawzero-0.7.0/docs/imgs/prim02.png +0 -0
  12. drawzero-0.7.0/docs/imgs/prim03.png +0 -0
  13. drawzero-0.7.0/docs/imgs/prim04.png +0 -0
  14. drawzero-0.7.0/docs/imgs/prim05.png +0 -0
  15. drawzero-0.7.0/docs/imgs/prim06.png +0 -0
  16. drawzero-0.7.0/docs/imgs/prim07.png +0 -0
  17. drawzero-0.7.0/docs/imgs/prim08.png +0 -0
  18. drawzero-0.7.0/docs/imgs/prim09.png +0 -0
  19. drawzero-0.7.0/docs/imgs/prim10.png +0 -0
  20. drawzero-0.7.0/docs/imgs/prim11.png +0 -0
  21. drawzero-0.7.0/docs/imgs/prim12.png +0 -0
  22. drawzero-0.7.0/docs/imgs/prim13.png +0 -0
  23. drawzero-0.7.0/docs/imgs/prim14.png +0 -0
  24. drawzero-0.7.0/docs/imgs/prim15.png +0 -0
  25. drawzero-0.7.0/docs/imgs/prim16.png +0 -0
  26. {drawzero-0.5.4 → drawzero-0.7.0}/pyproject.toml +3 -3
  27. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/__about__.py +1 -1
  28. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/__init__.py +2 -0
  29. drawzero-0.7.0/src/drawzero/examples/16_keyboard_and_mouse.py +26 -0
  30. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/17_mouse_tube.py +1 -1
  31. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/18_game_stars.py +9 -9
  32. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/19_game_colors.py +3 -1
  33. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/20_game_racing.py +4 -5
  34. drawzero-0.7.0/src/drawzero/examples/21_precise_drawing.py +28 -0
  35. drawzero-0.7.0/src/drawzero/examples/22_text_and_scroll.py +29 -0
  36. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/draw.py +7 -7
  37. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/i18n.py +6 -0
  38. drawzero-0.7.0/src/drawzero/utils/input.py +466 -0
  39. drawzero-0.7.0/src/drawzero/utils/input_pygame.py +44 -0
  40. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/key_flags.py +1 -12
  41. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/renderer.py +46 -30
  42. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/renderer_ejudge.py +20 -4
  43. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/screen_size.py +15 -0
  44. {drawzero-0.5.4 → drawzero-0.7.0/src/drawzero.egg-info}/PKG-INFO +15 -32
  45. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero.egg-info/SOURCES.txt +30 -0
  46. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero.egg-info/requires.txt +1 -2
  47. drawzero-0.7.0/tests/test_documentation.py +47 -0
  48. drawzero-0.7.0/tests/test_examples_gui_mode.py +21 -0
  49. drawzero-0.7.0/tests/test_examples_text_mode.py +16 -0
  50. drawzero-0.7.0/tests/test_input.py +366 -0
  51. drawzero-0.7.0/tests/test_input_legacy.py +276 -0
  52. drawzero-0.5.4/src/drawzero/examples/16_keyboard_and_mouse.py +0 -40
  53. drawzero-0.5.4/tests/test_examples_gui_mode.py +0 -95
  54. drawzero-0.5.4/tests/test_examples_text_mode.py +0 -91
  55. {drawzero-0.5.4 → drawzero-0.7.0}/LICENSE +0 -0
  56. {drawzero-0.5.4 → drawzero-0.7.0}/MANIFEST.in +0 -0
  57. {drawzero-0.5.4 → drawzero-0.7.0}/docs/hello_world.png +0 -0
  58. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_00.png +0 -0
  59. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_01.png +0 -0
  60. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_02.png +0 -0
  61. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_03.png +0 -0
  62. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_04.png +0 -0
  63. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_05.png +0 -0
  64. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_06.png +0 -0
  65. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_11.png +0 -0
  66. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_12.png +0 -0
  67. {drawzero-0.5.4 → drawzero-0.7.0}/docs/imgs/ex_13.png +0 -0
  68. {drawzero-0.5.4 → drawzero-0.7.0}/docs/keyboard_and_mouse_events.gif +0 -0
  69. {drawzero-0.5.4 → drawzero-0.7.0}/docs/planet_animation.gif +0 -0
  70. {drawzero-0.5.4 → drawzero-0.7.0}/docs/transparent.png +0 -0
  71. {drawzero-0.5.4 → drawzero-0.7.0}/setup.cfg +0 -0
  72. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/__main__.py +0 -0
  73. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/00_hello_world.py +0 -0
  74. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/01_grid_and_coordinates.py +0 -0
  75. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/02_loops_and_rgb_colors.py +0 -0
  76. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/03_simple_objects.py +0 -0
  77. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/04_loops_sin_plot.py +0 -0
  78. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/05_points.py +0 -0
  79. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/06_turtle_style.py +0 -0
  80. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/07_animation_circles.py +0 -0
  81. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/08_animation_traffic_light.py +0 -0
  82. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/09_animation_rectangles.py +0 -0
  83. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/10_animation_planets.py +0 -0
  84. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/11_transparency_and_line_width.py +0 -0
  85. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/12_images.py +0 -0
  86. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/13_gradients.py +0 -0
  87. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/14_animation_close_vertex.py +0 -0
  88. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/15_animation_firework.py +0 -0
  89. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/99_errors.py +0 -0
  90. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/__init__.py +0 -0
  91. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/examples/cat.png +0 -0
  92. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/__init__.py +0 -0
  93. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/colors.py +0 -0
  94. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/converters.py +0 -0
  95. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/copy_examples.py +0 -0
  96. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/errors.py +0 -0
  97. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/gradient.py +0 -0
  98. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero/utils/pt.py +0 -0
  99. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero.egg-info/dependency_links.txt +0 -0
  100. {drawzero-0.5.4 → drawzero-0.7.0}/src/drawzero.egg-info/top_level.txt +0 -0
  101. {drawzero-0.5.4 → drawzero-0.7.0}/tests/test_converters.py +0 -0
  102. {drawzero-0.5.4 → drawzero-0.7.0}/tests/test_copy_examples.py +0 -0
  103. {drawzero-0.5.4 → drawzero-0.7.0}/tests/test_errors.py +0 -0
  104. {drawzero-0.5.4 → drawzero-0.7.0}/tests/test_gradient.py +0 -0
  105. {drawzero-0.5.4 → drawzero-0.7.0}/tests/test_i18n.py +0 -0
  106. {drawzero-0.5.4 → drawzero-0.7.0}/tests/test_pt.py +0 -0
  107. {drawzero-0.5.4 → drawzero-0.7.0}/tests/test_renderer_ejudge.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drawzero
3
- Version: 0.5.4
3
+ Version: 0.7.0
4
4
  Summary: A zero-boilerplate canvas drawing framework for Python 3, based on Pygame.
5
5
  Author-email: Sergey Shashkov <sh57@yandex.ru>
6
6
  License: MIT
@@ -23,12 +23,12 @@ Classifier: Programming Language :: Python :: 3.10
23
23
  Classifier: Programming Language :: Python :: 3.11
24
24
  Classifier: Programming Language :: Python :: 3.12
25
25
  Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: 3.14
26
27
  Classifier: Programming Language :: Python :: Implementation :: CPython
27
28
  Requires-Python: >=3.8
28
29
  Description-Content-Type: text/markdown
29
30
  License-File: LICENSE
30
- Requires-Dist: mkdocs-static-i18n[material]>=1.3.0
31
- Requires-Dist: pygame>=2.0.1
31
+ Requires-Dist: pygame-ce>=2.0.1
32
32
  Provides-Extra: dev
33
33
  Requires-Dist: setuptools; extra == "dev"
34
34
  Requires-Dist: build; extra == "dev"
@@ -263,40 +263,23 @@ text(C.white, 'scale3 = Gradient([C.white, C.black, C.red, C.black, C.white], 20
263
263
 
264
264
  # Keyboard and mouse events
265
265
 
266
- Process keyboard events in two ways: check if key is pressed via `get_keys_pressed()` or run throw `keysdown` or `keysup` events:
266
+ Use `keyboard`, `mouse`, and ordered `events()` snapshots prepared by `tick()`.
267
+ See the complete [English input guide](https://drawzero.org/keyboard_and_mouse_input/)
268
+ and [Russian input guide](https://drawzero.org/ru/keyboard_and_mouse_input/).
267
269
 
268
- ``` python
270
+ ```python
269
271
  from drawzero import *
270
272
 
271
- upper_text = 'Typed: '
272
- SIZE = 20
273
- x = y = 500 - SIZE // 2
274
-
273
+ x = y = 500
275
274
  while True:
276
- # Mouse buttons events
277
- if mousebuttonsdown:
278
- x, y = mousebuttonsdown[0].pos
279
- # Keys which are still pressed
280
- keys = get_keys_pressed()
281
- if keys[K.UP] or keys[K.w]:
282
- y -= 5
283
- if keys[K.DOWN] or keys[K.s]:
284
- y += 5
285
- if keys[K.LEFT] or keys[K.a]:
286
- x -= 5
287
- if keys[K.RIGHT] or keys[K.d]:
288
- x += 5
289
- # Keyboard events
290
- for ev in keysdown:
291
- if ev.unicode:
292
- upper_text += ev.unicode
293
-
294
- # Redraw everything
275
+ x += 4 * keyboard.axis(('left', 'a'), ('right', 'd'))
276
+ y += 4 * keyboard.axis(('up', 'w'), ('down', 's'))
277
+ if keyboard.just_pressed('space'):
278
+ x = y = 500
295
279
  clear()
296
- filled_rect(C.red, x, y, SIZE, SIZE)
297
- text(C.white, upper_text, (100, 5))
298
- filled_circle(C.yellow, mouse_pos(), 3)
299
- tick()
280
+ filled_circle(C.red, (x, y), 20)
281
+ filled_circle(C.yellow, mouse.pos, 3)
282
+ tick(fps=60)
300
283
  ```
301
284
 
302
285
  <img alt="keyboard_and_mouse_events.gif" src="https://raw.githubusercontent.com/ShashkovS/drawzero/master/docs/keyboard_and_mouse_events.gif" width="50%">
@@ -219,40 +219,23 @@ text(C.white, 'scale3 = Gradient([C.white, C.black, C.red, C.black, C.white], 20
219
219
 
220
220
  # Keyboard and mouse events
221
221
 
222
- Process keyboard events in two ways: check if key is pressed via `get_keys_pressed()` or run throw `keysdown` or `keysup` events:
222
+ Use `keyboard`, `mouse`, and ordered `events()` snapshots prepared by `tick()`.
223
+ See the complete [English input guide](https://drawzero.org/keyboard_and_mouse_input/)
224
+ and [Russian input guide](https://drawzero.org/ru/keyboard_and_mouse_input/).
223
225
 
224
- ``` python
226
+ ```python
225
227
  from drawzero import *
226
228
 
227
- upper_text = 'Typed: '
228
- SIZE = 20
229
- x = y = 500 - SIZE // 2
230
-
229
+ x = y = 500
231
230
  while True:
232
- # Mouse buttons events
233
- if mousebuttonsdown:
234
- x, y = mousebuttonsdown[0].pos
235
- # Keys which are still pressed
236
- keys = get_keys_pressed()
237
- if keys[K.UP] or keys[K.w]:
238
- y -= 5
239
- if keys[K.DOWN] or keys[K.s]:
240
- y += 5
241
- if keys[K.LEFT] or keys[K.a]:
242
- x -= 5
243
- if keys[K.RIGHT] or keys[K.d]:
244
- x += 5
245
- # Keyboard events
246
- for ev in keysdown:
247
- if ev.unicode:
248
- upper_text += ev.unicode
249
-
250
- # Redraw everything
231
+ x += 4 * keyboard.axis(('left', 'a'), ('right', 'd'))
232
+ y += 4 * keyboard.axis(('up', 'w'), ('down', 's'))
233
+ if keyboard.just_pressed('space'):
234
+ x = y = 500
251
235
  clear()
252
- filled_rect(C.red, x, y, SIZE, SIZE)
253
- text(C.white, upper_text, (100, 5))
254
- filled_circle(C.yellow, mouse_pos(), 3)
255
- tick()
236
+ filled_circle(C.red, (x, y), 20)
237
+ filled_circle(C.yellow, mouse.pos, 3)
238
+ tick(fps=60)
256
239
  ```
257
240
 
258
241
  <img alt="keyboard_and_mouse_events.gif" src="https://raw.githubusercontent.com/ShashkovS/drawzero/master/docs/keyboard_and_mouse_events.gif" width="50%">
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "drawzero"
7
- version = "0.5.4"
7
+ version = "0.7.0"
8
8
  authors = [
9
9
  { name="Sergey Shashkov", email="sh57@yandex.ru" },
10
10
  ]
@@ -30,11 +30,11 @@ classifiers = [
30
30
  "Programming Language :: Python :: 3.11",
31
31
  "Programming Language :: Python :: 3.12",
32
32
  "Programming Language :: Python :: 3.13",
33
+ "Programming Language :: Python :: 3.14",
33
34
  "Programming Language :: Python :: Implementation :: CPython",
34
35
  ]
35
36
  dependencies = [
36
- "mkdocs-static-i18n[material]>=1.3.0",
37
- "pygame>=2.0.1",
37
+ "pygame-ce>=2.0.1",
38
38
  ]
39
39
 
40
40
  [project.urls]
@@ -5,7 +5,7 @@ __all__ = [
5
5
  "__copyright__",
6
6
  ]
7
7
 
8
- __version__ = '0.5.4'
8
+ __version__ = '0.7.0'
9
9
  __author__ = "Sergey Shashkov"
10
10
  __license__ = "MIT"
11
11
  __copyright__ = "Copyright 2020- Sergey Shashkov"
@@ -5,6 +5,7 @@ A zero-boilerplate canvas drawing framework for Python 3, based on Pygame.
5
5
  """
6
6
 
7
7
  from .utils.draw import *
8
+ from .utils.input import keyboard, mouse, events, M, MOD, E
8
9
  from .utils.pt import Pt
9
10
  from .utils.gradient import Gradient
10
11
  from .utils.copy_examples import copy_examples
@@ -15,6 +16,7 @@ from .utils.colors import C, COLORS, THECOLORS, ALL_COLORS
15
16
  from .__about__ import __author__, __copyright__, __version__
16
17
 
17
18
  __all__ = [
19
+ 'keyboard', 'mouse', 'events', 'M', 'MOD', 'E',
18
20
  # spec
19
21
  '__author__', '__copyright__', '__version__',
20
22
  #
@@ -0,0 +1,26 @@
1
+ from drawzero import *
2
+
3
+ x = y = 500
4
+ color = C.red
5
+ presses = 0
6
+ while True:
7
+ speed = 12 if keyboard.pressed('shift') else 4
8
+ dx = keyboard.axis(('left', 'a'), ('right', 'd'))
9
+ dy = keyboard.axis(('up', 'w'), ('down', 's'))
10
+ x += speed * dx
11
+ y += speed * dy
12
+ if keyboard.just_pressed('space'):
13
+ presses += 1
14
+ color = C.blue if color == C.red else C.red
15
+ for event in events():
16
+ if event.type == E.MOUSE_DOWN and event.button == M.LEFT:
17
+ x, y = event.pos
18
+ clear()
19
+ text(C.white, 'CONTROLS / STATE', (500, 70), 48)
20
+ text(C.white, 'Arrows or WASD move; Shift speeds up', (500, 150), 32)
21
+ text(C.white, 'Space changes color once; click places the square', (500, 205), 30)
22
+ text(C.cyan, f'Axis: ({dx}, {dy}) Shift: {keyboard.pressed("shift")}', (500, 300), 36)
23
+ text(C.yellow, f'Space presses: {presses}', (500, 360), 36)
24
+ filled_rect(color, (x, y), 35, 35)
25
+ filled_circle(C.yellow, mouse.pos, 6)
26
+ tick(fps=60)
@@ -4,7 +4,7 @@ circles = []
4
4
  tick()
5
5
  scale = Gradient([C.gray10, C.blue, C.orange], 100, 500)
6
6
  while True:
7
- x, y = mouse_pos()
7
+ x, y = mouse.pos
8
8
  circles.append([x, y, 100])
9
9
  clear()
10
10
  for i in range(len(circles) - 1, -1, -1):
@@ -63,20 +63,20 @@ def draw_stars(stars):
63
63
  text('white', 'Press WASD or QE to move', (500, 5), 48, '.^')
64
64
 
65
65
 
66
- def process_keys(pressed_keys, speed):
66
+ def process_keys(speed):
67
67
  '''Обрабатываем нажатия клавиш
68
68
  Используем WASD для вверх/вниз/влево/вправо и QE для вперёд/назад'''
69
- if pressed_keys[K.UP] or pressed_keys[K.w]:
69
+ if keyboard.pressed(K.UP) or keyboard.pressed(K.w):
70
70
  speed[2] += 100
71
- if pressed_keys[K.DOWN] or pressed_keys[K.s]:
71
+ if keyboard.pressed(K.DOWN) or keyboard.pressed(K.s):
72
72
  speed[2] -= 100
73
- if pressed_keys[K.LEFT] or pressed_keys[K.a]:
73
+ if keyboard.pressed(K.LEFT) or keyboard.pressed(K.a):
74
74
  speed[0] += 100
75
- if pressed_keys[K.RIGHT] or pressed_keys[K.d]:
75
+ if keyboard.pressed(K.RIGHT) or keyboard.pressed(K.d):
76
76
  speed[0] -= 100
77
- if pressed_keys[K.q]:
77
+ if keyboard.pressed(K.q):
78
78
  speed[1] -= 1
79
- if pressed_keys[K.e]:
79
+ if keyboard.pressed(K.e):
80
80
  speed[1] += 1
81
81
 
82
82
 
@@ -88,10 +88,10 @@ while True:
88
88
  # Заливаем всё чёрным
89
89
  fill((0, 0, 0))
90
90
  # Обрабатываем нажатия клавиш
91
- process_keys(get_keys_pressed(), speed)
91
+ process_keys(speed)
92
92
  # Двигаем звёзды
93
93
  move_stars(stars, speed)
94
94
  # Рисуем звёзды
95
95
  draw_stars(stars)
96
- # Ждём 1/60 секунды
96
+ # Ждём 1/30 секунды
97
97
  tick()
@@ -43,7 +43,9 @@ while True:
43
43
  elif cur_status == 3:
44
44
  text('red', 'Mismatch?', (500, 800), 48)
45
45
  # Ignore clicks for half a second after color change
46
- for ev in mousebuttonsdown:
46
+ for ev in mouse.events:
47
+ if ev.type != E.MOUSE_DOWN:
48
+ continue
47
49
  if cur_ts - last_status_ts > 0.3:
48
50
  if ev.button == cur_status:
49
51
  # User confirmed
@@ -21,15 +21,14 @@ for i in 3, 2, 1:
21
21
  sleep(1)
22
22
 
23
23
  while True:
24
- keys = get_keys_pressed()
25
24
  for i in range(len(cars_y)):
26
- if keys[ups[i]]:
25
+ if keyboard.pressed(ups[i]):
27
26
  cars_y[i] -= 5
28
- if keys[downs[i]]:
27
+ if keyboard.pressed(downs[i]):
29
28
  cars_y[i] += 5
30
- if keys[lefts[i]]:
29
+ if keyboard.pressed(lefts[i]):
31
30
  cars_x[i] -= 5
32
- if keys[rights[i]]:
31
+ if keyboard.pressed(rights[i]):
33
32
  cars_x[i] += 5
34
33
  clear()
35
34
  for i in range(len(cars_y)):
@@ -0,0 +1,28 @@
1
+ from drawzero import *
2
+
3
+ segments = []
4
+ previous = None
5
+ while True:
6
+ for event in events():
7
+ if event.type == E.FOCUS_LOST:
8
+ previous = None
9
+ elif event.type == E.MOUSE_DOWN and event.button == M.LEFT:
10
+ previous = event.pos
11
+ elif event.type == E.MOUSE_MOVE:
12
+ if previous is not None and M.LEFT in event.buttons:
13
+ segments.append((previous, event.pos))
14
+ previous = event.pos
15
+ elif event.type == E.MOUSE_UP and event.button == M.LEFT:
16
+ if previous is not None and not event.source.cancelled:
17
+ segments.append((previous, event.pos))
18
+ previous = None
19
+ if keyboard.just_pressed('space'):
20
+ segments.clear()
21
+ clear()
22
+ text(C.white, 'PRECISE DRAWING', (500, 70), 48)
23
+ text(C.white, 'Hold left mouse button to draw; Space clears', (500, 150), 32)
24
+ for start, end in segments:
25
+ line(C.cyan, start, end, line_width=6)
26
+ filled_circle(C.yellow, mouse.pos, 8)
27
+ text(C.gray, f'Path segments: {len(segments)}', (500, 900), 32)
28
+ tick(fps=60)
@@ -0,0 +1,29 @@
1
+ from drawzero import *
2
+
3
+ value = ''
4
+ scroll_x = scroll_y = 0
5
+ composition = ''
6
+ while True:
7
+ for event in events():
8
+ if event.type == E.TEXT_INPUT:
9
+ value += event.text
10
+ composition = ''
11
+ elif event.type == E.TEXT_EDITING:
12
+ composition = event.text
13
+ elif event.type == E.KEY_DOWN and event.key == K.BACKSPACE:
14
+ value = value[:-1]
15
+ elif event.type == E.FOCUS_LOST:
16
+ composition = ''
17
+ dx, dy = mouse.wheel
18
+ scroll_x += dx
19
+ scroll_y += dy
20
+ clear()
21
+ text(C.white, 'TEXT / TWO-DIMENSIONAL SCROLL', (500, 70), 40)
22
+ text(C.white, 'Type text; Backspace deletes; scroll moves the marker', (500, 150), 28)
23
+ text(C.cyan, value, (80, 300), 48, '<.')
24
+ text(C.gray, composition, (80, 370), 36, '<.')
25
+ text(C.yellow, f'Scroll: ({scroll_x:.1f}, {scroll_y:.1f})', (500, 480), 36)
26
+ line(C.gray, (200, 720), (800, 720))
27
+ line(C.gray, (500, 570), (500, 870))
28
+ filled_circle(C.orange, (500 + 30 * scroll_x, 720 - 30 * scroll_y), 22)
29
+ tick(fps=60)
@@ -348,13 +348,13 @@ def _update_events_coordinates():
348
348
  ev.rel = (from_canvas_x(x), from_canvas_y(y))
349
349
 
350
350
 
351
- def tick(r=1):
352
- """Sleep for 1/30 of a second.
353
- If tick functions is called in a loop, then sleep time is reduced so
354
- takes 1/30 second between calls. For example if calculations between tick() calls take 1/60s,
355
- then tick sleeps for 1/60s. So while calculations takes less then 1/30s tick()
356
- we get 30 frames per second."""
357
- renderer.draw_tick(r)
351
+ def tick(r=1, *, fps=30):
352
+ """Present drawing and publish one input frame after r polls.
353
+
354
+ fps limits each poll interval (30 by default; zero is uncapped).
355
+ Positional r remains a poll count, not a frame rate.
356
+ """
357
+ renderer.draw_tick(r, fps=fps)
358
358
  _update_events_coordinates()
359
359
 
360
360
 
@@ -160,6 +160,12 @@ class I18N:
160
160
  'en': 'Incorrect number of points for the input data: there should be either 2, or exactly as many as there are colors, that is, {}.',
161
161
  }
162
162
 
163
+ input_invalid = {'en': 'Invalid key or mouse button: {!r}.', 'ru': 'Некорректная клавиша или кнопка мыши: {!r}.'}
164
+ input_suggestion = {'en': ' Did you mean {!r}?', 'ru': ' Возможно, вы имели в виду {!r}?'}
165
+ input_mask = {'en': 'MOD is a modifier mask; query a key or "ctrl", "shift", "alt", "meta".', 'ru': 'MOD — маска модификаторов; укажите клавишу или "ctrl", "shift", "alt", "meta".'}
166
+ input_group = {'en': 'An axis group must be a nonempty flat tuple/list of keys.', 'ru': 'Группа оси должна быть непустым плоским кортежем/списком клавиш.'}
167
+ input_fps = {'en': 'fps must be a finite nonnegative number.', 'ru': 'fps должен быть конечным неотрицательным числом.'}
168
+
163
169
  @classmethod
164
170
  def set_lang(cls, lang):
165
171
  if lang not in _known_languages: