查看: 2023|回复: 3

Python:一个闹钟

[复制链接]

1

主题

2

帖子

7

积分

个人用户

积分
7
发表于 2022-6-28 13:28:47 | 显示全部楼层 |阅读模式
随着一个《霍格沃茨:一段校史》风格的大字(呃,这字好像并不大……)标题的出现,无聊的我没事干,又开始整活了~
之前我做的程序,一个使用了Tkinter库,一个则是Pygame,总之都是带有图形化的界面的。但作为一个懒汉,我自然能懒必懒(这点我非常有自知之明),这次,我就来一个简单朴素的没有图形界面的程序。
这是一个闹钟,一个可以设定时间的闹钟(虽然操作的界面有点简陋,但丝毫不影响它的强大功能)。
首先,我们要编闹钟的响铃程序。
我们先新建一个文件,后缀是“.pyw”(这样可以保证程序运行的时候不会弹出一个Python自带的窗口)。
首先,老规矩,第一行一定是:
  1. #coding:utf-8
复制代码
然后,我们要导入所需的模块:
  1. import datetime
  2. import pygame
  3. import os
  4. import time
  5. import random
  6. from pynput.keyboard import Key,Listener
复制代码
本次所需的模块不多,由于都是我原先安装好的,所以我也并不确定它们是否要用pip安装。当然,使用PyCharm进行编程可以自动为你安装你使用到的未安装的模块。
  1. all_songs=[]
  2. all_songs_dict={}
  3. for root, dirs, names in os.walk("d:/Users/{}/Music".format(os.getlogin())):
  4.     for filename in names:
  5.         if os.path.join(root, filename)[-4:] == ".mp3" or os.path.join(root, filename)[-4:] == ".ogg":
  6.             all_songs.append(os.path.join(root, filename)[os.path.join(root, filename).find("\") + 1:-4])
  7.             all_songs_dict[
  8.                 os.path.join(root, filename)[os.path.join(root, filename).find("\") + 1:-4]] = os.path.join(root,
  9.                                                                                                              filename).replace(
  10.                 "\", "/")
复制代码
首先,我们需要获取电脑中的音乐。我们用os.walk获取Music文件夹中的所有ogg和mp3文件(这是由于我播放音乐使用的是Pygame,它似乎只支持这两种文件的音乐)。同时,通过对路径字符串的文字处理,提取出音乐名称存储入列表all_songs,并将其和原先的路径对应存入字典all_songs_dict。这时存入这两个变量中的音乐信息相当于一种保险机制,可以确保在找不到铃声文件时有备用铃声可以使用(当然,如果你的音乐文件夹是空的,这当然没用;但我不认为你的文件夹中会没有音乐)。
  1. finding = open("alarm_list.txt", "a")
  2. finding.close()
  3. finding = open("alarm_list.txt", "r")
  4. alarm_list_undone = finding.readlines()
  5. finding.close()
  6. alarm_list = []
  7. for i in alarm_list_undone:
  8.     alarm_list.append(i.replace("\n", ""))
复制代码
我们的闹钟时间当然需要存储在某个文件中,这样才能防止这个信息丢失。于是,我们打开了一个“alarm_list.txt”文件(为防止文件不存在,我们需要先用写入的模式打开一次文件,这样可以在文件不存在时创建;同时为防止这个操作清空文件,我们必须用追加写的“a”而不是“w”)。我们会读取文件中的内容,并删除换行后存入alarm_list。我们不必忧心文件中有无法识别的内容,因为文件是通过另一个编辑程序写入的,那个程序会保证文件内容是这个程序所能识别的。
  1. finding = open("dates_one.txt", "a")
  2. finding.close()
  3. finding = open("dates_one.txt", "r")
  4. dates_undone_one = finding.readlines()
  5. finding.close()
  6. finding = open("dates_two.txt", "a")
  7. finding.close()
  8. finding = open("dates_two.txt", "r")
  9. dates_undone_two = finding.readlines()
  10. finding.close()
  11. dates = {}
  12. for i in range(len(dates_undone_one)):
  13.     dates[dates_undone_one[i].replace("\n", "")] =eval( dates_undone_two[i].replace("\n", ""))
复制代码
同理,对“dates_one.txt”和“dates_two.txt”也需要类似的处理。当然,因为文件中存储有表格,我们有必要用eval()函数回复它的表格类型。第二个不同在于这两个文件的内容会被存入一个字典,而不是表格。
  1. finding = open("songs_one.txt", "a")
  2. finding.close()
  3. finding = open("songs_one.txt", "r")
  4. songs_undone_one = finding.readlines()
  5. finding.close()
  6. finding = open("songs_two.txt", "a")
  7. finding.close()
  8. finding = open("songs_two.txt", "r")
  9. songs_undone_two = finding.readlines()
  10. finding.close()
  11. songs = {}
  12. for i in range(len(songs_undone_two)):
  13.     try:
  14.         open(songs_undone_two[i].replace("\n", ""),"r")
  15.     except:
  16.         songs_undone_two[i]=all_songs_dict[all_songs[random.randint(0,len(all_songs)-1)]]+"\n"
  17.         with open("songs_two.txt", "w")as finding:
  18.             finding.writelines(songs_undone_two)
  19. for i in range(len(songs_undone_one)):
  20.    songs[songs_undone_one[i].replace("\n", "")] = songs_undone_two[i].replace("\n", "")
复制代码
在对“songs_one.txt”和“songs_two.txt”的处理中,我们就需要用到表格all_songs了。为保证音乐都存在,它会尝试打开路径所指向的文件。如果找不到文件,它会将音乐修改为all_songs中所记录的随机一个音乐(在这里可以进行改善:加一个if判断,如果路径指向的文件后缀不是“.mp3”或“.ogg”,则也要修改音乐。这个工作感兴趣的读者可以自行加上,在此我不再给出代码——这主要是由于我在解释我的程序代码时即使发现了不合理之处,只要不是大问题,就也不愿再行修改的习惯)。
  1. finding = open("alarm_list.txt", "r")
  2. finder=finding.read()
  3. try:
  4.     while finder[-1] == "\n":
  5.         finder = finder[:-1]
  6. except:
  7.     while False:
  8.         print()
  9. with open("alarm_list.txt", "w") as finding:
  10.     finding.write(finder)
  11. finding = open("dates_one.txt", "r")
  12. finder=finding.read()
  13. try:
  14.     while finder[-1] == "\n":
  15.         finder = finder[:-1]
  16. except:
  17.     while False:
  18.         print()
  19. with open("dates_one.txt", "w") as finding:
  20.     finding.write(finder)
  21. finding = open("dates_two.txt", "r")
  22. finder=finding.read()
  23. try:
  24.     while finder[-1] == "\n":
  25.         finder = finder[:-1]
  26. except:
  27.     while False:
  28.         print()
  29. with open("dates_two.txt", "w") as finding:
  30.     finding.write(finder)

  31. finding = open("songs_one.txt", "r")
  32. finder=finding.read()
  33. try:
  34.     while finder[-1] == "\n":
  35.         finder = finder[:-1]
  36. except:
  37.     while False:
  38.         print()
  39. with open("songs_one.txt", "w") as finding:
  40.     finding.write(finder)
  41. finding = open("songs_two.txt", "r")
  42. finder=finding.read()
  43. try:
  44.     while finder[-1] == "\n":
  45.         finder = finder[:-1]
  46. except:
  47.     while False:
  48.         print()
  49. with open("songs_two.txt", "w") as finding:
  50.     finding.write(finder)
复制代码
未完待续...
回复

使用道具 举报

3

主题

6

帖子

19

积分

个人用户

积分
19
发表于 2022-6-28 14:24:04 | 显示全部楼层
不错,期待更新
回复

使用道具 举报

0

主题

2

帖子

8

积分

企业用户

积分
8
发表于 2022-6-28 14:42:07 | 显示全部楼层
艺术感十足!
回复

使用道具 举报

1

主题

3

帖子

11

积分

企业用户

积分
11
发表于 2022-6-28 14:45:18 | 显示全部楼层
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表