用wxPython创建GUI应用程序展示NASA图片(第三部分)
regular_search.py脚本
regular_search模块包含重构的ObjectListView,用于显示搜索结果,其上还包含下载按钮。
下面这些方法/类由于已经在前面提及,这里将不再阐述:
- on_download()
- on_selection()
- update_image()
- update_search_results()
- The Result class
下面是模块中的前几行:
这里导入了version_1中的nasa_search_ui.py的全部模块,同时还需要使用base_url向NASA的图像API发送请求。唯一新导入的是pubsub。
接下来创建RegularSearch类:
此代码将search_results列表初始化为空并设置图像的max_size。它还设置了一个sizer和ObjectListView部件,用于向用户展示搜索结果。当所有类组合在一起时,代码实际上非常类似于代码的第一次迭代。
以下是__init__()的其余代码:
首先在main_sizer中添加一个spacer。然后添加标题和图像相关部件,最后添加一个下载按钮。
接下来,需要编写一个新方法:
reset_image()方法用于将wx.StaticBitmap重置为空。当用户先使用常规搜索,再使用高级搜索时,可能会发生这种情况。重制图像可避免用户看到之前的选择内容而感到困惑。
最后需要实现的方法是load_search_results():
当使用pubsub时,将调用load_search_results()方法。main和advanced_search模块通过传递请求参数来调用,然后将结果编码为格式化的URL。接下来使用requests发送JSON请求,然后提取结果。此时也会调用reset_image()方法,以便在加载一组新结果时,不会选择任何内容。
接下来就可以实现高级搜索了!
advanced_search.py脚本
advanced_search模块作为wx.Panel,包含对NASA API进行高级搜素所需的全部部件。如果您阅读他们的文档,您会发现大约有十几个过滤器可以用于搜索。
让我们从最上层开始:
设置各种过滤器的代码非常相似,为过滤器创建一个文本控件,然后将其与一个字符串传递给ui_helper(),该字符串是文本控件的标签。重复上述步骤,直到完成所有的设置。
以下是其余的过滤器:
最后,将sizer设置为main_sizer。注意,并非所有NASA API中的过滤器都在此代码中实现。例如,我并没有添加media_type,因为此应用只用于图像搜索。但是,如果需要搜索视频或音频,可以更新此程序。此外,year_start和year_end也未实现。如果需要,可随时添加。
下面将实现ui_helper()方法:
ui_helper()用于标签文本和文本控制部件,然后创建一个wx.BoxSizer和wx.StaticText。由于传入文本控制部件,wx.StaticText被添加进sizer。最后,将新的sizer添加到main_sizer中。这是减少冗余代码的好方法。
最后在类中需要创建on_search():
当用户按下“搜索”按钮时,将调用此事件处理程序。它根据用户输入字段作为查询条件进行搜索,然后程序将通过pubsub发送两条消息。第一条消息将更新UI,以便隐藏高级搜索并显示搜索结果。第二条消息则执行对NASA API的搜索。
高级搜索页面的样式如下:
接下来将更新下载对话框。
download_dialog.py脚本
下载对话框有几处小更改,需要导入Python的os模块并更新save()函数。
在函数的开头添加如下代码:
添加此代码是为了说明用户在保存文件名中未指定扩展名的情况。
打包
本文涵盖了许多有趣的新内容,讲述了一种没有Python包的情况下使用开放式API的方法。通过本文,您了解到阅读API文档的重要性,学习了如何实现用户界面。此外,还掌握了如何解析JSON以及下载图像。
尽管本文未曾提及,Python提供一个json模块用于解析。
当然,此应用程序还存在可完善的地方:
- 缓存搜索结果
- 在后台下载缩略图
- 在后台下载链接
可以利用线程下载缩略图和较大的图像以及一般的Web请求,这有助于改善程序性能。您可能已经注意到,程序存在响应缓慢的问题,这取决于您的网络状况。这是因为当执行Web请求或下载文件时,它会阻塞UI的主循环。如果发生类似情况,建议使用线程。
代码下载
- 源码由tarball打包
相关阅读
- 基于wxPython实现计算器
- 如何分发wxPython应用程序