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的回调函数中需要执行的时间较长,在播放测试内容时3,如果要退出app,则无法响应。
拟使用异步编程的方法解决,将按钮1的回调函数test的定义def修改为async def,在函数中加入await asyncio.sleep(50)
,即在回调函数执行过程中挂起,去执行其他,等到挂起条件(假设挂起条件是sleep(5))消失后,也就是5秒到了再回来执行。但未修改任何代码,用手机接完电话回来asyna和await突然就不生效了。
将打包好的app发送到手机上安装完成后,打开闪退。
尝试把winsound换成playsound,无果
一个感觉蛮简单的项目还是做了挺久的,记录一下目前的进度,会搁置一段时间,后面再来调,毕竟半途而废不好。