在PyQt中滚动文字? [英] Scrolling Text in PyQt?

查看:141
本文介绍了在PyQt中滚动文字?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使feedparser中的文本从右向左在屏幕上滚动.我正在使用PyQt5,不确定如何添加此功能. 我想显示的是下面的

I'm trying to have text from feedparser scroll across the screen from right to left. I'm using PyQt5, I'm not sure how to go about adding this feature. What I want to display is below

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

我正在寻找一个连续的滚动,直到阅读完所有新闻标题,然后重新加载页面以获取最新的标题,或者只是重新阅读已有的内容.谢谢!

I'm looking for a continuous scrolling until all the news headlines are read and then the page is reloaded to get the most recent headlines or just reread whats already there. Thanks!

推荐答案

您可以使用QTimeLine在标签中显示新闻的连续滚动片段.如果QTimeLine运行时应用程序中的其他功能被阻止,我会在一个GUI中实现它以进行尝试:

You can use QTimeLine to show a continously scrolling slice of the news in a label. I implemented it in a little gui to try, if other functions in the app are blocked while QTimeLine is running:

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(QtCore.QTimeLine.LinearCurve)                   # 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_())

添加PySide2版本:

Add PySide2 version:

import feedparser
import sys
from PySide2 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(QtCore.QTimeLine.LinearCurve)                  # 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_())

这篇关于在PyQt中滚动文字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