ye土土
文章15
标签27
分类5

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

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

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

我一脸懵:“啥文档?”

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

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

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

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

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

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

🌙周五的晚上

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

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

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

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

以下是老师的建议:

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

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

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

累死了

0点多了

先睡吧

⛅星期六

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

今天任务是做功能

明天再把界面完成

打开VS code

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

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

功能一 垃圾分类

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

写个分支语句就能完成

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

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
过轻 正常 过重 肥胖 非常肥胖

又是一个分支语句:

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文档里的内容,显示在输入框中

于是呢,我翻了翻我的书

得知如何保存内容:

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

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

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

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

contents变量是获取到的内容

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

实现随手记也就不难了

功能四 文字朗读

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

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

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

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

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

再次打开某度

根据资料写了以下代码

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

import tkinter as tk
import tkutils as tku

建立软件窗口

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”(中间区域,主窗口)

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

插入内容

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)的内容,再显示要显示的内容

self.clean_main_area()

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

tkinter库的模块也挺丰富的

比如:

文本框

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

按钮

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

单行 文本/输入 框

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

多行 文本/输入 框

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

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

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

过程也不是很复杂

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

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

等等,UI美化呢?

啊,完全来不及啦

明天就要交啦

而且自带UI的按钮丑死了

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

按钮:

单行输入框:

多行文本框:

az。。。。

总体对比:

就这!就这!就这!

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

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

明天就要交作品了

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

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

这次应该不水了吧

还有本月23号之后会对更新一些文章(再也不水了)

替换掉以前那些海文章

就这样吧

本文作者:ye土土
本文链接:https://hi-tutu.top/archives/20210415/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可