MaaFw 2.1.0__py3-none-manylinux2014_x86_64.whl → 5.4.0b1__py3-none-manylinux2014_x86_64.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.
maa/buffer.py CHANGED
@@ -9,21 +9,23 @@ from .library import Library
9
9
 
10
10
 
11
11
  class StringBuffer:
12
+ """字符串缓冲区 / String buffer
13
+
14
+ 用于在 Python 和 C API 之间传递字符串数据。
15
+ Used to pass string data between Python and C API.
16
+ """
17
+
12
18
  _handle: MaaStringBufferHandle
13
19
  _own: bool
14
20
 
15
21
  def __init__(self, handle: Optional[MaaStringBufferHandle] = None):
16
- if not Library.initialized:
17
- raise RuntimeError(
18
- "Library not initialized, please call `library.open()` first."
19
- )
20
22
  self._set_api_properties()
21
23
 
22
24
  if handle:
23
25
  self._handle = handle
24
26
  self._own = False
25
27
  else:
26
- self._handle = Library.framework.MaaStringBufferCreate()
28
+ self._handle = Library.framework().MaaStringBufferCreate()
27
29
  self._own = True
28
30
 
29
31
  if not self._handle:
@@ -31,26 +33,49 @@ class StringBuffer:
31
33
 
32
34
  def __del__(self):
33
35
  if self._handle and self._own:
34
- Library.framework.MaaStringBufferDestroy(self._handle)
36
+ Library.framework().MaaStringBufferDestroy(self._handle)
35
37
 
36
38
  def get(self) -> str:
37
- buff = Library.framework.MaaStringBufferGet(self._handle)
38
- sz = Library.framework.MaaStringBufferSize(self._handle)
39
+ """获取缓冲区内容 / Get buffer content
40
+
41
+ Returns:
42
+ str: 字符串内容 / String content
43
+ """
44
+ buff = Library.framework().MaaStringBufferGet(self._handle)
45
+ sz = Library.framework().MaaStringBufferSize(self._handle)
39
46
  return ctypes.string_at(buff, sz).decode()
40
47
 
41
48
  def set(self, value: Union[str, bytes]) -> bool:
49
+ """设置缓冲区内容 / Set buffer content
50
+
51
+ Args:
52
+ value: 字符串或字节数据 / String or bytes data
53
+
54
+ Returns:
55
+ bool: 是否成功 / Whether successful
56
+ """
42
57
  if isinstance(value, str):
43
58
  value = value.encode()
44
59
  return bool(
45
- Library.framework.MaaStringBufferSetEx(self._handle, value, len(value))
60
+ Library.framework().MaaStringBufferSetEx(self._handle, value, len(value))
46
61
  )
47
62
 
48
63
  @property
49
64
  def empty(self) -> bool:
50
- return bool(Library.framework.MaaStringBufferIsEmpty(self._handle))
65
+ """判断缓冲区是否为空 / Check if buffer is empty
66
+
67
+ Returns:
68
+ bool: 是否为空 / Whether empty
69
+ """
70
+ return bool(Library.framework().MaaStringBufferIsEmpty(self._handle))
51
71
 
52
72
  def clear(self) -> bool:
53
- return bool(Library.framework.MaaStringBufferClear(self._handle))
73
+ """清空缓冲区 / Clear buffer
74
+
75
+ Returns:
76
+ bool: 是否成功 / Whether successful
77
+ """
78
+ return bool(Library.framework().MaaStringBufferClear(self._handle))
54
79
 
55
80
  _api_properties_initialized: bool = False
56
81
 
@@ -60,32 +85,32 @@ class StringBuffer:
60
85
  return
61
86
  StringBuffer._api_properties_initialized = True
62
87
 
63
- Library.framework.MaaStringBufferCreate.restype = MaaStringBufferHandle
64
- Library.framework.MaaStringBufferCreate.argtypes = []
88
+ Library.framework().MaaStringBufferCreate.restype = MaaStringBufferHandle
89
+ Library.framework().MaaStringBufferCreate.argtypes = []
65
90
 
66
- Library.framework.MaaStringBufferDestroy.restype = None
67
- Library.framework.MaaStringBufferDestroy.argtypes = [MaaStringBufferHandle]
91
+ Library.framework().MaaStringBufferDestroy.restype = None
92
+ Library.framework().MaaStringBufferDestroy.argtypes = [MaaStringBufferHandle]
68
93
 
