抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

这是百(每天)年一次的比较有实(水)际(水)价(水)值(水)的编程技术文章

事情要从一个周前的那个星期五说起。。。

早晨班主任找到我说:“听说你会编程啊?昨天我在群里发的那个文档你看到了吗?”

我一脸懵:“啥文档?”

班主任:“那个什么编程比赛的,回家看一看,那你去参加吧,就怎么定了啊!”

于是呢我就勉强答应了班主任。。。

文档里就是讲了一些这次编程比赛的时间限制(一个周末)比赛项目(我参加的是程序设计)

我决定使用我所唯一学过的编程语言python完成这次比赛(其实html我也会一些,可是又没有网页设计比赛)

另外我也是第一次使用python进行编程比赛(以前只参加过一次scratch的蓝桥杯)

于是呢,我两天的爆肝开始了

🌙周五的晚上

第一个晚上,我想好了作品主题并完成了作品UI设计

大概是做一个便携工具安卓app

这里放出我那天晚异想开天的一部分设计图

This is a picture without description

设计完后,我马上就把图发给老师

以下是老师的建议:

1.把python打包成安卓apk是一个复杂繁琐的过程,还不如干脆直接做成电脑软件,再说安卓app也不符合比赛的要求

2.根据上面一条建议,修改UI

于是稍加改动,我把UI改成了这样:

This is a picture without description

累死了

0点多了

先睡吧

⛅星期六

一大早(其实是上午10点),起了床

今天任务是做功能

明天再把界面完成

打开VS code

深思了自己目前的编程水平

才决定先把简单的功能写完

功能一 垃圾分类

这也算是非常简单的一个功能

写个分支语句就能完成

于是我分分钟写了以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
lj = input("垃圾名称?") 
if lj in ('废纸','矿泉水瓶','牛奶盒','衣服','玻璃','书包','鞋','镜子','包装纸','牙刷'):
lj_kind=f'{lj} 是可回收垃圾'
elif lj in ('剩菜','剩饭','骨头','菜叶','果皮','菜根','鸡蛋壳','鸡蛋','苹果','花','落叶'):
lj_kind=f'{lj} 是厨余垃圾'
elif lj in ('电池','药瓶','针管','化妆品','灯泡','水银温度计','油漆桶','荧光灯管','过期药品'):
lj_kind=f'{lj} 是有害垃圾'
elif lj in ('花生壳','尘土','卫生纸','塑料袋','厕纸','烟盒','食用油','灰尘'):
lj_kind=f'{lj} 是其它垃圾'
else:
lj_kind=f'我不知道{lj}是什么垃圾,你还是先放回口袋吧'
print(lj_kind)

功能二 体质计算

这应该也不难

首先打开咱们的某度

找到了体质计算公式:

体质指数(BMI)=体重(kg)÷身高^2(m)

还有对比标准:

BML<18.5 18.5<BML<23.9 24<BML<27 28<BML<32 BML>32
过轻 正常 过重 肥胖 非常肥胖

又是一个分支语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
height=input("身高?")
weight=input("体重?")
weight=int(weight)
height=float(height)
bml = height*height
bml = weight/bml
if bml<18.5:
jg = "过轻"
elif bml<23.9:
jg = "正常"
elif bml<27:
jg = "过重"
elif bml<32:
jg = "肥胖"
else:
jg = "非常肥胖"
print(jg)

功能三 随手记

所谓随手记就是只有一个页面的备忘录,可记录笔记和作业,也可以记录一些生活中的重要事情,防止忘记

该功能我的构思如下:

用户输入的内容后,会在本地新建一个txt文件,然后会把获取到的内容替换进去,再次打开应用时,程序会获取该txt文档里的内容,显示在输入框中

于是呢,我翻了翻我的书

得知如何保存内容:

1
2
3
filename='./wb.txt' 
with open(filename,'w') as file_object:
file_object.write(word1)

其中filename变量是文件的绝对路径

然后读取文件内容可以这样:

1
2
with open('./wb.txt') as file_object: 
contents = file_object.read()

contents变量是获取到的内容

明白了怎样读取和编辑文件内容

实现随手记也就不难了

功能四 文字朗读

就像题目所说的那样,程序会获取到输入的文字,然后朗读出来

可能你会疑惑:这好像没什么用?

这个功能的目的是造福部分不识字的老年人和某些视障人士

