2016-07-25 104 views
0

我正在创建一个新闻Feed程序,该程序使用Feedparser模块来阅读Yahoo! RSS API,将关键数据写入文本文件,然后显示组织在Tkinter GUI中的数据。是否可以在Tkinter消息小部件中显示超链接?

我在询问是否可以在文本文件/ Tkinter消息窗口中有可点击的超链接。

我现在的想法是,你可以写在下面的方式运行代码:

  • 如果在文本文件中项目包括“HTTP”,使它成为一个超链接。

如果有人知道Pythonic的方法来实现这一点,或知道它是否实际上不可能,请捐助。

谢谢您的时间,这里是我的代码:在Tkinter的应用程序,我已经看到了有关使用WebBrowser和附加事件添加到您的Tkinter对象触发回调超链接

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) 

回答

1

大多数用途,但有可能是更简单的方法,但继承人我的意思:

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]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', content) 

访问后,该URL的并生成标签的或任何插件,你将网址的太多,然后你可以点击时他们都打开网页。

希望这有助于以某种方式,让我知道如果你需要更多的帮助:)

0

The output

我认为这是很容易使用下面的链接,它很容易修改为每创造Tkinter的超级链接您的要求

Updated Hyperlink in tkinter

希望这对你的作品。

关于Midhun

+0

“tkinter中的超链接”将我带到与tkinter中的超链接无关的页面。 –

+0

我更新了链接签出。 –