69
- Library.framework.MaaStringBufferIsEmpty.restype = MaaBool
70
- Library.framework.MaaStringBufferIsEmpty.argtypes = [MaaStringBufferHandle]
94
+ Library.framework().MaaStringBufferIsEmpty.restype = MaaBool
95
+ Library.framework().MaaStringBufferIsEmpty.argtypes = [MaaStringBufferHandle]
71
96
 
72
- Library.framework.MaaStringBufferClear.restype = MaaBool
73
- Library.framework.MaaStringBufferClear.argtypes = [MaaStringBufferHandle]
97
+ Library.framework().MaaStringBufferClear.restype = MaaBool
98
+ Library.framework().MaaStringBufferClear.argtypes = [MaaStringBufferHandle]
74
99
 
75
- Library.framework.MaaStringBufferGet.restype = ctypes.c_char_p
76
- Library.framework.MaaStringBufferGet.argtypes = [MaaStringBufferHandle]
100
+ Library.framework().MaaStringBufferGet.restype = ctypes.c_char_p
101
+ Library.framework().MaaStringBufferGet.argtypes = [MaaStringBufferHandle]
77
102
 
78
- Library.framework.MaaStringBufferSize.restype = MaaSize
79
- Library.framework.MaaStringBufferSize.argtypes = [MaaStringBufferHandle]
103
+ Library.framework().MaaStringBufferSize.restype = MaaSize
104
+ Library.framework().MaaStringBufferSize.argtypes = [MaaStringBufferHandle]
80
105
 
