Skip to content

Commit 39ec5db

Browse files
committed
feat: 添加按键声音播放功能及导航栏类
fix: 修改设置按钮点击逻辑为长按,优化UI布局及变量初始化
1 parent f7847cd commit 39ec5db

File tree

4 files changed

+240
-56
lines changed

4 files changed

+240
-56
lines changed

src/PhiControls.py

Lines changed: 175 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,21 @@ async def storage(
174174
page.session.clear()
175175

176176

177+
def play_key_sound(page: ft.Page):
178+
"""播放按键声音"""
179+
# 背景音乐
180+
if storage(page=page, key="is_load_finish",type="s"):
181+
try:
182+
import flet_audio as ft_a
183+
184+
audio1 = ft_a.Audio(src="Tap1.wav", autoplay=True)
185+
except:
186+
print("[log-", datetime.datetime.now(), "]Audio load failed, use fallback")
187+
audio1 = ft.Audio(src="Tap1.wav", autoplay=True)
188+
# TODO: flet 0.26 win编译兼容性问题
189+
page.overlay.append(audio1)
190+
191+
177192
class PhiBack(ft.Stack):
178193
"""_summary_: 返回按钮
179194
@@ -341,7 +356,7 @@ def on_data_change(self, data: str, page=ft.Page, n=0.7):
341356
].style.size = ((35 - (2.5 * (len(self.DATA) - 7))) * n * 0.92)
342357
page.update()
343358
else:
344-
n *= 1.1
359+
n *= 1.05
345360
self.DATA = data
346361
self.controls[0].controls[1].controls[1].content.spans[
347362
0
@@ -397,7 +412,7 @@ def __init__(self, n=1, page=ft.Page):
397412
ft.Text(
398413
"",
399414
color=ft.Colors.WHITE,
400-
size=30 * n,
415+
size=32 * n,
401416
text_align=ft.TextAlign.CENTER,
402417
width=textwidth * n,
403418
style=ft.TextStyle(height=1),
@@ -663,3 +678,161 @@ def __init__(self, n=1):
663678
spacing=0,
664679
),
665680
]
681+
682+
683+
class PhiStoreNav(ft.Stack):
684+
"""_summary_: `PhiStore` 导航栏
685+
686+
Args:
687+
ft (_type_): _description_
688+
"""
689+
690+
def __init__(
691+
self,
692+
page: ft.Page,
693+
n=1,
694+
on_click=[print("click"), print("click2"), print("click3"), print("click4")],
695+
lock=False,
696+
):
697+
super().__init__()
698+
self.n = n
699+
self.page = page
700+
self.lock = lock
701+
self.on_click_list = on_click
702+
self.controls = [
703+
ft.Container(
704+
gradient=ft.LinearGradient(
705+
begin=ft.alignment.top_center,
706+
end=ft.alignment.bottom_center,
707+
colors=["#70000000", "#E0000000"],
708+
),
709+
height=120 * n,
710+
padding=0,
711+
),
712+
ft.Row(
713+
[
714+
ft.Container(
715+
ft.Stack(
716+
[
717+
ft.Container(
718+
bgcolor=ft.Colors.WHITE,
719+
width=300 * n,
720+
height=3,
721+
offset=ft.transform.Offset(
722+
3, -(120 * n - 3) / 2 / 3
723+
),
724+
animate_offset=ft.animation.Animation(
725+
duration=400,
726+
curve=ft.animation.AnimationCurve.EASE_OUT_CUBIC,
727+
),
728+
),
729+
ft.Image(
730+
src="nav-icon-1.svg",
731+
width=60 * n,
732+
height=60 * n,
733+
),
734+
],
735+
height=120 * n,
736+
alignment=ft.alignment.center,
737+
),
738+
data="nav-icon-1",
739+
on_click=self.on_click,
740+
),
741+
ft.Container(
742+
ft.Stack(
743+
[
744+
ft.Container(
745+
# bgcolor=ft.Colors.WHITE,
746+
width=300 * n,
747+
height=3,
748+
offset=ft.transform.Offset(
749+
0, -(120 * n - 3) / 2 / 3
750+
),
751+
),
752+
ft.Image(
753+
src="nav-icon-2.svg",
754+
width=60 * n,
755+
height=60 * n,
756+
),
757+
],
758+
height=120 * n,
759+
alignment=ft.alignment.center,
760+
),
761+
data="nav-icon-2",
762+
on_click=self.on_click,
763+
),
764+
ft.Container(
765+
ft.Stack(
766+
[
767+
ft.Container(
768+
# bgcolor=ft.Colors.WHITE,
769+
width=300 * n,
770+
height=3,
771+
offset=ft.transform.Offset(
772+
0, -(120 * n - 3) / 2 / 3
773+
),
774+
),
775+
ft.Image(
776+
src="nav-icon-3.svg",
777+
width=60 * n,
778+
height=60 * n,
779+
),
780+
],
781+
height=120 * n,
782+
alignment=ft.alignment.center,
783+
),
784+
data="nav-icon-3",
785+
on_click=self.on_click,
786+
),
787+
ft.Container(
788+
ft.Stack(
789+
[
790+
ft.Container(
791+
# bgcolor=ft.Colors.WHITE,
792+
width=300 * n,
793+
height=3,
794+
offset=ft.transform.Offset(
795+
0, -(120 * n - 3) / 2 / 3
796+
),
797+
),
798+
ft.Image(
799+
src="nav-icon-4.svg",
800+
width=60 * n,
801+
height=60 * n,
802+
),
803+
],
804+
height=120 * n,
805+
alignment=ft.alignment.center,
806+
),
807+
data="nav-icon-4",
808+
on_click=self.on_click,
809+
),
810+
],
811+
height=120 * n,
812+
expand_loose=True,
813+
alignment=ft.MainAxisAlignment.CENTER,
814+
vertical_alignment=ft.CrossAxisAlignment.CENTER,
815+
spacing=0,
816+
),
817+
]
818+
819+
def on_click(self, e):
820+
if storage(page=self.page, key="is_load_finish"):
821+
play_key_sound(self.page)
822+
self.controls[1].controls[0].content.controls[0].offset = (
823+
ft.transform.Offset(
824+
int(e.control.data[-1]) - 1, -(120 * self.n - 3) / 2 / 3
825+
)
826+
)
827+
self.page.update()
828+
if self.on_click_list != [] and self.on_click_list is not None:
829+
for i, action in enumerate(self.on_click_list):
830+
if e.control.data[-1] == str(i + 1):
831+
print(
832+
"[log-",
833+
datetime.datetime.now(),
834+
"]执行了第",
835+
i + 1,
836+
"个导航栏动作",
837+
)
838+
# action

src/assets/Tap1.wav

85.5 KB
Binary file not shown.

src/main.py

Lines changed: 65 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414

1515
# noinspection PyTypeChecker
1616
async def main(page: ft.Page):
17-
17+
global lock, lock2, lock3, lock4
18+
19+
Phi.storage(page=page, key="is_load_finish",value=False,type="s" , mode="w") # 读取Data
20+
1821
# 数据读取
1922
# 读取抽奖列表,如无自定义则使用默认
2023
# TODO: 自定义抽奖列表
@@ -43,13 +46,14 @@ def on_keyboard(e: ft.KeyboardEvent):
4346
await Phi.storage(page=page, key="n", value=0.45, mode="w")
4447
else:
4548
# nt123 = 0.8
46-
await Phi.storage(page=page, key="n", value=0.8, mode="w")
49+
await Phi.storage(page=page, key="n", value=0.7, mode="w")
4750

4851
page.theme = ft.Theme(font_family="Exo") # 默认应用字体
4952

5053
# 背景音乐
5154
try:
5255
import flet_audio as ft_a
56+
5357
audio1 = ft_a.Audio(
5458
src="Shop0.wav", autoplay=True, release_mode=ft_a.audio.ReleaseMode.LOOP
5559
)
@@ -181,12 +185,14 @@ async def set(e):
181185

182186
async def setting_on_submit(e):
183187
nonlocal setting, datashow, page
184-
await Phi.storage(
185-
page=page,
186-
key="data",
187-
value=float(setting.content.controls[1].value),
188-
mode="w",
189-
)
188+
data_before = await Phi.storage(page=page, key="data")
189+
if float(setting.content.controls[1].value) != data_before:
190+
await Phi.storage(
191+
page=page,
192+
key="data",
193+
value=float(setting.content.controls[1].value),
194+
mode="w",
195+
)
190196
n_before = await Phi.storage(page=page, key="n")
191197
await Phi.storage(
192198
page=page,
@@ -281,28 +287,32 @@ async def reset_data(e):
281287
margin=ft.margin.only(
282288
right=25 * await Phi.storage(page=page, key="n")
283289
),
284-
on_click=set,
290+
on_long_press=set,
285291
height=70 * await Phi.storage(page=page, key="n") * 1.25,
286292
),
287293
],
288294
columns=3,
289295
),
290-
ft.Container(
291-
# 分割线
292-
ft.Divider(thickness=2, color="#EE6E6E6E"),
293-
height=1,
294-
alignment=ft.alignment.top_center,
295-
margin=ft.margin.only(
296-
top=120 * await Phi.storage(page=page, key="n") * 0.9
297-
),
296+
ft.TransparentPointer(
297+
ft.Container(
298+
# 分割线
299+
ft.Divider(thickness=2, color="#EE6E6E6E"),
300+
height=1,
301+
alignment=ft.alignment.top_center,
302+
margin=ft.margin.only(
303+
top=120 * await Phi.storage(page=page, key="n") * 0.9
304+
),
305+
)
298306
),
299-
ft.Container(
300-
lottery,
301-
margin=ft.margin.only(
302-
top=175 * await Phi.storage(page=page, key="n")
303-
),
304-
alignment=ft.alignment.top_center,
305-
expand=True,
307+
ft.TransparentPointer(
308+
ft.Container(
309+
lottery,
310+
margin=ft.margin.only(
311+
top=175 * await Phi.storage(page=page, key="n")
312+
),
313+
alignment=ft.alignment.top_center,
314+
expand=True,
315+
)
306316
),
307317
# ft.Container(
308318
# ft.Row(
@@ -326,32 +336,39 @@ async def reset_data(e):
326336
# top=550 * await Phi.storage(page=page, key="n")
327337
# ),
328338
# ),
329-
ft.Container(
330-
ft.Row(
331-
[
332-
ft.Container(
333-
Phi.PhiLotteryButton(
334-
n=await Phi.storage(page=page, key="n")
339+
ft.TransparentPointer(
340+
ft.Container(
341+
ft.Row(
342+
[
343+
ft.Container(
344+
Phi.PhiLotteryButton(
345+
n=await Phi.storage(page=page, key="n")
346+
),
347+
on_click=lottery_on_click,
335348
),
336-
on_click=lottery_on_click,
337-
),
338-
ft.Container(
339-
Phi.PhiLotteryButtonM(
340-
n=await Phi.storage(page=page, key="n")
349+
ft.Container(
350+
Phi.PhiLotteryButtonM(
351+
n=await Phi.storage(page=page, key="n")
352+
),
353+
on_click=lottery_on_click_multi,
341354
),
342-
on_click=lottery_on_click_multi,
343-
on_long_press=set,
344-
),
345-
],
355+
],
356+
expand=True,
357+
alignment=ft.MainAxisAlignment.SPACE_EVENLY,
358+
),
359+
padding=0,
360+
alignment=ft.alignment.bottom_center,
346361
expand=True,
347-
alignment=ft.MainAxisAlignment.SPACE_EVENLY,
348-
),
349-
padding=0,
350-
alignment=ft.alignment.bottom_center,
351-
expand=True,
352-
margin=ft.margin.only(
353-
bottom=180 * await Phi.storage(page=page, key="n")
354-
),
362+
margin=ft.margin.only(
363+
bottom=220 * await Phi.storage(page=page, key="n")
364+
),
365+
)
366+
),
367+
ft.TransparentPointer(
368+
ft.Container(
369+
Phi.PhiStoreNav(n=await Phi.storage(page=page, key="n"),page=page),
370+
alignment=ft.alignment.bottom_center,
371+
)
355372
),
356373
],
357374
alignment=ft.alignment.center,
@@ -371,13 +388,7 @@ async def reset_data(e):
371388
page=page,
372389
n=await Phi.storage(page=page, key="n"),
373390
)
374-
Phi.PhiData.on_data_change(
375-
datashow,
376-
Phi.hum_convert(await Phi.storage(page=page, key="data")),
377-
page=page,
378-
n=await Phi.storage(page=page, key="n"),
379-
)
380391
page.update()
381-
392+
Phi.storage(page=page, key="is_load_finish", value=True,type="s", mode="w")
382393

383394
ft.app(target=main)

图片1.png

4.16 MB
Loading

0 commit comments

Comments
 (0)