是否可以在Tkinter消息小部件中显示超链接?

时间:2016-07-25 09:21:29

标签: python hyperlink tkinter rss feedparser

我正在创建一个新闻Feed程序,它使用Feedparser模块来读取Yahoo! RSS API,将密钥数据写入文本文件,然后显示在Tkinter GUI中组织的数据。

我在询问是否可以在文本文件/ Tkinter消息小部件中添加可点击的超链接。

我目前的想法是你可以编写以下列方式运行的代码:

  • 如果文本文件中的项目包含“http”,请将其设为超链接。

如果有人知道Pythonic的方法来实现这一点,或者知道实际上是否可行,请提供帮助。

感谢您的时间,这是我的代码:

def news_feed(event):
    ''' This function creates a new window within the main window, passes an event(left mouse click), and creates a text heading'''

    root = Toplevel(window)

    # Create a text heading and define its placement within the grid
    menu_heading = Label(root, text = 'News feed', font = 'bold')
    menu_heading.grid(row = 0, column = 0, columnspan = 3, pady = 4)

    # Create a variable of the selected radio button
    button_choice = IntVar()

    def selection():
        ''' This function gets the activated radio button and calls its corresponding function.'''

        # Get the value of the activated radio button, and call its corresponding function
        news_choice = button_choice.get()

        # If the user's choice is industry news, ask them which feed they would like (E.g. Stock market),
        if news_choice == 0:
            # grab the corresponding url segment to the user's feed choice from the dictionary,
            news_choice_url = news_areas[news_feed]
            # set the url variable using by inserting this segment into the API url,
            rss_url = feedparser.parse('https://au.finance.yahoo.com/news/' + news_choice_url + '/?format=rss')
            # and call the feed parsing function.
            parse_feed()
        # If the user's choice is the second button, call the company news function
        elif news_choice == 1:
            company_news()

    def read_news_file(news_feed_message):
        '''This function opens the companyNews text file and reads its contents, line by line'''
        with open('C:\\Users\\nicks_000\\PycharmProjects\\untitled\\SAT\\GUI\\Text Files\\companyNews.txt', mode='r') as inFile:
            news_data_read = inFile.read()
            print('\n')
        news_feed_message.configure(text = news_data_read)

    def parse_feed(news_feed_message, rss_url):
        ''' This function parses the Yahoo! RSS API for data of the latest five articles, and writes it to the company news text file'''

        # Define the RSS feed to parse from, as the url passed in of the company the user chose
        feed = feedparser.parse(rss_url)

        try:
            # Define the file to write the news data to the company news text file
            with open('C:\\Users\\nicks_000\\PycharmProjects\\untitled\\SAT\\GUI\\Text Files\\companyNews.txt', mode='w') as outFile:

                # Create a list to store the news data parsed from the Yahoo! RSS
                news_data_write = []
                # Initialise a count
                count = 0
                # For the number of articles to append to the file, append the article's title, link, and published date to the news_elements list
                for count in range(10):
                    news_data_write.append(feed['entries'][count].title)
                    news_data_write.append(feed['entries'][count].published)
                    article_link = (feed['entries'][count].link)
                    article_link = article_link.split('*')[1]
                    news_data_write.append(article_link)
                    # Add one to the count, so that the next article is parsed
                    count+=1
                    # For each item in the news_elements list, convert it to a string and write it to the company news text file
                    for item in news_data_write:
                        item = str(item)
                        outFile.write(item+'\n')
                    # For each article, write a new line to the company news text file, so that each article's data is on its own line
                    outFile.write('\n')
                    # Clear the news_elements list so that data is not written to the file more than once
                    del(news_data_write[:])
        finally:
            outFile.close()

        read_news_file(news_feed_message)

    def industry_news():
        ''' This function creates a new window within the main window, and displays industry news'''

        industry_window = Toplevel(root)
        Label(industry_window, text = 'Industry news').grid()

    def company_news():
        ''' This function creates a new window within the main window, and displays company news'''

        company_window = Toplevel(root)
        company_label = Label(company_window, text = 'Company news')
        company_label.grid(row = 0, column = 0, columnspan = 6)

        def company_news_handling(company_ticker):
            ''' This function gets the input from the entry widget (stock ticker) to be graphed.'''

            # set the url variable by inserting the stock ticker into the API url,
            rss_url = ('http://finance.yahoo.com/rss/headline?s={0}'.format(company_ticker))
            # and call the feed parsing function.
            parse_feed(news_feed_message, rss_url)

        # Create the entry widget where the user enters a stock ticker, and define its location within the grid
        company_ticker_entry = Entry(company_window)
        company_ticker_entry.grid(row = 1, column = 0, columnspan = 6, padx = 10)

        def entry_handling():
            '''This function validates the input of the entry box, and if there is nothing entered, an error is outputted until a value is'''

            # Create a variable that equals the input from the entry widget
            company_ticker = company_ticker_entry.get()

            # Convert the input into a string
            company_ticker = str(company_ticker)

            if company_ticker == '':
                news_feed_message.configure(text = 'Please input a stock ticker in the entry box.')
            else:
                company_news_handling(company_ticker)

        # Create the button that the user presses when they wish to graph the data of the stock ticker they inputted in the entry widget
        graph_button = Button(company_window, text = 'SHOW', command = entry_handling, width = 10).grid(row = 2, column = 0, columnspan = 6)

        news_feed_message = Message(company_window, text='', width=500, borderwidth=5, justify=LEFT, relief=RAISED)
        news_feed_message.grid(row=3, column=0, columnspan=6)

2 个答案:

答案 0 :(得分:1)

我在tkinter应用程序中看到的大多数超链接用途都涉及使用webbrowser并将事件附加到你的tkinter对象来触发回调,但可能有更简单的方法,但是我的意思是:

from tkinter import *
import webbrowser

def callback(event):
    webbrowser.open_new(r"http://www.google.com")

root = Tk()
link = Label(root, text="Google Hyperlink", fg="blue", cursor="hand2")
link.pack()
link.bind("<Button-1>", callback)
root.mainloop()

从此source

你可以像你说的那样做,并从文本文件中读取,如果该行包含“http”,则创建一个新标签和事件,将超链接从文件附加到事件。

import re

with open(fname) as f:
    content = f.readlines()
    urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', content)

在此之后访问网址并生成您的标签或您附加网址的任何小部件,然后您可以在点击时打开所有网页。

希望这在某种程度上有所帮助,如果您需要更多帮助,请告诉我们。)

答案 1 :(得分:0)

The output

我认为使用以下链接在tkinter中创建超链接很容易,并且可以根据您的要求轻松修改

Updated Hyperlink in tkinter

希望这适合你。

对Midhun的看法