【有趣的Python小程序】超级详细讲解做一个GUI图形化界面数学题解锁闹钟的Python小程序

本文介绍了一个使用Python自制的数学闹钟程序,该程序包括声音提醒和GUI界面。通过随机生成100以内的加减乘除题目,用户需正确解答才能关闭闹钟。程序使用了random库生成数学问题,audioplayer库播放音乐,并利用Tkinter创建GUI界面,用户可以输入答案并有重试功能。
摘要由CSDN通过智能技术生成

唉唉唉,今天下午刚刚去了学校之后就被紧急叫回来了。那怎么办呢?在家学习的效果肯定没有学校学习效果好啊!说不定我连六点钟起床的基本要求的做不到。那可怎么办,于是,我决定在今天晚上做一个简陋的闹钟程序,提醒我起床!
在这里插入图片描述

功能实现

咱们把这个程序分成两个部分,一个是让它能够发出声音,提醒我们起床。另一个就是我们在起床之后关停闹钟的部分。所以话不多说,我们立马开始!

关停闹钟

在这里呢,我们要来一个100以内的加减乘除,因为超出100的数字可能会太难,我们在这里并不常用。为了实现我们数据的随机性,我们在这里直接导用Python系统库中的Random
在这里插入图片描述
咱么把这个文件命名成为“MathClock”数学方程,在程序的第一行导入Random
接下来,咱么将要创建三个值,用来接收随机产生的数据。那么为了方便我们在后面的调用,我们把这整一个过程写成一个函数。
在这里插入图片描述
紧随着我们要确定第一个数和第二个数之间的运算符号,同时我们也要确定第二个数与第三个数之间的标点符号。这里我们使用Random中Choice的方法,从列表中随机抽取两个元素。那么要注意的是,我们在这里需要使用字符串类型,如果不使用字符串类型,程序将会报错
我们来检测一下这个函数是否能够成功运行。咱么先在下面调用函数
在这里插入图片描述
当我们改正错误后,我们可以看到程序随机选出了一种符号
在这里插入图片描述
接下来,我们将使用最简单的IF语句,来实现四则运算,就像这样
在这里插入图片描述
但是我们完全不知道题目呀!所以我们应该要加入一行题目信息
在这里插入图片描述
让它变得更美观
在这里插入图片描述
然后我们用同样的方法创造第二个四则运算
在这里插入图片描述
那么我们的运算部分就这样做完了!
P.S. 在这里实际上还是有一个小BUG 我们在一定程度上可能会遇到一个数不整除。这样我们的工作量就会增加。咱们就会与我们的理念相违背。所以我们在后续程序中解决问题的办法就是设置重新选择按键,进行重新的组合排列!

声音实现

在声音部分,我一直都很喜欢使用这一个轻量的Python第三方库。因为真的是十分简洁,我们在写代码的时候一行就能搞定调用。

pip install audioplayer

在这里插入图片描述
接下来我们将在我们的程序中导入这样一个模块。我们按照官网的提示信息导入
在这里插入图片描述

在这里插入图片描述
我们按照应用文件当中给出的支持的声音文件,随机在我们电脑上面选择一下
在这里插入图片描述
然后我使用了在我电脑上歌曲最靠前的Teeth。咱么更改一下文件名
在这里插入图片描述
并与我们的Python文件放在同一目录下,更改文件名为MathsSong
在这里插入图片描述
当我们的电脑中有对应的歌曲且我们能够听到声音时,我们的播放程序就没有问题
在这里插入图片描述
在这里插入图片描述

GUI界面设计

咱们为了整洁度和实用度,我们在本次实例中选择了Python自带的GUI 界面库 Tkinter

