📜  一个带有 Tkinter 和 Newsapi 的简单新闻应用程序(1)

📅  最后修改于: 2023-12-03 15:21:26.121000             🧑  作者: Mango

一个带有 Tkinter 和 Newsapi 的简单新闻应用程序

概述

这是一个使用 Tkinter 和 Newsapi 构建的简单的新闻应用程序。它可以通过 Newsapi API 获取最新的国内、国际、科技和体育新闻,并将它们展示在用户界面上。

需求
  • Tkinter:Python GUI 工具包
  • Newsapi:新闻数据 API
功能
  • 用户可以在几种新闻选项中进行选择:国内、国际、科技和体育。
  • 应用程序将使用 Newsapi 获取最新的相关新闻。
  • 选择的所有新闻都将在用户界面上显示出来。
  • 用户可以通过单击新闻标题来查看新闻的详细内容。
  • 用户可以轻松地退出应用程序。
代码
import tkinter as tk
import webbrowser
from newsapi import NewsApiClient

# 初始化 Newsapi 客户端
newsapi = NewsApiClient(api_key='your_api_key')

# 创建主窗口
root = tk.Tk()
root.title('简单新闻应用程序')

# 新闻显示区域
news_frame = tk.Frame(root, padx=10, pady=10)
news_frame.pack()

# 新闻选项卡
options_frame = tk.Frame(root)
options_frame.pack()

# 新闻选项
option_dict = {'国内': 'cn', '国际': 'en', '科技': 'technology', '体育': 'sports'}

# 创建新闻选项卡按钮
option_buttons = []
for option in option_dict:
    button = tk.Button(options_frame, text=option, width=10, pady=5)
    button.pack(side=tk.LEFT, padx=5)
    option_buttons.append(button)

# 获取新闻的功能函数
def get_news(category):
    news = newsapi.get_top_headlines(category=category)
    return news['articles']

# 显示新闻在用户界面上
def show_news(news_list):
    for widget in news_frame.winfo_children():
        widget.destroy()
    for news in news_list:
        link = news['url']
        title = news['title']
        author = news['source']['name']

        title_label = tk.Label(news_frame, text=title, foreground='blue')
        title_label.pack(anchor='w')
        title_label.bind('<Button-1>', lambda e, l=link: webbrowser.open(l))
        author_label = tk.Label(news_frame, text=author)
        author_label.pack(anchor='w')

# 显示默认新闻
news_list = get_news('en')
show_news(news_list)

# 绑定新闻选项卡按钮的事件处理程序
def option_button_clicked(index):
    category = list(option_dict.values())[index]
    news_list = get_news(category)
    show_news(news_list)

for i, button in enumerate(option_buttons):
    button.configure(command=lambda index=i: option_button_clicked(index))

# 主事件循环
root.mainloop()
解释
  • 我们首先导入 tkinterwebbrowser 模块。后者用于打开新闻文章的链接。
  • 我们还导入 newsapi 模块,它是我们用来与 Newsapi API 交互的主要工具。
  • 我们使用 NewsApiClient 类创建了一个实例,它需要我们向其提供我们的 Newsapi API 密钥。
  • 接下来,我们创建了我们的 Tkinter 主窗口,安排了新闻显示区域和选项区域的放置方式。
  • 我们的 option_dict 字典将选项的文本(国内、国际、科技和体育)映射到它们在 Newsapi API 中使用的类别。
  • 我们接着创建了 option_buttons 列表,其中包含了我们的选项。我们遍历了 option_dict,对于每个选项,创建了一个 Button 对象,并将其添加到选项区域中。我们还将每个按钮添加到 option_buttons 列表中,以便稍后使用。
  • 下一步,我们定义了 get_news 函数,该函数使用 Newsapi API 获取特定类别的前几条头条新闻。我们通过 Newsapi API 客户端调用 get_top_headlines 方法来实现这一点,并向其传递了我们的选项类别作为参数。该函数返回所有新闻的列表。
  • show_news 函数将新闻列表显示在新闻显示区域中。我们首先使用 winfo_children 方法来删除所有现有的新闻选项。然后,我们迭代我们的新闻列表,并为每个新闻创建了一个标签。我们将新闻标题设置为 Label 对象的文本,并为其设置前景颜色为蓝色(以示可点击)。我们还将副标题设置为新闻源的名称,并将其放置在标题标签下方。
  • 我们定义了 option_button_clicked 函数,该函数是被我们选项卡按钮单击触发的事件处理程序。该函数使用每个按钮的索引与 option_dict 中的键进行映射,以确定选择的选项卡类别。然后,它获取该类别的新闻,并将其传递给 show_news 函数来显示新闻。
  • 最后,我们为每个选项卡按钮绑定了一个 option_button_clicked 函数,并调用了 Tkinter 的 mainloop 方法来等待用户事件。
结论

这个简单的新闻应用程序向我们展示了如何使用 Tkinter 和 Newsapi 创建一个交互性良好的 GUI,以及如何使用 API 来获取和显示实时新闻。我们的应用程序向用户提供了几种不同的新闻选项,以及查看每个选项的最新新闻的方便方法。