百度贴吧帖子搜索器-升级版

百度贴吧帖子搜索器-升级版

上一篇博文里,使用了bs4做成了第一版的百度贴吧帖子搜索器,但是界面仍为dos,实在是不美观。这几天学习了一下tkinter,然后在原有的基础上添加了一些框架,就成了升级版V3。

一、Tkinter简介

Tkinter是用来为python添加可视化界面的库,相对于其他的几个库,如PyQtwxPython等,Tkinter具有操作简单、易于上手的优点,很适合初学者使用。

一般而言,写好的Python程序,如果不使用GUI的话,大概会是这个样子的:

cmd

而如果使用了GUI,则会产生鸟枪换炮的感觉,大概是这个样子的:

GUI

操作起来也很方便,就像平时使用的.exe一样,具体效果看下面动图:

动图

所以,我们的目标就是,把原来的dos,变成GUI,那么具体应该怎么做呢?

二、新增组件

由于Tkinter的组件较多,这里给想学习的小伙伴们推荐几个很不错的网址。

  1. 来自知乎:“为什么很多Python开发者写GUI不用Tkinter,而要选择PyQt和wxPython或其他?”。需要看的是这个人(Naples)的回答,和他推荐的这本书《Python GUI Programming Cookbook》

  2. 来自csdn:第一个有些地方我这里无法使用,比如加入text文本框等等,于是,我又去参考了这个博客:“Python GUI编程(Tk)–聊天窗口–键盘值查询”

以上两个看完之后,自己写点小程序练练手,就可以着手改进了。首先,我们看一下改进后的界面:

改进后的界面

该界面主要由以下几个部分组成,分别是外层框Label1Menu菜单栏内层框Label23个文字Label3个空白文本框 以及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是第二个框架的名称,ttkTkinter中所包含的组件,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文档,静静的躺在该软件的目录下。

发布了21 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/fIsh1220Fish/article/details/77949432
今日推荐