曲の歌詞をすばやく切り替えるのに役立つプログラムをコーディングしました。ファイルから歌詞を読み取り、.lyr
印刷します。
これは、のような追加機能を含まない簡略化されたバージョンですedit_line()
。このコードでも問題が発生します。
import os
class Lyrics:
def __init__(self, file):
'''Initialize new Lyrics object'''
self.file = file.replace("/", "\\")
self.path = self.file.rsplit("\\", 1)[0] + "\\"
self.suffix = "." + self.file.rsplit(".")[-2]
self.name = self.file\
.replace(self.path, "")\
.replace(".lyr", "")\
.replace(self.suffix, "")
def draw(self):
'''Draw lyrics on user's screen'''
maxlen = len(str(len(self.content)))
print("[[ %s ]]"%self.name)
for i,line in enumerate(self.content):
print("%i %s"%(i+1, line), end="")
def play(self):
'''View lyrics'''
with open(self.file, "r") as f:
self.content = f.readlines()
#os.system("cls")
self.draw()
input("[[ Press enter to quit ... ]]")
def main(directory):
# Get lyric files from directory
lyric_files = []
for file in os.listdir(directory):
if file.endswith(".lyr"):
lyric_files.append(Lyrics(directory + file))
# Create variable for showing messages to user
msg = ""
# Main loop
while True:
# Print lyric files
#os.system("cls")
for i, file in enumerate(lyric_files):
print("%i :: %s"%(i+1, file.name))
# Handle input
cmd = input("%s>"%msg)
if cmd == "bye":
break
try:
lyric_files[int(cmd)-1].play()
msg = ""
except ValueError:
msg = "ValueError: Input must be an integer\n"
except IndexError:
msg = "IndexError: Integer must be between 1 and %i\n"%len(lyric_files)
if __name__ == "__main__":
main("E:\\documents\\lyrics\\")
のファイルにE:\documents\lyrics\
は、次の形式で名前が付けられています。
Artist - Song.format.lyr`
例えば:
E:\documents\lyrics\Adele - Set Fire to the Rain.mp3.lyr
プログラムを開くと、想定どおりにすべてのファイルが一覧表示され、次の後に入力を求められます。
1 :: Adele - Set Fire to the Rain
2 :: Eminem - Not Afraid
3 :: Nicki Minaj - Starships
>
Set Fire to the Rain
インデックス付きの歌詞を開くと1
、完全に開きます。ただし、の歌詞を開こうとするとNot Afraid
、歌詞ファイルの長さが実際には約120行であるのに、出力に約50行の歌詞が表示されます。次に、次のようにmain()
関数からの入力を求められます。ValueError
1 first_line_in_lyrics
2 second_line_in_lyrics
i ...
42 fourty_second_line_in_lyrics
43 fourty_third_line_in_lyrics
1 :: Adele - Set Fire to the Rain
2 :: Eminem - Not Afraid
3 :: Nicki Minaj - Starships
ValueError: Input must be an integer
>
ファイルは互いにほとんど同じです(もちろん歌詞は異なります)。プログラムはIDLEで問題なく動作しますが、Pythonコマンドラインでは動作しません。