Как заставить spinbox отображать список в текстовом поле? - Ткинтер - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь создать графический интерфейс агрегатора новостей, который отображает заголовки и даты публикации из сохраненного HTML-файла новостной ленты новостей. Я хочу, чтобы графический интерфейс отображал заголовки новостей «X» и даты публикации, если пользователь выбирает номер «X» в спин-боксе. Однако я не уверен, как использовать список с именем 'matchs', который создается в функции find_title в функции обратного вызова команды для спин-бокса news_1, поэтому он будет отображать только количество выбранных пользователем элементов. Это упражнение в курсе, и мне запрещено использовать Beautiful soup или другие специфические модули только RegEx, Tkinter и HTMLParser. Код выглядит следующим образом:

from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from html.parser import HTMLParser
import urllib.request as urllib2
import re


class Feedback:

    def __init__(self, master):


        master.title('The Python Press')
        master.resizable(False, False)
        master.configure(background = '#EBF5FB')

        self.style = ttk.Style()
        self.style.configure('TFrame', background = '#EBF5FB')
        self.style.configure('TButton', background = '#EBF5FB')
        self.style.configure('TLabel', background = '#EBF5FB', font = ('Arial', 10))
        self.style.configure('Header.TLabel', background = '#EBF5FB', font = ('Arial', 16, 'bold'))


        #Make header frame
        self.frame_header = ttk.Frame(master)
        self.frame_header.pack()

        #Make header frame widgets
        #self.logo = PhotoImage(file = 'news_logo.gif')
        #ttk.Label(self.frame_header, image = self.logo).grid(row=0, column =0, rowspan = 2, sticky = 'nw', ipadx = 10, ipady = 10)
        ttk.Label(self.frame_header, text = 'The Python Press', style = 'Header.TLabel').grid(row=0, column =1)
        ttk.Label(self.frame_header, text = 'Your daily dose of news ssssssstories!').grid(row=1, column =1) 


        #Make contents frame
        self.frame_content=ttk.Frame(master)
        self.frame_content.pack()

        #Make spinbox and label widgets
        ttk.Label(self.frame_content, text = 'News feeds:').grid(row=0, column =0, columnspan = 2, sticky = 'nw', ipadx = 20, ipady = 10)
        ttk.Label(self.frame_content, text = 'The Brisbane Times').grid(row=3, column =0, padx=5, pady=5)
        ttk.Label(self.frame_content, text = 'News site 2').grid(row=3, column =1, padx=5, pady=5)
        ttk.Label(self.frame_content, text = 'News site 3').grid(row=3, column =2, padx=5, pady=5)
        ttk.Label(self.frame_content, text = 'News site 4').grid(row=3, column =3, padx=5, pady=5)


        #Make spinboxes for each news feed
        news_1=Spinbox(self.frame_content, from_=0, to=10).grid(row=4, column =0, padx=5)
        news_2=Spinbox(self.frame_content, from_=0, to=10).grid(row=4, column =1, padx=5)
        news_3=Spinbox(self.frame_content, from_=0, to=10).grid(row=4, column =2, padx=5)
        news_4=Spinbox(self.frame_content, from_=0, to=10).grid(row=4, column =3, padx=5)


        #Make footer frame
        self.frame_footer = ttk.Frame(master)
        self.frame_footer.pack()

        #Make Export and clear buttons
        ttk.Button(self.frame_footer, text = 'Export Stories', command = self.export).grid(row=4, column=4, padx=10, pady=10)
        ttk.Button(self.frame_footer, text = 'Clear', command = self.clear).grid(row=4, column=3, padx=10, pady=10)

        #Make News feed field
        self.text_headlines = Text(self.frame_footer, width = 50, height = 10, command = self.show_article, font = ('Arial', 10))
        self.text_headlines.grid(row=1, columnspan=4, padx=10, pady=20)


    #Create submit command callback
    def export(self):
        messagebox.showinfo(title = 'The Python Press', message = 'Stories exported!')

    #Create clear command callback
    def clear(self):
        self.text_headlines.delete(1.0, 'end')

    #Find the article titles and publication dates from saved html file
    def find_title():
        matches = []
        htmlFile = open("brisbane_times.html")
        htmlData= htmlFile.read()
        pattern = ("<title.*?>(.+?)</title>|<pubDate.*?>(.+?)</pubDate>")
        htmlFile.close()
        matches = re.findall(pattern, htmlData)
        print(matches)

    #Create command callback to show number of articles from spinbox
    def show_article(event = None):
        #Clear text field
        self.text_headlines.delete(0.0, END)
        #How many articles to search for
        article_no= news_1.get()
        matches = find_title(article_no)
        #Display results
        if len(matches) == 0:
            self.text_headlines.insert(END, 'No articles found')
        else:
            for title in matches:
                results.insert(END, matches)


def main():            

    root = Tk()
    feedback = Feedback(root)
    root.mainloop()

if __name__ == "__main__": main()
...