Skip to content

Commit 6bfdf41

Browse files
Merge pull request #13 from jinwandalaohu66/submission/script_mmvsfmza
2 parents 4efe09a + f2e976d commit 6bfdf41

2 files changed

Lines changed: 216 additions & 9 deletions

File tree

script_library/index.json

Lines changed: 72 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"format_version": 1,
3-
"data_version": 1,
4-
"updated": "2026-03-18T12:00:00Z",
3+
"data_version": 2,
4+
"updated": "2026-03-18T08:37:14.704Z",
55
"announcement": {
66
"text": "🎮 6款内置游戏已上线,快来体验!",
77
"text_en": "🎮 6 built-in games are now available!",
@@ -60,7 +60,11 @@
6060
"color": "#9B59B6"
6161
}
6262
],
63-
"featured": ["space_shooter", "neon_snake", "brick_breaker"],
63+
"featured": [
64+
"space_shooter",
65+
"neon_snake",
66+
"brick_breaker"
67+
],
6468
"scripts": [
6569
{
6670
"id": "brick_breaker",
@@ -75,7 +79,13 @@
7579
"file_type": "py",
7680
"author": "官方",
7781
"author_en": "Official",
78-
"tags": ["scene", "touch", "particle", "game", "brick"],
82+
"tags": [
83+
"scene",
84+
"touch",
85+
"particle",
86+
"game",
87+
"brick"
88+
],
7989
"requires": [],
8090
"min_app_version": "1.5.0",
8191
"added": "2026-03-18",
@@ -96,7 +106,13 @@
96106
"file_type": "py",
97107
"author": "官方",
98108
"author_en": "Official",
99-
"tags": ["scene", "touch", "particle", "game", "shooter"],
109+
"tags": [
110+
"scene",
111+
"touch",
112+
"particle",
113+
"game",
114+
"shooter"
115+
],
100116
"requires": [],
101117
"min_app_version": "1.5.0",
102118
"added": "2026-03-18",
@@ -117,7 +133,13 @@
117133
"file_type": "py",
118134
"author": "官方",
119135
"author_en": "Official",
120-
"tags": ["scene", "gravity", "accelerometer", "game", "maze"],
136+
"tags": [
137+
"scene",
138+
"gravity",
139+
"accelerometer",
140+
"game",
141+
"maze"
142+
],
121143
"requires": [],
122144
"min_app_version": "1.5.0",
123145
"added": "2026-03-18",
@@ -138,7 +160,13 @@
138160
"file_type": "py",
139161
"author": "官方",
140162
"author_en": "Official",
141-
"tags": ["scene", "touch", "game", "snake", "dpad"],
163+
"tags": [
164+
"scene",
165+
"touch",
166+
"game",
167+
"snake",
168+
"dpad"
169+
],
142170
"requires": [],
143171
"min_app_version": "1.5.0",
144172
"added": "2026-03-18",
@@ -159,7 +187,13 @@
159187
"file_type": "py",
160188
"author": "官方",
161189
"author_en": "Official",
162-
"tags": ["scene", "touch", "game", "jump", "endless"],
190+
"tags": [
191+
"scene",
192+
"touch",
193+
"game",
194+
"jump",
195+
"endless"
196+
],
163197
"requires": [],
164198
"min_app_version": "1.5.0",
165199
"added": "2026-03-18",
@@ -180,13 +214,42 @@
180214
"file_type": "py",
181215
"author": "官方",
182216
"author_en": "Official",
183-
"tags": ["scene", "touch", "game", "whack", "timer"],
217+
"tags": [
218+
"scene",
219+
"touch",
220+
"game",
221+
"whack",
222+
"timer"
223+
],
184224
"requires": [],
185225
"min_app_version": "1.5.0",
186226
"added": "2026-03-18",
187227
"updated": null,
188228
"status": "active",
189229
"lines": 427
230+
},
231+
{
232+
"id": "script_mmvsfmza",
233+
"name": "计算器",
234+
"name_en": "计算器",
235+
"desc": "计算器脚本iOS原生Ui",
236+
"desc_en": "计算器脚本iOS原生Ui",
237+
"category": "ui",
238+
"file": "scripts/ui/script_mmvsfmza.py",
239+
"thumbnail": null,
240+
"version": 1,
241+
"file_type": "py",
242+
"author": "今晚打老虎🐯",
243+
"author_en": "今晚打老虎🐯",
244+
"tags": [
245+
"community"
246+
],
247+
"requires": [],
248+
"min_app_version": "1.5.0",
249+
"added": "2026-03-18",
250+
"updated": null,
251+
"status": "active",
252+
"lines": 144
190253
}
191254
]
192255
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import ui
2+
import re
3+
4+
# 只允许安全的计算表达式
5+
_allowed_pattern = re.compile(r'^[0-9+\-*/().\s]+$')
6+
7+
def safe_eval(expr: str):
8+
expr = expr.strip()
9+
if not expr:
10+
return ''
11+
if not _allowed_pattern.match(expr):
12+
return 'Error'
13+
try:
14+
result = eval(expr, {"__builtins__": None}, {})
15+
if isinstance(result, float):
16+
return str(int(result)) if result.is_integer() else str(result)
17+
return str(result)
18+
except Exception:
19+
return 'Error'
20+
21+
22+
class SimpleCalculator(ui.View):
23+
def __init__(self, *args, **kwargs):
24+
# 模拟“正常用户”:给一个典型根尺寸 320x480
25+
super().__init__(frame=(0, 0, 320, 480), *args, **kwargs)
26+
27+
self.background_color = 'white'
28+
self.name = '计算器(测试UI居中)'
29+
self.expr = '0'
30+
31+
# 顶部显示区域 —— 占一点高度,不压得太高,也不太低
32+
self.display = ui.Label()
33+
self.display.frame = (16, 40, self.width - 32, 60)
34+
self.display.alignment = ui.ALIGN_RIGHT
35+
self.display.font = ('<System>', 32)
36+
self.display.text = '0'
37+
self.display.text_color = 'black'
38+
self.display.background_color = None
39+
self.add_subview(self.display)
40+
41+
# 按钮布局:整体放在中部偏下,但不是挤到最下面
42+
buttons = [
43+
['C', '+/-', '%', '/'],
44+
['7', '8', '9', '*'],
45+
['4', '5', '6', '-'],
46+
['1', '2', '3', '+'],
47+
['0', '', '.', '='],
48+
]
49+
50+
margin = 10
51+
btn_w = (self.width - margin * 5) / 4.0
52+
btn_h = 60
53+
# 比你之前的 140 再往上提一点,整体更居中
54+
start_y = 120
55+
56+
for row_index, row in enumerate(buttons):
57+
for col_index, title in enumerate(row):
58+
if title == '':
59+
continue
60+
61+
x = margin + col_index * (btn_w + margin)
62+
y = start_y + row_index * (btn_h + margin)
63+
64+
# 0 键双倍宽度
65+
if title == '0' and row_index == 4 and col_index == 0:
66+
width = btn_w * 2 + margin
67+
else:
68+
width = btn_w
69+
70+
btn = ui.Button(title=title)
71+
btn.frame = (x, y, width, btn_h)
72+
btn.font = ('<System>', 24)
73+
btn.corner_radius = 12
74+
75+
if title in ['C', '+/-', '%']:
76+
btn.background_color = '#a5a5a5'
77+
btn.tint_color = 'black'
78+
elif title in ['/', '*', '-', '+', '=']:
79+
btn.background_color = '#ff9f0a'
80+
btn.tint_color = 'white'
81+
else:
82+
btn.background_color = '#333333'
83+
btn.tint_color = 'white'
84+
85+
btn.action = self.button_tapped
86+
self.add_subview(btn)
87+
88+
# 更新显示
89+
def update_display(self):
90+
self.display.text = self.expr
91+
92+
# 按钮事件
93+
def button_tapped(self, sender):
94+
text = sender.title
95+
96+
if text == 'C':
97+
self.expr = '0'
98+
self.update_display()
99+
return
100+
101+
if text == '+/-':
102+
if self.expr.startswith('-'):
103+
self.expr = self.expr[1:]
104+
else:
105+
if self.expr != '0':
106+
self.expr = '-' + self.expr
107+
self.update_display()
108+
return
109+
110+
if text == '%':
111+
val = safe_eval(self.expr)
112+
if val not in ('Error', ''):
113+
try:
114+
num = float(val) / 100.0
115+
self.expr = str(int(num)) if num.is_integer() else str(num)
116+
except Exception:
117+
self.expr = 'Error'
118+
else:
119+
self.expr = 'Error'
120+
self.update_display()
121+
return
122+
123+
if text == '=':
124+
result = safe_eval(self.expr)
125+
self.expr = result if result != '' else '0'
126+
self.update_display()
127+
return
128+
129+
# 普通数字/符号输入
130+
if self.expr == '0' and text in '0123456789':
131+
self.expr = text
132+
else:
133+
self.expr += text
134+
135+
self.update_display()
136+
137+
138+
def main():
139+
v = SimpleCalculator()
140+
v.present('sheet')
141+
142+
143+
if __name__ == '__main__':
144+
main()

0 commit comments

Comments
 (0)