Я пытаюсь создать графический интерфейс агрегатора новостей, который отображает заголовки и даты публикации из сохраненного 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()