2016-07-25 106 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

我更新了鏈接簽出。 –