Skip to content

Commit 1c40c67

Browse files
Merge pull request #16 from jinwandalaohu66/submission/script_mmw6yzdm
2 parents 25f56cb + a93a675 commit 1c40c67

2 files changed

Lines changed: 211 additions & 8 deletions

File tree

script_library/index.json

Lines changed: 67 additions & 8 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:24:12.403Z",
55
"announcement": null,
66
"categories": [
77
{
@@ -70,7 +70,13 @@
7070
"file_type": "py",
7171
"author": "官方",
7272
"author_en": "Official",
73-
"tags": ["scene", "touch", "particle", "game", "brick"],
73+
"tags": [
74+
"scene",
75+
"touch",
76+
"particle",
77+
"game",
78+
"brick"
79+
],
7480
"requires": [],
7581
"min_app_version": "1.5.0",
7682
"added": "2026-03-18",
@@ -91,7 +97,13 @@
9197
"file_type": "py",
9298
"author": "官方",
9399
"author_en": "Official",
94-
"tags": ["scene", "touch", "particle", "game", "shooter"],
100+
"tags": [
101+
"scene",
102+
"touch",
103+
"particle",
104+
"game",
105+
"shooter"
106+
],
95107
"requires": [],
96108
"min_app_version": "1.5.0",
97109
"added": "2026-03-18",
@@ -112,7 +124,13 @@
112124
"file_type": "py",
113125
"author": "官方",
114126
"author_en": "Official",
115-
"tags": ["scene", "gravity", "accelerometer", "game", "maze"],
127+
"tags": [
128+
"scene",
129+
"gravity",
130+
"accelerometer",
131+
"game",
132+
"maze"
133+
],
116134
"requires": [],
117135
"min_app_version": "1.5.0",
118136
"added": "2026-03-18",
@@ -133,7 +151,13 @@
133151
"file_type": "py",
134152
"author": "官方",
135153
"author_en": "Official",
136-
"tags": ["scene", "touch", "game", "snake", "dpad"],
154+
"tags": [
155+
"scene",
156+
"touch",
157+
"game",
158+
"snake",
159+
"dpad"
160+
],
137161
"requires": [],
138162
"min_app_version": "1.5.0",
139163
"added": "2026-03-18",
@@ -154,7 +178,13 @@
154178
"file_type": "py",
155179
"author": "官方",
156180
"author_en": "Official",
157-
"tags": ["scene", "touch", "game", "jump", "endless"],
181+
"tags": [
182+
"scene",
183+
"touch",
184+
"game",
185+
"jump",
186+
"endless"
187+
],
158188
"requires": [],
159189
"min_app_version": "1.5.0",
160190
"added": "2026-03-18",
@@ -175,13 +205,42 @@
175205
"file_type": "py",
176206
"author": "官方",
177207
"author_en": "Official",
178-
"tags": ["scene", "touch", "game", "whack", "timer"],
208+
"tags": [
209+
"scene",
210+
"touch",
211+
"game",
212+
"whack",
213+
"timer"
214+
],
179215
"requires": [],
180216
"min_app_version": "1.5.0",
181217
"added": "2026-03-18",
182218
"updated": null,
183219
"status": "active",
184220
"lines": 427
221+
},
222+
{
223+
"id": "script_mmw6yzdm",
224+
"name": "计算器",
225+
"name_en": "计算器",
226+
"desc": "iOS原生风格的计算器ui界面",
227+
"desc_en": "iOS原生风格的计算器ui界面",
228+
"category": "ui",
229+
"file": "scripts/ui/script_mmw6yzdm.py",
230+
"thumbnail": null,
231+
"version": 1,
232+
"file_type": "py",
233+
"author": "今晚打老虎",
234+
"author_en": "今晚打老虎",
235+
"tags": [
236+
"community"
237+
],
238+
"requires": [],
239+
"min_app_version": "1.5.0",
240+
"added": "2026-03-18",
241+
"updated": null,
242+
"status": "active",
243+
"lines": 144
185244
}
186245
]
187246
}
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)