然后你会吐槽:这然道不**吗,想要朗读文字不应该先输入文字吗,不识字的老人会打字吗?

所以,我添加了自动粘贴功能,你只要把别人发给你的文字短信内容复制下来,打开软件,程序就会自动将剪贴板中的内容粘贴在文本框下,只要轻点朗读,就OK了

再次打开某度

根据资料写了以下代码

1
2
3
4
5
6
7
8
import win32com.client 
import time
speak_out = win32com.client.Dispatch('SAPI.SPVOICE')
nr = input("文字?")
def speak(str):
speak_out.Speak(str)
speak(nr)
time.sleep(1)

nr变量是你输入的文字内容

功能五 英语词典

这应该是所有程序中最难实现的一个

我的构思如下:

点击搜索时,程序获取到输入框中你输入的英语单词,先会到本地词库检索单词,如果没有检索到该单词,就会调用有道词典的api检索单词

会使用到bs4对html对网页进行解析

这里有篇参考文章,这里就不多讲了:点击直达

其它

虽然我已经做出来了我的剪贴板功能了,但想想作用不大,也不可能要求用户一直开着软件,所以就取消了该功能

🌞星期日的一天爆肝

接下来就是最难的一个环节了:做界面

一个软件不仅要有好功能,还要有对用户友善的界面

经过几十分钟的网络查询

我找到了一个可以说较为满意的做界面的python库——tkinter

引入tkinter,取别名tk

1
2
import tkinter as tk
import tkutils as tku

建立软件窗口

1
2
3
4
5
6
7
def __init__(self): 
self.root = tk.Tk()
self.root.title('松果tool')
self.root.iconbitmap('./12.ico')
self.root.geometry("740x376")
self.root.resizable(0,0)
tku.center_window(self.root)

这里相当于html中的<head>标签

我的窗口大概分三个布局是“frameTop”(顶部标题栏)“frameLeft”(左侧功能栏)“frameMain”(中间区域,主窗口)

This is a picture without description

那让我们再建立一个<body>标签(就是名字是body的函数)

插入内容

1
2
3
4
5
6
self.frameTop = tk.Frame(self.root, bg="#2b4490", height=50, width=700) 
self.frameLeft = tk.Frame(self.root, bg="#2a5caa", width=200)
self.frameMain = tk.Frame(self.root, bg="#426ab3")
self.frameTop.pack(side='top', expand='no', fill='x')
self.frameLeft.pack(side='left', expand='no', fill='y')
self.frameMain.pack(side='right', expand='yes', fill='both')

建立三个布局

分别定位三个布局(pack)

side:位置

expand:是否扩展

fill:填充

完成这些就可以开始做各个功能的界面了

根据之前的设计,左侧栏(frameLeft)放按钮,中间部分(frameMain)就是功能界面

每次点击左侧栏(frameLeft),都能够清空中间部分(frameMain)的内容,再显示要显示的内容

1
self.clean_main_area()

将这一行代码写入函数就可以实现啦

tkinter库的模块也挺丰富的

比如:

文本框

1
2
tk.Label(self.frameMain, text='文本内容', fg='#000000')\ 
.pack(side='top', expand='no', fill='x')

按钮

1
2
tk.Button(self.frameMain, text="按钮上的文字", width=20, command=jsjsjs)\
.pack(side="top", padx=20)

单行 文本/输入 框

1
2
tk.Entry(self.frameMain, width=50)\ 
.pack(side="top", padx=20)

多行 文本/输入 框

1
2
3
tk.Text(self.frameMain, width=50, height=9.2) 
.insert('end', contents)
.pack(side="top", padx=20, pady=10)

有了这四个模块就够完成这个程序了

最后再把昨天写好的功能代码安装上去就行了

过程也不是很复杂

就先省略了吧,不具体说明了

一直到晚上九点,才把所有写好

等等,UI美化呢?

啊,完全来不及啦

明天就要交啦

而且自带UI的按钮丑死了

放几张库自带UI和我设计的UI对比图吧

按钮:

This is a picture without description

单行输入框:

This is a picture without description

多行文本框:

This is a picture without description

az。。。。

总体对比:

This is a picture without description

就这!就这!就这!

最后把应用主题配色改成蓝的才比较满意

反正比原来自带灰底的好,像极了win98的风格

明天就要交作品了

希望“功夫不负有心人”吧

**比赛期间不能放出成品下载链接,所以想体验我作品的话以后再说吧

评论