在基于python简易小说阅读器(一)中,用requests模块和beautifulsoup模块完成了阅读器的后台,实现了下载小说内容的功能,现在用tkinter模块完成简单的界面
import tkinter
win = tkinter.Tk()
frame_1 = tkinter.Frame(win)
frame_1.pack(fill=tkinter.BOTH, expand=tkinter.YES) #设置容器自动
win.title('带滚动条text控件')
text = tkinter.Text(frame_1,font=('微软雅黑',18)) #设置文本字体种类及大小
text.config(fg="blue") #设置文本字体颜色
text.pack(fill=tkinter.BOTH, expand=tkinter.YES)
scroll = tkinter.Scrollbar(text) #以text组件为父组件创建滚轮组件
scroll.pack(side=tkinter.RIGHT,fill=tkinter.Y) #将滚轮组件放到父组件的右边,方向顺着Y轴
# 两个控件关联
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
button_1 = tkinter.Button(text,text="上一章",font=20,compound="bottom",relief=tkinter.GROOVE)
button_2 = tkinter.Button(text,text="下一章",font=20,compound="right",relief=tkinter.GROOVE)
text.insert('end','n')
text.insert('end',' ')
text.window_create('end',window=button_1) #在文本末尾插入button_1
text.insert('end',' ')
text.window_create('end',window=button_2)
text.insert('end','n') #在文本末尾插入button_2
win.mainloop()
一个带有两个按键加滚动条的界面完成了,因为没有文字内容,所以在文本末尾插入按键,此时按键看起来并不像在末尾,而像是在开头,接下来,就是要把小说内容填充进界面
import tkinter
import requests # 导入requests包
from bs4 import BeautifulSoup
url = 'http://m.26ksw.cc/book/57659/54059141/2.html'
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'ec-ch-ua':'Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"','ec-ch-ua-mobile':'?0'
}
win = tkinter.Tk()
frame_1 = tkinter.Frame(win)
frame_1.pack(fill=tkinter.BOTH, expand=tkinter.YES)
win.title('带滚动条text控件')
text = tkinter.Text(frame_1,font=('微软雅黑',18)) #设置文本字体种类及大小
text.config(fg="blue")
text.pack(fill=tkinter.BOTH, expand=tkinter.YES)
scroll = tkinter.Scrollbar(text) #以text组件为父组件创建滚轮组件
scroll.pack(side=tkinter.RIGHT,fill=tkinter.Y) #将滚轮组件放到父组件的右边,方向顺着Y轴
# 两个控件关联
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
strHtml = requests.get(url,headers=headers)
html = strHtml.text
bf = BeautifulSoup(html,"html.parser")
texts = bf.find_all('p', class_='content_detail')
lent = len(texts)
for i in range(lent):
text.insert(tkinter.INSERT,texts[i].text) #将小说内容插入文本
button_1 = tkinter.Button(text,text="上一章",font=20,compound="bottom",relief=tkinter.GROOVE)
button_2 = tkinter.Button(text,text="下一章",font=20,compound="right",relief=tkinter.GROOVE)
text.insert('end','n')
text.insert('end',' ')
text.window_create('end',window=button_1) #在文本末尾插入button_1
text.insert('end',' ')
text.window_create('end',window=button_2)
text.insert('end','n') #在文本末尾插入button_2
win.mainloop()
内容已经放进界面了,最后把基于python简易小说阅读器(一)中获取相邻章节内容的代码与按键连接,实现按键切换章节的功能,这里说一下章节切换的页面处理,简单来说就是,把当前界面的内容删除,获取下一章节内容重新插入界面
import tkinter
import requests # 导入requests包
from bs4 import BeautifulSoup
global html, win, text, now
def Endbutton(): #创建按键,关联章节切换函数,在文本末尾插入按键
button_1 = tkinter.Button(text,text="上一章",font=20,relief=tkinter.GROOVE, command = Upchapter)
button_2 = tkinter.Button(text,text="下一章",font=20,relief=tkinter.GROOVE, command = Downchapter)
text.insert('end','n')
text.insert('end',' ')
text.window_create('end',window=button_1)
text.insert('end',' ')
text.window_create('end',window=button_2)
text.insert('end','n')
def getcontent(temp, content): #抓取本页小说内容
bf_1 = BeautifulSoup(temp,"html.parser")
tle = bf_1.find_all('span', class_='title')
title = tle[0].text.split("n")
win.title(title[2])
texts = bf_1.find_all('p', class_='content_detail')
lent = len(texts)
for i in range(lent):
content.insert(tkinter.INSERT,texts[i].text)
Endbutton()
def delcontent(): #删除界面所有内容,包括按键
text.delete("1.0","end")
def Upchapter(): #切换到上一章/页
global html
global now
delcontent()
bf_1 = BeautifulSoup(html,"html.parser")
texts = bf_1.find_all('p',class_='Readpage')
bt = BeautifulSoup(str(texts[0]),"html.parser")
a = bt.find_all("a")
if now == 'http://m.26ksw.cc/book/57659/51229417.html': #判断当前页是否为第一页
strHtml = requests.get(now)
html = strHtml.text
getcontent(html,text)
return
else :
now = source+a[0].get("href")
nextchapter=requests.get(source+a[0].get("href"))
content = nextchapter.text
html = content
getcontent(content,text)
def Downchapter(): #切换到下一章/页
global html, now
delcontent()
bf_1 = BeautifulSoup(html,"html.parser")
texts = bf_1.find_all('p',class_='Readpage')
bt = BeautifulSoup(str(texts[0]),"html.parser")
a = bt.find_all("a")
if now == 'http://m.26ksw.cc/book/57659/54111726/2.html': #判断当前页是否为最后一页
strHtml = requests.get(now)
html = strHtml.text
getcontent(html,text)
return
else :
now = source+a[2].get("href")
nextchapter=requests.get(source+a[2].get("href"))
content = nextchapter.text
html = content
getcontent(content,text)
headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'ec-ch-ua':'Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"','ec-ch-ua-mobile':'?0'
}
now = "http://m.26ksw.cc/book/57659/51229417.html"
source="http://m.26ksw.cc"
win = tkinter.Tk()
text = tkinter.Text(win,font=('微软雅黑',18)) #设置文本字体种类及大小
text.config(fg="blue") #设置文本字体颜色
scroll = tkinter.Scrollbar(text) #以text组件为父组件创建滚轮组件
scroll.pack(side=tkinter.RIGHT,fill=tkinter.Y) #将滚轮组件放到父组件的右边,方向顺着Y轴
# 两个控件关联
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
strHtml = requests.get(now) # Get方式获取网页数据
html = strHtml.text #提取数据中字符串部分
getcontent(html,text)
text.pack(fill=tkinter.BOTH, expand=tkinter.YES)
win.mainloop()
上面的代码有两个地方要说明一下,第一,在切换章节/页的函数中,会判断当前页是否为第一页或者最后一页,一旦判断当前页是最后一页,点击下一章按钮,内容不会变化,反之,如果当前页是第一页,点击上一章按钮,也是一样;第二,代码开头global关键字定义的全局变量,在函数中不允许被直接修改,若要在函数中修改全局变量的值,则需要先声明变量
好了,简易的小说阅读器完成了,将这个代码拓展改变一下,配合python的文件操作,可以实现将下载小说内容,保存在文件中的功能。这里推一下这位博客主的博客



