2017-05-07 100 views
0

我試圖讓Feedparser從右向左滾動屏幕。我正在使用PyQt5,我不知道如何去添加此功能。 我想顯示低於在PyQt中滾動文本?

import feedparser 
sports = feedparser.parse('http://rssfeeds.usatoday.com/UsatodaycomSports-TopStories') 
for e in sports['entries']: 
news = (e.get('title', '')) 

我正在尋找一個連續滾動,直到所有的新聞頭條都讀出,然後重新加載頁面以獲取最新的頭條新聞或只是重讀什麼已經存在。謝謝!

回答

2

您可以使用QTimeLine在標籤中顯示連續滾動的新聞片段。我實施它在一個小gui來嘗試,如果應用程序中的其他功能被阻止,而QTimeLine正在運行:

import feedparser 
import sys 
from PyQt5 import QtWidgets, QtCore 

class MyWidget(QtWidgets.QWidget): 
    def __init__(self, parent = None): 
     QtWidgets.QWidget.__init__(self, parent) 
     self.setGeometry(200, 200, 800, 600) 
     self.textLabel = QtWidgets.QLabel('')    # label showing some text 
     self.uButton = QtWidgets.QPushButton('upper Button')  
     self.lButton = QtWidgets.QPushButton('lower Button') 
     self.label = QtWidgets.QLabel('')     # label showing the news 
     self.label.setAlignment(QtCore.Qt.AlignRight)   # text starts on the right 
     self.layout = QtWidgets.QVBoxLayout() 
     self.layout.addWidget(self.textLabel) 
     self.layout.addWidget(self.uButton) 
     self.layout.addWidget(self.lButton) 
     self.layout.addWidget(self.label) 
     self.layout.setStretch(0, 3) 
     self.layout.setStretch(1, 3) 
     self.layout.setStretch(2, 3) 
     self.layout.setStretch(3, 1)   
     self.setLayout(self.layout) 

     self.timeLine = QtCore.QTimeLine() 
     self.timeLine.setCurveShape(3)     # linear Timeline 
     self.timeLine.frameChanged.connect(self.setText) 
     self.timeLine.finished.connect(self.nextNews)   
     self.signalMapper = QtCore.QSignalMapper(self) 
     self.signalMapper.mapped[str].connect(self.setTlText) 
     self.uButton.clicked.connect(self.signalMapper.map) 
     self.signalMapper.setMapping(self.uButton, self.uButton.text()) 
     self.lButton.clicked.connect(self.signalMapper.map) 
     self.signalMapper.setMapping(self.lButton, self.lButton.text()) 

     self.feed() 

    def feed(self): 
     fm = self.label.fontMetrics() 
     self.nl = int(self.label.width()/fm.averageCharWidth())  # shown stringlength 
     news = [] 
     sports = feedparser.parse('http://rssfeeds.usatoday.com/UsatodaycomSports-TopStories') 
     for e in sports['entries']: 
      news.append(e.get('title', '')) 
     appendix = ' '*self.nl      # add some spaces at the end 
     news.append(appendix) 
     delimiter = '  +++  '     # shown between the messages 
     self.news = delimiter.join(news) 
     newsLength = len(self.news)     # number of letters in news = frameRange 
     lps = 4         # letters per second 
     dur = newsLength*1000/lps    # duration until the whole string is shown in milliseconds           
     self.timeLine.setDuration(dur) 
     self.timeLine.setFrameRange(0, newsLength) 
     self.timeLine.start() 

    def setText(self, number_of_frame): 
     if number_of_frame < self.nl: 
      start = 0 
     else: 
      start = number_of_frame - self.nl 
     text = '{}'.format(self.news[start:number_of_frame])   
     self.label.setText(text) 

    def nextNews(self): 
     self.feed()        # start again 

    def setTlText(self, text): 
     string = '{} pressed'.format(text) 
     self.textLabel.setText(string) 

if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    widget = MyWidget() 
    widget.show() 
    sys.exit(app.exec_())