在这里插入图片描述
首先我们创建Tkinter对象,设置标题,接下来再放一个文本在窗口中。最后我们在最后一行加上window.mainloop()这样就OK 啦
在这里插入图片描述
咱么先设置一下窗口的居中显示,这里借鉴了大神confusedlxx的代码
在这里插入图片描述
在这里插入图片描述
放置数学问题的代码
比如说我们这个问题太难了,用户并不能回答出来,这个时候我们要创建一个按钮,来让用户重新获得题目。我们编写函数RETRY_CLICK
在这里插入图片描述
由于我们要刷新题目,所以我们重写我们的代码,把它改成这样
在这里插入图片描述
进一步修整代码,使得我们代码能够同时获得答案和题目
在这里插入图片描述
我们将会在整个窗口中放上一个输入框,这样用来接受用户传递给我们的答案
在这里插入图片描述
为了后续程序检验的方便,我们在这里简化程序
在这里插入图片描述
当我们运行程序时,我们会出现以下界面
在这里插入图片描述

最后代码

由于这一次完成时间比较仓促,很多问题还没有处理好,希望大家能指出,谢谢

import random
from audioplayer import AudioPlayer
import tkinter

player = AudioPlayer("./MathsSong.mp3")
player.play()
window = tkinter.Tk()
window.title("MathsClock 数学闹钟") # 设置标题

# 设置居中显示,代码来自 https://blog.csdn.net/weixin_48690683/article/details/122773297
width = 300
height = 300
screen_height = window.winfo_screenheight()
screen_width = window.winfo_screenwidth()
x = int(screen_width / 2 - width / 2)
y = int(screen_height / 2 - height / 2)
size = '{}x{}+{}+{}'.format(width, height, x, y)
window.geometry(size)

# 创建一个Label 在上面放上表达的文字
clocking = tkinter.Label(window, text = "THE ALARM GOES OFF 闹钟响了").pack()

def make_maths_question():
	first_number = random.randint(1,10)
	second_number = random.randint(1,10)
	third_number = random.randint(1,10)

	symbol_list_1 = ["+","-","*","/"]
	symbol_list_2 = ["+","-"]

	first_symbol = random.choice(symbol_list_1)
	if first_symbol == "+":
		order_1 = str(first_number) + " + " + str(second_number)
		count_1 = first_number + second_number
	elif first_symbol == "-":
		order_1 = str(first_number) + " - " + str(second_number)
		count_1 = first_number - second_number
	elif first_symbol == "*":
		order_1 = str(first_number) + " * " + str(second_number)
		count_1 = first_number * second_number
	elif first_symbol == "/":
		order_1 = str(first_number) + " / " + str(second_number) 
		count_1 = first_number / second_number

	second_symbol = random.choice(symbol_list_2)
	if second_symbol == "+":
		order_2 = order_1 + " + " + str(third_number) + " = ?"
		count_2 = count_1 + third_number
	elif second_symbol == "-":
		order_2 = order_1 + " - " + str(third_number) + " = ?"
		count_2 = count_1 - third_number

	return order_2,count_2

global CORRECT_ANSWER 
maths_question = tkinter.StringVar()
question_text, correct_answer = make_maths_question()
CORRECT_ANSWER = correct_answer
maths_question.set(question_text)

def retry_click():
	question_text, correct_answer = make_maths_question()
	CORRECT_ANSWER = correct_answer
	print(CORRECT_ANSWER)
	maths_question.set(question_text)

def stop_click():
	player.stop()
	window.quit()

def enter_click():
	user_answer = maths_question_enter.get()
	print(user_answer)
	print(CORRECT_ANSWER)
	if int(user_answer) == int(CORRECT_ANSWER):
		good = tkinter.StringVar()
		good.set("YOU ARE RIGHT! 回答正确")
		good_label = tkinter.Label(window, textvariable = good).pack()
		stop_music_button = tkinter.Button(window, text = "STOP 停止", bg = "green", fg = "black", command = stop_click).pack()
	else:
		warning = tkinter.StringVar()
		warning.set("YOU ARE WRONG! 回答错误")
		warning_label = tkinter.Label(window, textvariable = warning).pack()

maths_label = tkinter.Label(window, textvariable = maths_question).pack()
retry = tkinter.Button(window, text = "RETRY 重试", bg = "green", fg = "black", command = retry_click).pack()
maths_question_enter = tkinter.Entry(window, width = 10)
maths_question_enter.pack()
maths_question_button = tkinter.Button(window, text = "ENTER 输入", bg = "green", fg = "black", command = enter_click).pack()

window.mainloop()
window.update()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地摊主老袁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值