BeeWare开发安卓app科目三灯光模拟器

源代码

app.py中的完整代码如下所示:

"""
My first application
"""
import toga
from winsound import PlaySound, SND_FILENAME
import random
import asyncio
from toga.style import Pack
from toga.style.pack import COLUMN, ROW


class HelloWorld(toga.App):

    def startup(self):
        """
        Construct and show the Toga application.

        Usually, you would add your application to a main content box.
        We then create a main window (with a name matching the app), and
        show the main window.
        """
        main_box = toga.Box(style=Pack(direction=COLUMN))

        name_label = toga.Label(
            'Your name:',
            style=Pack(padding=(0, 5))
        )

        self.name_input = toga.TextInput(style=Pack(flex=1))
        name_box = toga.Box(style=Pack(direction=ROW, padding=5))
        name_box.add(name_label)
        name_box.add(self.name_input)

        button0 = toga.Button(
            '加油',
            on_press=self.encourage,
            style=Pack(padding=5)
        )

        button1 = toga.Button(
            '模拟夜间灯光使用考试',
            on_press=self.test,
            style=Pack(padding=5)
        )

        main_box.add(name_box)
        main_box.add(button0)
        main_box.add(button1)

        self.main_window = toga.MainWindow(title=self.formal_name)
        self.main_window.content = main_box
        self.main_window.show()

    def encourage(self, widget):
        if self.name_input.value:
            name = self.name_input.value
        else:
            name = '老司机'

        self.main_window.info_dialog(
            "Hello,{}".format(name),
            "逢考必过!",
        )

    def test(self, widget):

        # await asyncio.sleep(50)
        filename = "F:/BeeWareProject/helloworld/Light_emulator/src/Light_emulator/record/" + str(0) + ".wav"
        PlaySound(filename, SND_FILENAME)

        filename = "F:/BeeWareProject/helloworld/Light_emulator/src/Light_emulator/record/" + str(1) + ".wav"
        PlaySound(filename, SND_FILENAME)

        for i in range(1, 4):
            # 需保证每次产生的随机数不同
            random.seed()
            num = random.randint(2, 14)
            filename = "F:/BeeWareProject/helloworld/Light_emulator/src/Light_emulator/record/" + str(num) + ".wav"
            PlaySound(filename, SND_FILENAME)

        filename = "F:/BeeWareProject/helloworld/Light_emulator/src/Light_emulator/record/" + str(15) + ".wav"
        PlaySound(filename, SND_FILENAME)


def main():
    return HelloWorld()

设计思路

一个文本输入框,用来输入使用者姓名,若未输入,默认值为“老司机”,
两个按钮:
按钮0名为“加油”,按下后,会弹出一个子窗口:Hello,使用者,逢考必过!
按钮1名为“模拟夜间灯光使用考试”,按下后,开始后播放测试音频。前奏和请开启前照灯是一定播放;其余音频使用for循环,随机播放,共播放3条;最后播放结束语。

问题

1

按钮1的回调函数中需要执行的时间较长,在播放测试内容时3,如果要退出app,则无法响应。
拟使用异步编程的方法解决,将按钮1的回调函数test的定义def修改为async def,在函数中加入await asyncio.sleep(50),即在回调函数执行过程中挂起,去执行其他,等到挂起条件(假设挂起条件是sleep(5))消失后,也就是5秒到了再回来执行。但未修改任何代码,用手机接完电话回来asyna和await突然就不生效了。

2

将打包好的app发送到手机上安装完成后,打开闪退。

追加

尝试把winsound换成playsound,无果

some feelings

一个感觉蛮简单的项目还是做了挺久的,记录一下目前的进度,会搁置一段时间,后面再来调,毕竟半途而废不好。

你可能感兴趣的:(BeeWare,android)