百度贴吧帖子搜索器-升级版
上一篇博文里,使用了bs4做成了第一版的百度贴吧帖子搜索器,但是界面仍为dos,实在是不美观。这几天学习了一下tkinter,然后在原有的基础上添加了一些框架,就成了升级版V3。
一、Tkinter简介
Tkinter
是用来为python添加可视化界面的库,相对于其他的几个库,如PyQt
、wxPython
等,Tkinter
具有操作简单、易于上手的优点,很适合初学者使用。
一般而言,写好的Python程序,如果不使用GUI的话,大概会是这个样子的:
而如果使用了GUI,则会产生鸟枪换炮的感觉,大概是这个样子的:
操作起来也很方便,就像平时使用的.exe
一样,具体效果看下面动图:
所以,我们的目标就是,把原来的dos
,变成GUI
,那么具体应该怎么做呢?
二、新增组件
由于Tkinter的组件较多,这里给想学习的小伙伴们推荐几个很不错的网址。
来自知乎:“为什么很多Python开发者写GUI不用Tkinter,而要选择PyQt和wxPython或其他?”。需要看的是这个人(Naples)的回答,和他推荐的这本书《Python GUI Programming Cookbook》。
来自csdn:第一个有些地方我这里无法使用,比如加入
text文本框
等等,于是,我又去参考了这个博客:“Python GUI编程(Tk)–聊天窗口–键盘值查询”。
以上两个看完之后,自己写点小程序练练手,就可以着手改进了。首先,我们看一下改进后的界面:
该界面主要由以下几个部分组成,分别是外层框Label1,Menu菜单栏,内层框Label2,3个文字Label,3个空白文本框 以及2个Button。
外层框的语句直接使用如下python
语句即可,产生一个大的框架。
win = tk.Tk()
win.title('帖子搜索器beta1.0')
接下来,Menu则需要加入较多的重复性代码,这是因为我们的Menu菜单下包含了很多个fileMenu,而每个fileMenu也需要分别定义点击动作,具体如下图所示:
代码实现如下(仅以新建
为例):
menuBar = Menu(win)
win.config(menu = menuBar)
fileMenu = Menu(menuBar, tearoff = 0)
fileMenu.add_command(label = '新建', command = _msgBox2)
其中,tearoff = 0
表示去除最上方的虚线(用于另外产生窗口);_msgBox2
则是单击指令,定义为:
def _msgBox2():
mBox.showinfo('欢迎来到我的酒馆', '功能尚在开发中')
点击后,会弹出相应窗口(由于复杂的功能没有开发,所以先偷个懒,写了一行这个^_^|||)。
定义好了Menu
,就可以开始写下面的子框架了。第二个框架的代码如下:
# 设置小Label
monty = ttk.LabelFrame(win, text = ' 当你畏惧一样东西的时候,你不会去触碰他 ')
monty.grid(column = 3, row = 0, columnspan = 2, padx = 20, pady = 10)
其中,monty
是第二个框架的名称,ttk
是Tkinter
中所包含的组件,grid
用于设置组件未知信息。
这里子框架的标题我用了这样一句话:
当你畏惧一样东西的时候,你不会去触碰他
这句话是在乔布斯发布iMac
时,苹果公司的专属设计师艾尼所说。然后他在显示器上方设计了一个提手,使它看上去就像是一个菜篮子一样让人感到亲切。
框架下方的语句Label和文本框则是重点,具体代码在下面(也仅以请输入贴吧名称:
为例):
# 设置名称输入
ttk.Label(monty, text = "请输入贴吧名称:").grid(column = 0, row = 0, columnspan = 2, sticky = 'W')
name = tk.StringVar()
nameEntered = ttk.Entry(monty, width = 20, textvariable = name)
nameEntered.focus()
nameEntered.grid(column = 2, row = 0, columnspan = 4, sticky = tk.W)
其中,Entry
是单行的文本输入框(与其相对应的是多行文本输入框text
);focus
用来将光标定位在本行。
接下来是多行文本输入框text
,代码如下所示:
ttk.Label(monty, text = "查询结果显示:").grid(column = 0, row = 2, columnspan = 2, sticky = tk.W)
S = tk.Scrollbar(monty)
T = tk.Text(monty, height = 10, width = 40)
T.grid(column = 1, row = 3, columnspan = 4, padx = 10, pady = 10, sticky = tk.N)
S.config(command = T.yview)
T.config(yscrollcommand = S.set)
这里,需要注意的是S = tk.Scrollbar(monty)
,添加了这个语句用来是文本框产生滚动效果,否则所接收到的文本信息超出文本框范围后会无法显示。
最后呢,就是两个Button 的设置了,一个用于产生搜索的动作,另一个则用于退出程序,代码如下:
def clickMe():
T.delete(1.0, tk.END)
baseURL = 'https://tieba.baidu.com/f?kw='
schoolNAME = name.get()
keyWords = keyword.get()
# print("schoolName:" + schoolNAME + " Keywords:" + keyWords)
bdtb = BDTB(baseURL,schoolNAME,schoolNAME,keyWords)
T.insert(END, "[" + schoolNAME + "]" + "\n")
# 搜索前50页
for page in list(range(50)):
bdtb.getPage(page)
print(page)
# T.insert(END, schoolNAME)
# T.insert(END, "标题:" + str(li[1]))
# T.insert(END, "网址:" + str(li[0]))
if page != 49:
ttk.Label(monty, text = "拼命搜索中,请稍等...").grid(column = 2, row = 2)
else:
ttk.Label(monty, text = "搜索完成,请查阅。").grid(column = 2, row = 2)
action = ttk.Button(monty, text = "搜索", command = clickMe)
action.grid(column = 1, row = 4, pady = 5)
exit = ttk.Button(monty, text = "退出", command = _quit)
exit.grid(column = 2, row = 4, pady = 5)
在最后添加上win.mainloop()
,使程序循环起来,程序的基本框架就搭好了。
特别强调两点:
在程序开头和末尾分别添加如下语句,用来检测程序的错误。
开头:
import os
结尾:os.system("pause")
这样做的好处是,使用cmd运行后,程序如果编译不正确不会出现闪退的情况,而会暂停,让你可以看到出现的错误,很适合调试。
在程序的
win.mainloop()
和os.system("pause")
之间添加语句input()
,如果使用的是python2,则请添加语句raw_input()
。否则,程序只能在python自带的IDLE中运行,而无法在cmd下运行。
三、源码查看
完整源码,请访问百度贴吧帖子搜索器升级版-源码进行查看。
四、补充说明
为了能够在别的计算机上运行,我依然将该代码打包成了EXE文件,具体打包方法可以查看我的上一篇博文“Python3实现百度贴吧帖子搜索”。
但是糟糕的是,打包后的软件居然有9.86Mb,真心大。于是乎使用了UPX进行压缩,但是压缩结果也是惊人的。。。。。。让人难过,只压缩了98.9%,变成了9.83Mb。
好吧,就当是beta版本。由于需要和网络连接,所以软件运行过程中经常会出现下面这个情况。
是的,没有错,就是 “未响应”。这种情况下,其实仍在运行,只是它卡了,等一会结果就会出来,出来之后大概会是这个样子:
相关的帖子标题和网址都会显示在下面的文本框中,而且会生成一份txt
文档,静静的躺在该软件的目录下。