tkinter 小说编写器
该软件借鉴了网上许多大神的代码片
感谢这些无私奉献的人
此软件可用于小说编写,笔记记事
小说内容朗读,停止等功能
代码无注释, 需对编程有一定的了解
作者: 吴年和
此软件无须数据库
具备爬虫能力(功能已阉割)
播放语音朗读需自行提供百度api秘钥

# coding: utf-8
import json, easygui
import shutil
import pygame.time
import pygame.mixer as mixer
import tkinter as tk
import os, requests, time, threading
import tkinter.messagebox
from tkinter.ttk import Combobox
from tkinter import *
from tkinter import scrolledtext
from aip import AipSpeech
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
themes = {
"黑夜": {
"novelListColor": "#212226", "chaptersListColor": "#303339", "bookContentColor": "#303339",
"fontColor": "#9198A5", "otherCanvas": "#303339", "fontStyle": "simhei"},
"白天": {
"novelListColor": "#fffafa", "chaptersListColor": "#ffffff", "bookContentColor": "#ffffff",
"fontColor": "#111111", "otherCanvas": "#ffffff", "fontStyle": "simhei"}
}
if not os.path.exists("easyNoteTheme.json"):
theme = themes["黑夜"]
else:
with open("easyNoteTheme.json", encoding="utf-8") as r:
temp = r.read()
theme = json.loads(temp.replace("'", "\""))
def getFileNames(path):
arr = []
if os.path.exists(path):
for root, dirs, files in os.walk(path):
arr.append((dirs, files))
return arr
bookpath = "./books"
if not os.path.exists(bookpath):
os.makedirs(bookpath)
class NovelReading:
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:88.0) Gecko/20100101 Firefox/88.0"}
self.lastTime = 0
self.interval = 0.1
self.fileSuffixs = []
self.mainWindow = tk.Tk()
self.screenWidth = int(self.mainWindow.winfo_screenwidth() * 0.7)
self.screenHeight = int(self.mainWindow.winfo_screenheight() * 0.7)
self.relX = int(self.screenWidth * 0.24)
self.relY = int(self.screenHeight * 0.15)
self.mainWindow.geometry(f"{self.screenWidth}x{self.screenHeight}+{self.relX}+{self.relY}")
self.mainWindow.title("EasyNote")
self.playState = False
self.mainWindow.grid_rowconfigure(0, weight=1)
self.mainWindow.grid_columnconfigure(0, weight=1)
self.mainWindow.grid_columnconfigure(2, weight=20)
self.novelListX = tk.Scrollbar(self.mainWindow, orient=tk.HORIZONTAL)
self.chaptersListX = tk.Scrollbar(self.mainWindow, orient=tk.HORIZONTAL)
self.novelList = Listbox(self.mainWindow, background=theme["novelListColor"], foreground=theme["fontColor"],
xscrollcommand=self.novelListX.set,
font=(theme["fontStyle"], 20), selectborderwidth=10)
self.chaptersList = Listbox(self.mainWindow, background=theme["chaptersListColor"],
xscrollcommand=self.chaptersListX.set,
foreground=theme["fontColor"], font=(theme["fontStyle"], 19), selectborderwidth=5)
self.bookContent = scrolledtext.ScrolledText(self.mainWindow, background=theme["bookContentColor"], bd=0,
font=(theme["fontStyle"], 18), foreground=theme["fontColor"],
undo=True)
self.bookpath = ""
self.chapterPath = ""
books = getFileNames(bookpath)
self.bookNames = books[0][0]
mixer.init()
self.initBooks()
self.initMenu()
# 判断是否到达执行时间
def isActionTime(self, lastTime, interval):
if lastTime == 0:
return True
currentTime = time.time()
return currentTime - lastTime >= interval
def selectNovel(self, event):
books = getFileNames(bookpath)
self.bookNames = books[0][0]
num = self.novelList.curselection()
if num.__len__() < 1:
return
num = num[0]
books = self.novelList.get(0, self.novelList.size())
self.bookpath = f"{bookpath}/{books[num]}"
self.chapters = getFileNames(self.bookpath)[0][1]
self.chaptersList.delete(0, END)
self.bookContent.delete(1.0, END)
self.fileSuffixs = []
def convert(item):
cn_map = dict(zip(['零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']