用wxPython创建GUI应用程序展示NASA图片(第三部分)

regular_search.py脚本

regular_search模块包含重构的ObjectListView,用于显示搜索结果,其上还包含下载按钮。

下面这些方法/类由于已经在前面提及,这里将不再阐述:

  • on_download()
  • on_selection()
  • update_image()
  • update_search_results()
  • The Result class

下面是模块中的前几行:

用wxPython创建GUI应用程序展示NASA图片(第三部分)

这里导入了version_1中的nasa_search_ui.py的全部模块,同时还需要使用base_url向NASA的图像API发送请求。唯一新导入的是pubsub。

接下来创建RegularSearch类:

用wxPython创建GUI应用程序展示NASA图片(第三部分)

此代码将search_results列表初始化为空并设置图像的max_size。它还设置了一个sizer和ObjectListView部件,用于向用户展示搜索结果。当所有类组合在一起时,代码实际上非常类似于代码的第一次迭代。

以下是__init__()的其余代码:

用wxPython创建GUI应用程序展示NASA图片(第三部分)

首先在main_sizer中添加一个spacer。然后添加标题和图像相关部件,最后添加一个下载按钮。

接下来,需要编写一个新方法:

用wxPython创建GUI应用程序展示NASA图片(第三部分)

reset_image()方法用于将wx.StaticBitmap重置为空。当用户先使用常规搜索,再使用高级搜索时,可能会发生这种情况。重制图像可避免用户看到之前的选择内容而感到困惑。

最后需要实现的方法是load_search_results():

用wxPython创建GUI应用程序展示NASA图片(第三部分)

当使用pubsub时,将调用load_search_results()方法。main和advanced_search模块通过传递请求参数来调用,然后将结果编码为格式化的URL。接下来使用requests发送JSON请求,然后提取结果。此时也会调用reset_image()方法,以便在加载一组新结果时,不会选择任何内容。

接下来就可以实现高级搜索了!

advanced_search.py脚本

advanced_search模块作为wx.Panel,包含对NASA API进行高级搜素所需的全部部件。如果您阅读他们的文档,您会发现大约有十几个过滤器可以用于搜索。

让我们从最上层开始:

用wxPython创建GUI应用程序展示NASA图片(第三部分)

设置各种过滤器的代码非常相似,为过滤器创建一个文本控件,然后将其与一个字符串传递给ui_helper(),该字符串是文本控件的标签。重复上述步骤,直到完成所有的设置。

以下是其余的过滤器:

用wxPython创建GUI应用程序展示NASA图片(第三部分)

最后,将sizer设置为main_sizer。注意,并非所有NASA API中的过滤器都在此代码中实现。例如,我并没有添加media_type,因为此应用只用于图像搜索。但是,如果需要搜索视频或音频,可以更新此程序。此外,year_start和year_end也未实现。如果需要,可随时添加。

下面将实现ui_helper()方法:

用wxPython创建GUI应用程序展示NASA图片(第三部分)

ui_helper()用于标签文本和文本控制部件,然后创建一个wx.BoxSizer和wx.StaticText。由于传入文本控制部件,wx.StaticText被添加进sizer。最后,将新的sizer添加到main_sizer中。这是减少冗余代码的好方法。

最后在类中需要创建on_search():

用wxPython创建GUI应用程序展示NASA图片(第三部分)

当用户按下“搜索”按钮时,将调用此事件处理程序。它根据用户输入字段作为查询条件进行搜索,然后程序将通过pubsub发送两条消息。第一条消息将更新UI,以便隐藏高级搜索并显示搜索结果。第二条消息则执行对NASA API的搜索。

高级搜索页面的样式如下:

用wxPython创建GUI应用程序展示NASA图片(第三部分)

接下来将更新下载对话框。

download_dialog.py脚本

下载对话框有几处小更改,需要导入Python的os模块并更新save()函数。

在函数的开头添加如下代码:

用wxPython创建GUI应用程序展示NASA图片(第三部分)

添加此代码是为了说明用户在保存文件名中未指定扩展名的情况。

打包

本文涵盖了许多有趣的新内容,讲述了一种没有Python包的情况下使用开放式API的方法。通过本文,您了解到阅读API文档的重要性,学习了如何实现用户界面。此外,还掌握了如何解析JSON以及下载图像。

尽管本文未曾提及,Python提供一个json模块用于解析。

当然,此应用程序还存在可完善的地方:

  • 缓存搜索结果
  • 在后台下载缩略图
  • 在后台下载链接

可以利用线程下载缩略图和较大的图像以及一般的Web请求,这有助于改善程序性能。您可能已经注意到,程序存在响应缓慢的问题,这取决于您的网络状况。这是因为当执行Web请求或下载文件时,它会阻塞UI的主循环。如果发生类似情况,建议使用线程。

代码下载

  • 源码由tarball打包

相关阅读

  • 基于wxPython实现计算器
  • 如何分发wxPython应用程序
英文原文:https://www.blog.pythonlibrary.org/2019/04/18/creating-a-gui-application-for-nasas-api-with-wxpython/ 译者:我是昵称耶~

相关推荐