81
- Library.framework.MaaStringBufferSet.restype = MaaBool
82
- Library.framework.MaaStringBufferSet.argtypes = [
106
+ Library.framework().MaaStringBufferSet.restype = MaaBool
107
+ Library.framework().MaaStringBufferSet.argtypes = [
83
108
  MaaStringBufferHandle,
84
109
  ctypes.c_char_p,
85
110
  ]
86
111
 
87
- Library.framework.MaaStringBufferSetEx.restype = MaaBool
88
- Library.framework.MaaStringBufferSetEx.argtypes = [
112
+ Library.framework().MaaStringBufferSetEx.restype = MaaBool
113
+ Library.framework().MaaStringBufferSetEx.argtypes = [
89
114
  MaaStringBufferHandle,
90
115
  ctypes.c_char_p,
91
116
  MaaSize,
@@ -93,21 +118,23 @@ class StringBuffer:
93
118
 
94
119
 
95
120
  class StringListBuffer:
121
+ """字符串列表缓冲区 / String list buffer
122
+
123
+ 用于在 Python 和 C API 之间传递字符串列表数据。
124
+ Used to pass string list data between Python and C API.
125
+ """
126
+
96
127
  _handle: MaaStringListBufferHandle
97
128
  _own: bool
98
129
 
99
130
  def __init__(self, handle: Optional[MaaStringListBufferHandle] = None):
100
- if not Library.initialized:
101
- raise RuntimeError(
102
- "Library not initialized, please call `library.open()` first."
103
- )
104
131
  self._set_api_properties()
105
132
 
106
133
  if handle:
107
134
  self._handle = handle
108
135
  self._own = False
109
136
  else:
110
- self._handle = Library.framework.MaaStringListBufferCreate()
137
+ self._handle = Library.framework().MaaStringListBufferCreate()
111
138
  self._own = True
112
139
 
113
140
  if not self._handle:
@@ -115,40 +142,70 @@ class StringListBuffer:
115
142
 
116
143
  def __del__(self):
117
144
  if self._handle and self._own:
118
- Library.framework.MaaStringListBufferDestroy(self._handle)
145
+ Library.framework().MaaStringListBufferDestroy(self._handle)
119
146
 
120
147
  def get(self) -> List[str]:
121
- count = Library.framework.MaaStringListBufferSize(self._handle)
148
+ """获取字符串列表 / Get string list
149
+
150
+ Returns:
151
+ List[str]: 字符串列表 / String list
152
+ """
153
+ count = Library.framework().MaaStringListBufferSize(self._handle)
122
154
  result = []
123
155
  for i in range(count):
124
- buff = Library.framework.MaaStringListBufferAt(self._handle, i)
156
+ buff = Library.framework().MaaStringListBufferAt(self._handle, i)
125
157
  s = StringBuffer(buff).get()
126
158
  result.append(s)
127
159
  return result
128
160
 
129
161
  def set(self, value: List[str]) -> bool:
130
- Library.framework.MaaStringListBufferClear(self._handle)
162
+ """设置字符串列表 / Set string list
163
+
164
+ Args:
165
+ value: 字符串列表 / String list
166
+
167
+ Returns:
168
+ bool: 是否成功 / Whether successful
169
+ """
170
+ self.clear()
131
171
  for s in value:
132
- buff = StringBuffer()
133
- buff.set(s)
134
- if not Library.framework.MaaStringListBufferAppend(
135
- self._handle, buff._handle
136
- ):
172
+ if not self.append(s):
137
173
  return False
138
174
  return True
139
175
 
140
176
  def append(self, value: str) -> bool:
177
+ """追加字符串 / Append string
178
+
179
+ Args:
180
+ value: 要追加的字符串 / String to append
181
+
182
+ Returns:
183
+ bool: 是否成功 / Whether successful
184
+ """
141
185
  buff = StringBuffer()
142
186
  buff.set(value)
143
187
  return bool(
144
- Library.framework.MaaStringListBufferAppend(self._handle, buff._handle)
188
+ Library.framework().MaaStringListBufferAppend(self._handle, buff._handle)
145
189
  )
146
190
 
147
191
  def remove(self, index: int) -> bool:
148
- return bool(Library.framework.MaaStringListBufferRemove(self._handle, index))
192
+ """移除指定索引的字符串 / Remove string at index
193
+
194
+ Args:
195
+ index: 要移除的索引 / Index to remove
196
+
197
+ Returns:
198
+ bool: 是否成功 / Whether successful
199
+ """
200
+ return bool(Library.framework().MaaStringListBufferRemove(self._handle, index))
149
201
 
150
202
  def clear(self) -> bool:
151
- return bool(Library.framework.MaaStringListBufferClear(self._handle))
203
+ """清空列表 / Clear list
204
+
205
+ Returns:
206
+ bool: 是否成功 / Whether successful
207
+ """
208
+ return bool(Library.framework().MaaStringListBufferClear(self._handle))
152
209
 
153
210
  _api_properties_initialized: bool = False
154
211
 
@@ -158,63 +215,68 @@ class StringListBuffer:
158
215
  return
159
216
  StringListBuffer._api_properties_initialized = True
160
217
 
161
- Library.framework.MaaStringListBufferCreate.restype = MaaStringListBufferHandle
162
- Library.framework.MaaStringListBufferCreate.argtypes = []
218
+ Library.framework().MaaStringListBufferCreate.restype = (
219
+ MaaStringListBufferHandle
220
+ )
221
+ Library.framework().MaaStringListBufferCreate.argtypes = []
163
222
 
164
- Library.framework.MaaStringListBufferDestroy.restype = None
165
- Library.framework.MaaStringListBufferDestroy.argtypes = [
223
+ Library.framework().MaaStringListBufferDestroy.restype = None
224
+ Library.framework().MaaStringListBufferDestroy.argtypes = [
166
225
  MaaStringListBufferHandle
167
226
  ]
168
227
 
169
- Library.framework.MaaStringListBufferIsEmpty.restype = MaaBool
170
- Library.framework.MaaStringListBufferIsEmpty.argtypes = [
228
+ Library.framework().MaaStringListBufferIsEmpty.restype = MaaBool
229
+ Library.framework().MaaStringListBufferIsEmpty.argtypes = [
171
230
  MaaStringListBufferHandle
172
231
  ]
173
232
 
174
- Library.framework.MaaStringListBufferClear.restype = MaaBool
175
- Library.framework.MaaStringListBufferClear.argtypes = [
233
+ Library.framework().MaaStringListBufferClear.restype = MaaBool
234
+ Library.framework().MaaStringListBufferClear.argtypes = [
176
235
  MaaStringListBufferHandle
177
236
  ]
178
237
 
179
- Library.framework.MaaStringListBufferSize.restype = MaaSize
180
- Library.framework.MaaStringListBufferSize.argtypes = [MaaStringListBufferHandle]
238
+ Library.framework().MaaStringListBufferSize.restype = MaaSize
239
+ Library.framework().MaaStringListBufferSize.argtypes = [
240
+ MaaStringListBufferHandle
241
+ ]
181
242
 
182
- Library.framework.MaaStringListBufferSize.restype = MaaStringBufferHandle
183
- Library.framework.MaaStringListBufferSize.argtypes = [
243
+ Library.framework().MaaStringListBufferAt.restype = MaaStringBufferHandle
244
+ Library.framework().MaaStringListBufferAt.argtypes = [
184
245
  MaaStringListBufferHandle,
185
246
  MaaSize,
186
247
  ]
187
248
 
188
- Library.framework.MaaStringListBufferAppend.restype = MaaBool
189
- Library.framework.MaaStringListBufferAppend.argtypes = [
249
+ Library.framework().MaaStringListBufferAppend.restype = MaaBool
250
+ Library.framework().MaaStringListBufferAppend.argtypes = [
190
251
  MaaStringListBufferHandle,
191
252
  MaaStringBufferHandle,
192
253
  ]
193
254
 
194
- Library.framework.MaaStringListBufferRemove.restype = MaaBool
195
- Library.framework.MaaStringListBufferRemove.argtypes = [
255
+ Library.framework().MaaStringListBufferRemove.restype = MaaBool
256
+ Library.framework().MaaStringListBufferRemove.argtypes = [
196
257
  MaaStringListBufferHandle,
197
258
  MaaSize,
198
259
  ]
199
260
 
200
261
 
201
262
  class ImageBuffer:
263
+ """图像缓冲区 / Image buffer
264
+
265
+ 用于在 Python 和 C API 之间传递图像数据。图像格式为 BGR,与 OpenCV 兼容。
266
+ Used to pass image data between Python and C API. Image format is BGR, compatible with OpenCV.
267
+ """
268
+
202
269
  _handle: MaaImageBufferHandle
203
270
  _own: bool
204
271
 
205
272
  def __init__(self, c_handle: Optional[MaaImageBufferHandle] = None):
206
- if not Library.initialized:
207
- raise RuntimeError(
208
- "Library not initialized, please call `library.open()` first."
209
- )
210
-
211
273
  self._set_api_properties()
212
274
 
213
275
  if c_handle:
214
276
  self._handle = c_handle
215
277
  self._own = False
216
278
  else:
217
- self._handle = Library.framework.MaaImageBufferCreate()
279
+ self._handle = Library.framework().MaaImageBufferCreate()
218
280
  self._own = True
219
281
 
220
282
  if not self._handle:
@@ -222,16 +284,21 @@ class ImageBuffer:
222
284
 
223
285
  def __del__(self):
224
286
  if self._handle and self._own:
225
- Library.framework.MaaImageBufferDestroy(self._handle)
287
+ Library.framework().MaaImageBufferDestroy(self._handle)
226
288
 
227
289
  def get(self) -> numpy.ndarray:
228
- buff = Library.framework.MaaImageBufferGetRawData(self._handle)
290
+ """获取图像数据 / Get image data
291
+
292
+ Returns:
293
+ numpy.ndarray: BGR 格式图像,形状为 (height, width, channels) / BGR format image with shape (height, width, channels)
294
+ """
295
+ buff = Library.framework().MaaImageBufferGetRawData(self._handle)
229
296
  if not buff:
230
297
  return numpy.ndarray((0, 0, 3), dtype=numpy.uint8)
231
298
 
232
- w = Library.framework.MaaImageBufferWidth(self._handle)
233
- h = Library.framework.MaaImageBufferHeight(self._handle)
234
- c = Library.framework.MaaImageBufferChannels(self._handle)
299
+ w = Library.framework().MaaImageBufferWidth(self._handle)
300
+ h = Library.framework().MaaImageBufferHeight(self._handle)
301
+ c = Library.framework().MaaImageBufferChannels(self._handle)
235
302
  return copy.deepcopy(
236
303
  numpy.ctypeslib.as_array(
237
304
  ctypes.cast(buff, ctypes.POINTER(ctypes.c_uint8)), shape=(h, w, c)
@@ -239,11 +306,26 @@ class ImageBuffer:
239
306
  )
240
307
 
241
308
  def set(self, value: numpy.ndarray) -> bool:
309
+ """设置图像数据 / Set image data
310
+
311
+ Args:
312
+ value: BGR 格式图像,形状为 (height, width, channels) / BGR format image with shape (height, width, channels)
313
+
314
+ Returns:
315
+ bool: 是否成功 / Whether successful
316
+
317
+ Raises:
318
+ TypeError: 如果 value 不是 numpy.ndarray
319
+ """
242
320
  if not isinstance(value, numpy.ndarray):
243
321
  raise TypeError("value must be a numpy.ndarray")
244
322
 
323
+ # 确保数组是 C-contiguous 的,避免切片视图导致的内存不连续问题
324
+ if not value.flags['C_CONTIGUOUS']:
325
+ value = numpy.ascontiguousarray(value)
326
+
245
327
  return bool(
246
- Library.framework.MaaImageBufferSetRawData(
328
+ Library.framework().MaaImageBufferSetRawData(
247
329
  self._handle,
248
330
  value.ctypes.data,
249
331
  value.shape[1],
@@ -254,10 +336,20 @@ class ImageBuffer:
254
336
 
255
337
  @property
256
338
  def empty(self) -> bool:
257
- return bool(Library.framework.MaaImageBufferIsEmpty(self._handle))
339
+ """判断缓冲区是否为空 / Check if buffer is empty
340
+
341
+ Returns:
342
+ bool: 是否为空 / Whether empty
343
+ """
344
+ return bool(Library.framework().MaaImageBufferIsEmpty(self._handle))
258
345
 
259
346
  def clear(self) -> bool:
260
- return bool(Library.framework.MaaImageBufferClear(self._handle))
347
+ """清空缓冲区 / Clear buffer
348
+
349
+ Returns:
350
+ bool: 是否成功 / Whether successful
351
+ """
352
+ return bool(Library.framework().MaaImageBufferClear(self._handle))
261
353
 
262
354
  _api_properties_initialized: bool = False
263
355
 
@@ -267,29 +359,29 @@ class ImageBuffer:
267
359
  return
268
360
  ImageBuffer._api_properties_initialized = True
269
361
 
270
- Library.framework.MaaImageBufferCreate.restype = MaaImageBufferHandle
271
- Library.framework.MaaImageBufferCreate.argtypes = []
362
+ Library.framework().MaaImageBufferCreate.restype = MaaImageBufferHandle
363
+ Library.framework().MaaImageBufferCreate.argtypes = []
272
364
 
273
- Library.framework.MaaImageBufferDestroy.restype = None
274
- Library.framework.MaaImageBufferDestroy.argtypes = [MaaImageBufferHandle]
365
+ Library.framework().MaaImageBufferDestroy.restype = None
366
+ Library.framework().MaaImageBufferDestroy.argtypes = [MaaImageBufferHandle]
275
367
 
276
- Library.framework.MaaImageBufferGetRawData.restype = ctypes.c_void_p
277
- Library.framework.MaaImageBufferGetRawData.argtypes = [MaaImageBufferHandle]
368
+ Library.framework().MaaImageBufferGetRawData.restype = ctypes.c_void_p
369
+ Library.framework().MaaImageBufferGetRawData.argtypes = [MaaImageBufferHandle]
278
370
 
279
- Library.framework.MaaImageBufferWidth.restype = ctypes.c_int32
280
- Library.framework.MaaImageBufferWidth.argtypes = [MaaImageBufferHandle]
371
+ Library.framework().MaaImageBufferWidth.restype = ctypes.c_int32
372
+ Library.framework().MaaImageBufferWidth.argtypes = [MaaImageBufferHandle]
281
373
 
282
- Library.framework.MaaImageBufferHeight.restype = ctypes.c_int32
283
- Library.framework.MaaImageBufferHeight.argtypes = [MaaImageBufferHandle]
374
+ Library.framework().MaaImageBufferHeight.restype = ctypes.c_int32
375
+ Library.framework().MaaImageBufferHeight.argtypes = [MaaImageBufferHandle]
284
376
 
285
- Library.framework.MaaImageBufferChannels.restype = ctypes.c_int32
286
- Library.framework.MaaImageBufferChannels.argtypes = [MaaImageBufferHandle]
377
+ Library.framework().MaaImageBufferChannels.restype = ctypes.c_int32
378
+ Library.framework().MaaImageBufferChannels.argtypes = [MaaImageBufferHandle]
287
379
 
288
- Library.framework.MaaImageBufferType.restype = ctypes.c_int32
289
- Library.framework.MaaImageBufferType.argtypes = [MaaImageBufferHandle]
380
+ Library.framework().MaaImageBufferType.restype = ctypes.c_int32
381
+ Library.framework().MaaImageBufferType.argtypes = [MaaImageBufferHandle]
290
382
 
291
- Library.framework.MaaImageBufferSetRawData.restype = MaaBool
292
- Library.framework.MaaImageBufferSetRawData.argtypes = [
383
+ Library.framework().MaaImageBufferSetRawData.restype = MaaBool
384
+ Library.framework().MaaImageBufferSetRawData.argtypes = [
293
385
  MaaImageBufferHandle,
294
386
  ctypes.c_void_p,
295
387
  ctypes.c_int32,
@@ -297,29 +389,31 @@ class ImageBuffer:
297
389
  ctypes.c_int32,
298
390
  ]
299
391
 
300
- Library.framework.MaaImageBufferIsEmpty.restype = MaaBool
301
- Library.framework.MaaImageBufferIsEmpty.argtypes = [MaaImageBufferHandle]
392
+ Library.framework().MaaImageBufferIsEmpty.restype = MaaBool
393
+ Library.framework().MaaImageBufferIsEmpty.argtypes = [MaaImageBufferHandle]
302
394
 
303
- Library.framework.MaaImageBufferClear.restype = MaaBool
304
- Library.framework.MaaImageBufferClear.argtypes = [MaaImageBufferHandle]
395
+ Library.framework().MaaImageBufferClear.restype = MaaBool
396
+ Library.framework().MaaImageBufferClear.argtypes = [MaaImageBufferHandle]
305
397
 
306
398
 
307
399
  class ImageListBuffer:
400
+ """图像列表缓冲区 / Image list buffer
401
+
402
+ 用于在 Python 和 C API 之间传递图像列表数据。
403
+ Used to pass image list data between Python and C API.
404
+ """
405
+
308
406
  _handle: MaaImageListBufferHandle
309
407
  _own: bool
310
408
 
311
409
  def __init__(self, c_handle: Optional[MaaImageListBufferHandle] = None):
312
- if not Library.initialized:
313
- raise RuntimeError(
314
- "Library not initialized, please call `library.open()` first."
315
- )
316
410
  self._set_api_properties()
317
411
 
318
412
  if c_handle:
319
413
  self._handle = c_handle
320
414
  self._own = False
321
415
  else:
322
- self._handle = Library.framework.MaaImageListBufferCreate()
416
+ self._handle = Library.framework().MaaImageListBufferCreate()
323
417
  self._own = True
324
418
 
325
419
  if not self._handle:
@@ -327,40 +421,70 @@ class ImageListBuffer:
327
421
 
328
422
  def __del__(self):
329
423
  if self._handle and self._own:
330
- Library.framework.MaaImageListBufferDestroy(self._handle)
424
+ Library.framework().MaaImageListBufferDestroy(self._handle)
331
425
 
332
426
  def get(self) -> List[numpy.ndarray]:
333
- count = Library.framework.MaaImageListBufferSize(self._handle)
427
+ """获取图像列表 / Get image list
428
+
429
+ Returns:
430
+ List[numpy.ndarray]: 图像列表 / Image list
431
+ """
432
+ count = Library.framework().MaaImageListBufferSize(self._handle)
334
433
  result = []
335
434
  for i in range(count):
336
- buff = Library.framework.MaaImageListBufferAt(self._handle, i)
435
+ buff = Library.framework().MaaImageListBufferAt(self._handle, i)
337
436
  img = ImageBuffer(buff).get()
338
437
  result.append(img)
339
438
  return result
340
439
 
341
440
  def set(self, value: List[numpy.ndarray]) -> bool:
342
- Library.framework.MaaImageListBufferClear(self._handle)
441
+ """设置图像列表 / Set image list
442
+
443
+ Args:
444
+ value: 图像列表 / Image list
445
+
446
+ Returns:
447
+ bool: 是否成功 / Whether successful
448
+ """
449
+ self.clear()
343
450
  for img in value:
344
- buff = ImageBuffer()
345
- buff.set(img)
346
- if not Library.framework.MaaImageListBufferAppend(
347
- self._handle, buff._handle
348
- ):
451
+ if not self.append(img):
349
452
  return False
350
453
  return True
351
454
 
352
455
  def append(self, value: numpy.ndarray) -> bool:
456
+ """追加图像 / Append image
457
+
458
+ Args:
459
+ value: 要追加的图像 / Image to append
460
+
461
+ Returns:
462
+ bool: 是否成功 / Whether successful
463
+ """
353
464
  buff = ImageBuffer()
354
465
  buff.set(value)
355
466
  return bool(
356
- Library.framework.MaaImageListBufferAppend(self._handle, buff._handle)
467
+ Library.framework().MaaImageListBufferAppend(self._handle, buff._handle)
357
468
  )
358
469
 
359
470
  def remove(self, index: int) -> bool:
360
- return bool(Library.framework.MaaImageListBufferRemove(self._handle, index))
471
+ """移除指定索引的图像 / Remove image at index
472
+
473
+ Args:
474
+ index: 要移除的索引 / Index to remove
475
+
476
+ Returns:
477
+ bool: 是否成功 / Whether successful
478
+ """
479
+ return bool(Library.framework().MaaImageListBufferRemove(self._handle, index))
361
480
 
362
481
  def clear(self) -> bool:
363
- return bool(Library.framework.MaaImageListBufferClear(self._handle))
482
+ """清空列表 / Clear list
483
+
484
+ Returns:
485
+ bool: 是否成功 / Whether successful
486
+ """
487
+ return bool(Library.framework().MaaImageListBufferClear(self._handle))
364
488
 
365
489
  _api_properties_initialized: bool = False
366
490
 
@@ -370,61 +494,64 @@ class ImageListBuffer:
370
494
  return
371
495
  ImageListBuffer._api_properties_initialized = True
372
496
 
373
- Library.framework.MaaImageListBufferCreate.restype = MaaImageListBufferHandle
374
- Library.framework.MaaImageListBufferCreate.argtypes = []
497
+ Library.framework().MaaImageListBufferCreate.restype = MaaImageListBufferHandle
498
+ Library.framework().MaaImageListBufferCreate.argtypes = []
375
499
 
376
- Library.framework.MaaImageListBufferDestroy.restype = None
377
- Library.framework.MaaImageListBufferDestroy.argtypes = [
500
+ Library.framework().MaaImageListBufferDestroy.restype = None
501
+ Library.framework().MaaImageListBufferDestroy.argtypes = [
378
502
  MaaImageListBufferHandle
379
503
  ]
380
504
 
381
- Library.framework.MaaImageListBufferIsEmpty.restype = MaaBool
382
- Library.framework.MaaImageListBufferIsEmpty.argtypes = [
505
+ Library.framework().MaaImageListBufferIsEmpty.restype = MaaBool
506
+ Library.framework().MaaImageListBufferIsEmpty.argtypes = [
383
507
  MaaImageListBufferHandle
384
508
  ]
385
509
 
386
- Library.framework.MaaImageListBufferClear.restype = MaaBool
387
- Library.framework.MaaImageListBufferClear.argtypes = [MaaImageListBufferHandle]
510
+ Library.framework().MaaImageListBufferClear.restype = MaaBool
511
+ Library.framework().MaaImageListBufferClear.argtypes = [
512
+ MaaImageListBufferHandle
513
+ ]
388
514
 
389
- Library.framework.MaaImageListBufferSize.restype = MaaSize
390
- Library.framework.MaaImageListBufferSize.argtypes = [MaaImageListBufferHandle]
515
+ Library.framework().MaaImageListBufferSize.restype = MaaSize
516
+ Library.framework().MaaImageListBufferSize.argtypes = [MaaImageListBufferHandle]
391
517
 
392
- Library.framework.MaaImageListBufferAt.restype = MaaImageBufferHandle
393
- Library.framework.MaaImageListBufferAt.argtypes = [
518
+ Library.framework().MaaImageListBufferAt.restype = MaaImageBufferHandle
519
+ Library.framework().MaaImageListBufferAt.argtypes = [
394
520
  MaaImageListBufferHandle,
395
521
  MaaSize,
396
522
  ]
397
523
 
398
- Library.framework.MaaImageListBufferAppend.restype = MaaBool
399
- Library.framework.MaaImageListBufferAppend.argtypes = [
524
+ Library.framework().MaaImageListBufferAppend.restype = MaaBool
525
+ Library.framework().MaaImageListBufferAppend.argtypes = [
400
526
  MaaImageListBufferHandle,
401
527
  MaaImageBufferHandle,
402
528
  ]
403
529
 
404
- Library.framework.MaaImageListBufferRemove.restype = MaaBool
405
- Library.framework.MaaImageListBufferRemove.argtypes = [
530
+ Library.framework().MaaImageListBufferRemove.restype = MaaBool
531
+ Library.framework().MaaImageListBufferRemove.argtypes = [
406
532
  MaaImageListBufferHandle,
407
533
  MaaSize,
408
534
  ]
409
535
 
410
536
 
411
537
  class RectBuffer:
538
+ """矩形缓冲区 / Rectangle buffer
539
+
540
+ 用于在 Python 和 C API 之间传递矩形数据(x, y, width, height)。
541
+ Used to pass rectangle data (x, y, width, height) between Python and C API.
542
+ """
543
+
412
544
  _handle: MaaRectHandle
413
545
  _own: bool
414
546
 
415
547
  def __init__(self, c_handle: Optional[MaaRectHandle] = None):
416
- if not Library.initialized:
417
- raise RuntimeError(
418
- "Library not initialized, please call `library.open()` first."
419
- )
420
-
421
548
  self._set_api_properties()
422
549
 
423
550
  if c_handle:
424
551
  self._handle = c_handle
425
552
  self._own = False
426
553
  else:
427
- self._handle = Library.framework.MaaRectCreate()
554
+ self._handle = Library.framework().MaaRectCreate()
428
555
  self._own = True
429
556
 
430
557
  if not self._handle:
@@ -432,17 +559,34 @@ class RectBuffer:
432
559
 
433
560
  def __del__(self):
434
561
  if self._handle and self._own:
435
- Library.framework.MaaRectDestroy(self._handle)
562
+ Library.framework().MaaRectDestroy(self._handle)
436
563
 
437
564
  def get(self) -> Rect:
438
- x = Library.framework.MaaRectGetX(self._handle)
439
- y = Library.framework.MaaRectGetY(self._handle)
440
- w = Library.framework.MaaRectGetW(self._handle)
441
- h = Library.framework.MaaRectGetH(self._handle)
565
+ """获取矩形数据 / Get rectangle data
566
+
567
+ Returns:
568
+ Rect: 矩形对象 (x, y, width, height) / Rectangle object (x, y, width, height)
569
+ """
570
+ x = Library.framework().MaaRectGetX(self._handle)
571
+ y = Library.framework().MaaRectGetY(self._handle)
572
+ w = Library.framework().MaaRectGetW(self._handle)
573
+ h = Library.framework().MaaRectGetH(self._handle)
442
574
 
443
575
  return Rect(x, y, w, h)
444
576
 
445
577
  def set(self, value: RectType) -> bool:
578
+ """设置矩形数据 / Set rectangle data
579
+
580
+ Args:
581
+ value: 矩形数据,可以是 Rect、tuple、list 或 numpy.ndarray / Rectangle data, can be Rect, tuple, list, or numpy.ndarray
582
+
583
+ Returns:
584
+ bool: 是否成功 / Whether successful
585
+
586
+ Raises:
587
+ ValueError: 如果数据格式不正确
588
+ TypeError: 如果类型不支持
589
+ """
446
590
  if isinstance(value, numpy.ndarray):
447
591
  if value.ndim != 1:
448
592
  raise ValueError("value must be a 1D array")
@@ -460,7 +604,7 @@ class RectBuffer:
460
604
  raise TypeError("value must be a Rect, numpy.ndarray, tuple or list")
461
605
 
462
606
  return bool(
463
- Library.framework.MaaRectSet(
607
+ Library.framework().MaaRectSet(
464
608
  self._handle, value[0], value[1], value[2], value[3]
465
609
  )
466
610
  )
@@ -473,26 +617,26 @@ class RectBuffer:
473
617
  return
474
618
  RectBuffer._api_properties_initialized = True
475
619
 
476
- Library.framework.MaaRectCreate.restype = MaaRectHandle
477
- Library.framework.MaaRectCreate.argtypes = []
620
+ Library.framework().MaaRectCreate.restype = MaaRectHandle
621
+ Library.framework().MaaRectCreate.argtypes = []
478
622
 
479
- Library.framework.MaaRectDestroy.restype = None
480
- Library.framework.MaaRectDestroy.argtypes = [MaaRectHandle]
623
+ Library.framework().MaaRectDestroy.restype = None
624
+ Library.framework().MaaRectDestroy.argtypes = [MaaRectHandle]
481
625
 
482
- Library.framework.MaaRectGetX.restype = ctypes.c_int32
483
- Library.framework.MaaRectGetX.argtypes = [MaaRectHandle]
626
+ Library.framework().MaaRectGetX.restype = ctypes.c_int32
627
+ Library.framework().MaaRectGetX.argtypes = [MaaRectHandle]
484
628
 
485
- Library.framework.MaaRectGetY.restype = ctypes.c_int32
486
- Library.framework.MaaRectGetY.argtypes = [MaaRectHandle]
629
+ Library.framework().MaaRectGetY.restype = ctypes.c_int32
630
+ Library.framework().MaaRectGetY.argtypes = [MaaRectHandle]
487
631
 
488
- Library.framework.MaaRectGetW.restype = ctypes.c_int32
489
- Library.framework.MaaRectGetW.argtypes = [MaaRectHandle]
632
+ Library.framework().MaaRectGetW.restype = ctypes.c_int32
633
+ Library.framework().MaaRectGetW.argtypes = [MaaRectHandle]
490
634
 
491
- Library.framework.MaaRectGetH.restype = ctypes.c_int32
492
- Library.framework.MaaRectGetH.argtypes = [MaaRectHandle]
635
+ Library.framework().MaaRectGetH.restype = ctypes.c_int32
636
+ Library.framework().MaaRectGetH.argtypes = [MaaRectHandle]
493
637
 
494
- Library.framework.MaaRectSet.restype = MaaBool
495
- Library.framework.MaaRectSet.argtypes = [
638
+ Library.framework().MaaRectSet.restype = MaaBool
639
+ Library.framework().MaaRectSet.argtypes = [
496
640
  MaaRectHandle,
497
641
  ctypes.c_int32,
498
642
  ctypes.c_int32,