Skip to content

Commit ea7b55b

Browse files
Merge pull request #14 from jinwandalaohu66/submission/script_mmw6k09q
2 parents e0f0c33 + ed45ded commit ea7b55b

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-18T15:12:33.180Z",
55
"announcement": null,
66
"categories": [
77
{
@@ -55,7 +55,11 @@
5555
"color": "#9B59B6"
5656
}
5757
],
58-
"featured": ["space_shooter", "neon_snake", "brick_breaker"],
58+
"featured": [
59+
"space_shooter",
60+
"neon_snake",
61+
"brick_breaker"
62+
],
5963
"scripts": [
6064
{
6165
"id": "brick_breaker",
@@ -70,7 +74,13 @@
7074
"file_type": "py",
7175
"author": "官方",
7276
"author_en": "Official",
73-
"tags": ["scene", "touch", "particle", "game", "brick"],
77+
"tags": [
78+
"scene",
79+
"touch",
80+
"particle",
81+
"game",
82+
"brick"
83+
],
7484
"requires": [],
7585
"min_app_version": "1.5.0",
7686
"added": "2026-03-18",
@@ -91,7 +101,13 @@
91101
"file_type": "py",
92102
"author": "官方",
93103
"author_en": "Official",
94-
"tags": ["scene", "touch", "particle", "game", "shooter"],
104+
"tags": [
105+
"scene",
106+
"touch",
107+
"particle",
108+
"game",
109+
"shooter"
110+
],
95111
"requires": [],
96112
"min_app_version": "1.5.0",
97113
"added": "2026-03-18",
@@ -112,7 +128,13 @@
112128
"file_type": "py",
113129
"author": "官方",
114130
"author_en": "Official",
115-
"tags": ["scene", "gravity", "accelerometer", "game", "maze"],
131+
"tags": [
132+
"scene",
133+
"gravity",
134+
"accelerometer",
135+
"game",
136+
"maze"
137+
],
116138
"requires": [],
117139
"min_app_version": "1.5.0",
118140
"added": "2026-03-18",
@@ -133,7 +155,13 @@
133155
"file_type": "py",
134156
"author": "官方",
135157
"author_en": "Official",
136-
"tags": ["scene", "touch", "game", "snake", "dpad"],
158+
"tags": [
159+
"scene",
160+
"touch",
161+
"game",
162+
"snake",
163+
"dpad"
164+
],
137165
"requires": [],
138166
"min_app_version": "1.5.0",
139167
"added": "2026-03-18",
@@ -154,7 +182,13 @@
154182
"file_type": "py",
155183
"author": "官方",
156184
"author_en": "Official",
157-
"tags": ["scene", "touch", "game", "jump", "endless"],
185+
"tags": [
186+
"scene",
187+
"touch",
188+
"game",
189+
"jump",
190+
"endless"
191+
],
158192
"requires": [],
159193
"min_app_version": "1.5.0",
160194
"added": "2026-03-18",
@@ -175,13 +209,42 @@
175209
"file_type": "py",
176210
"author": "官方",
177211
"author_en": "Official",
178-
"tags": ["scene", "touch", "game", "whack", "timer"],
212+
"tags": [
213+
"scene",
214+
"touch",
215+
"game",
216+
"whack",
217+
"timer"
218+
],
179219
"requires": [],
180220
"min_app_version": "1.5.0",
181221
"added": "2026-03-18",
182222
"updated": null,
183223
"status": "active",
184224
"lines": 427
225+
},
226+
{
227+
"id": "script_mmw6k09q",
228+
"name": "计算器",
229+
"name_en": "计算器",
230+
"desc": "计算器脚本iOS原生风格",
231+
"desc_en": "计算器脚本iOS原生风格",
232+
"category": "ui",
233+
"file": "scripts/ui/script_mmw6k09q.py",
234+
"thumbnail": null,
235+
"version": 1,
236+
"file_type": "py",
237+
"author": "今晚打老虎🐯",
238+
"author_en": "今晚打老虎🐯",
239+
"tags": [
240+
"community"
241+
],
242+
"requires": [],
243+
"min_app_version": "1.5.0",
244+
"added": "2026-03-18",
245+
"updated": null,
246+
"status": "active",
247+
"lines": 144
185248
}
186249
]
187250
}
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)