如何在QTextEdit中自动滚动文本(动画效果)?

2024-04-28

我想问一下如何让QTextEdit中的文字滚动,达到动画效果。动画效果应该类似于视频中所示的效果:https://www.youtube.com/watch?v=MyeuGdXv4XM https://www.youtube.com/watch?v=MyeuGdXv4XM

使用 PyQt 我想得到这样的效果: 文本应以 2 行/秒的速度自动向下滚动,直到到达末尾并停止。

在下面的代码中,当单击按钮时,文本将显示在 QTextEdit-Widget 中。文字很长,所以会出现滚动条。

我的问题: 我不知道如何制作动画效果。因此我想请求您帮助纠正我的代码。

# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

import sys
import time


list_longText = [" long text 1 - auto scrolling " * 1000, " long text 2 - auto scrolling " * 2000]

class Worker(QObject):
    finished = pyqtSignal()
    strTxt = pyqtSignal(str)

    def __init__(self, parent=None):
        super(Worker, self).__init__(parent)

    @pyqtSlot()
    def onJob(self):
        for i in range(2):
            self.strTxt.emit(list_longText[i])
            time.sleep(2)

class MyApp(QWidget):
    def __init__(self):
        super(MyApp, self).__init__()
        self.setFixedSize(600, 400)
        self.setObjectName("window")

        self.initUI()


    def initUI(self):

        self.txt = QTextEdit("", self)
        self.btn = QPushButton("Button", self)
        self.btn.clicked.connect(self.start)

        self.layout = QHBoxLayout(self)
        self.layout.addWidget(self.txt)
        self.layout.addWidget(self.btn)
        self.setLayout(self.layout)

        self.show()

    def start(self):
        self.thread = QThread()
        self.obj = Worker()

        self.obj.strTxt.connect(self.showText)
        self.obj.moveToThread(self.thread)
        self.obj.finished.connect(self.thread.quit)
        self.thread.started.connect(self.obj.onJob)
        self.thread.start()

    def showText(self, str):
        self.txt.setText("{}".format(str))
        self.autoScroll()

    def autoScroll(self):
        vsb = self.txt.verticalScrollBar()
        if vsb.value() <= vsb.maximum():
            vsb.setValue(vsb.value() + 2)
            time.sleep(1)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    sys.exit(app.exec_())

非常感谢您的帮助!


你想要的任务并不繁重,它是周期性的,所以使用线程是不合适的,对于这个任务我们可以使用QVariantAnimation.

另一部分是创建一个移动到我们使用的特定文本行的方法QTextCursor旁边findBlockByLineNumber() of QTextDocument.

对于最后一个,我们必须开始移动到最后一个可见的初始字母,因为我们使用cursorForPosition()方法通过大小viewport().

longText = "\n".join(["{}: long text - auto scrolling ".format(i) for i in range(100)])

class AnimationTextEdit(QTextEdit):
    def __init__(self, *args, **kwargs):
        QTextEdit.__init__(self, *args, **kwargs)
        self.animation = QVariantAnimation(self)
        self.animation.valueChanged.connect(self.move)

    @pyqtSlot()
    def startAnimation(self):
        self.animation.stop()
        lines_per_second = 2
        self.moveToLine(0)
        p = QPoint(self.viewport().width() - 1, self.viewport().height() - 1)
        cursor = self.cursorForPosition(p)
        self.animation.setStartValue(cursor.blockNumber())
        self.animation.setEndValue(self.document().blockCount()-1)
        self.animation.setDuration(self.animation.endValue()*1000/lines_per_second)
        self.animation.start()

    @pyqtSlot(QVariant)
    def move(self, i):
        cursor = QTextCursor(self.document().findBlockByLineNumber(i))
        self.setTextCursor(cursor)

class MyApp(QWidget):
    def __init__(self):
        super(MyApp, self).__init__()
        self.setFixedSize(600, 400)
        self.txt = AnimationTextEdit(self)
        self.btn = QPushButton("Start", self)
        self.layout = QHBoxLayout(self)
        self.layout.addWidget(self.txt)
        self.layout.addWidget(self.btn)
        self.txt.append(longText)
        self.txt.move(0)
        self.btn.clicked.connect(self.txt.startAnimation)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

Update:

如果你想要连续运动,你必须使用verticalScrollBar():

longText = "\n".join(["{}: long text - auto scrolling ".format(i) for i in range(100)])

class AnimationTextEdit(QTextEdit):
    def __init__(self, *args, **kwargs):
        QTextEdit.__init__(self, *args, **kwargs)
        self.animation = QVariantAnimation(self)
        self.animation.valueChanged.connect(self.moveToLine)

    @pyqtSlot()
    def startAnimation(self):
        self.animation.stop()
        self.animation.setStartValue(0)
        self.animation.setEndValue(self.verticalScrollBar().maximum())
        self.animation.setDuration(self.animation.endValue()*4)
        self.animation.start()

    @pyqtSlot(QVariant)
    def moveToLine(self, i):
        self.verticalScrollBar().setValue(i)

class MyApp(QWidget):
    def __init__(self):
        super(MyApp, self).__init__()
        self.setFixedSize(600, 400)
        self.txt = AnimationTextEdit(self)
        self.btn = QPushButton("Start", self)
        self.layout = QHBoxLayout(self)
        self.layout.addWidget(self.txt)
        self.layout.addWidget(self.btn)
        self.txt.append(longText)
        self.txt.moveToLine(0)
        self.btn.clicked.connect(self.txt.startAnimation)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在QTextEdit中自动滚动文本(动画效果)? 的相关文章

  • 通过 rpy 将 SPSS 文件(.sav)导入 pandas 时如何保留标签?

    我正在寻找使用 SPSS 文件 sav pandas 在没有 SPSS 程序的情况下 典型文件转换为 csv 后的样子如下 在调查前两行的含义时 我不知道 SPSS 似乎第一行包含Labels 而第二行包含VarNames 当我将文件带入
  • 用定点迭代求解该方程

    我怎样才能解这个方程 x3 x 1 0 使用定点迭代 有没有定点迭代我可以在网上找到代码 尤其是Python 吗 Using scipy optimize fixed point http docs scipy org doc scipy
  • Python gdal 未定义符号 GDALRasterBandGetVirtualMem

    我正在尝试使用Python GDAL 绑定 https pypi python org pypi GDAL 通过 pip 天真地安装绑定时 安装失败并显示错误 VSIFTruncateL 未在此范围内声明 https gis stackex
  • 在 python 中查找价格动量的有效方法:对列的最后 n 个条目求平均值

    我正在定义价格动量是给定股票过去动量的平均值n days 反过来 动量是一种分类 如果当天的收盘价高于前一天 则每天标记为 1 如果当天的收盘价低于前一天 则标记为 1 我的库存变化百分比如下 df close in percent np
  • VS Code Pylint 在缺失的函数/类文档字符串上用蓝色下划线突出显示整个函数

    这种情况突然开始发生 当出现缺少函数文档字符串警告时 python pylint 会用蓝色波浪线突出显示整个函数 我怎样才能让它只突出显示函数定义或在定义行上制作一个小指示器 在开发时突出显示整个文件是非常烦人的 这是缺少类文档字符串的示例
  • 从内存中发送图像

    我正在尝试为 Discord 机器人实现一个系统 该系统可以动态修改图像并将其发送给机器人用户 为此 我决定使用 Pillow PIL 库 因为它对于我的目的来说似乎简单明了 这是我的工作代码的示例 它加载一个示例图像 作为测试修改 在其上
  • 从另一个文件覆盖函数中的变量

    一 总结 我不知道如何从另一个文件覆盖函数中的变量 2 示例 2 1 配置 I use logbook http logbook pocoo org and pyfancy https github com ilovecode1 Pyfan
  • 使用正则表达式检查整个字符串

    我正在尝试检查字符串是否是数字 因此正则表达式 d 似乎不错 然而 由于某种原因 该正则表达式也适合 78 46 92 168 8000 这是我不想要的 一些代码 class Foo rex re compile d def bar sel
  • Emacs:在缓冲区求值期间将参数传递给下级 Python shell

    最近我开始使用 Emacs 作为 Python IDE 它不太直观 我现在遇到的问题是当使用 C c C c 评估缓冲区时如何将命令行参数传递给下级 python shell 感谢帮助 这似乎并不容易实现 管理的劣质流程python el模
  • 如何在 iPython 中获取最后分配的变量的值?

    我是一个完全的 iPython 新手 但我想知道是否有办法获取最后分配的变量的值 In 1 long variable name 333 In 2
  • 在Python中将用户昵称转换为正式名字

    我正在尝试根据 Python 中的用户名字和姓氏映射来自不同系统的用户 一个问题是 名字在很多情况下都是 昵称 例如 对于用户来说 他的名字在一个系统中是 Dave 而在另一个系统中是 David python 中有没有简单的方法可以将这些
  • 将 Selenium 与 PyCharm CE 结合使用

    我正在尝试将 Selenium 与 PyCharm CE 一起使用 我已经使用 pip install Selenium 安装了 Selenium 并且可以通过终端使用它 但是当我尝试将它与 PyCharm 一起使用时 出现导入错误 Imp
  • Python 上每个系数具有特定约束的多元线性回归

    我目前正在数据集上运行多元线性回归 起初 我没有意识到我需要限制自己的体重 事实上 我需要有特定的正权重和负权重 更准确地说 我正在做一个评分系统 这就是为什么我的一些变量应该对音符产生积极或消极的影响 然而 当运行我的模型时 结果不符合我
  • Django admin.py 未知命令:'collectstatic'

    我已经从 django 1 2 7 升级到 django 1 5 1我正在使用 python 2 6 6当我尝试跑步时python manage py collectstatic i get 未知命令 collectstatic 从我的设置
  • (venv) (base) 都在 python 项目上活跃,我如何只进入 venv?

    所以我将 vscode 与 conda 对于 django 项目 一起使用 并尝试激活名为 venv 的虚拟环境 它来自 base C Users User Desktop pfa master pfa master venv Script
  • 将索引数组转换为 NumPy 中的 one-hot 编码数组

    给定一个一维索引数组 a array 1 0 3 我想将其一次性编码为二维数组 b array 0 1 0 0 1 0 0 0 0 0 0 1 创建归零数组b有足够的列 即a max 1 然后 对于每一行i 设置a i 第 列 至1 gt
  • 在Python中通过sys.stdout写入unicode字符串

    暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho
  • 在 python 中使用 re.sub 将字母变成大写?

    在许多编程语言中 以下内容 find foo a z bar并替换为GOO U 1GAR 将导致整个匹配项变为大写 我似乎无法在 python 中找到等效项 它存在吗 您可以将函数传递给re sub http docs python org
  • 使用 pyspark 计算所有可能的单词对

    我有一个文本文档 我需要找到整个文档中重复单词对的可能数量 例如 我有下面的word文档 该文档有两行 每行用 分隔 文档 My name is Sam My name is Sam My name is Sam My name is Sa
  • *Python 内的 Kaggle API 文档?

    我想写一个python从 Kaggle com 下载公共数据集的脚本 Kaggle API 是用 python 编写的 但是我能找到的几乎所有文档和资源都是关于如何在命令行中使用该 API 的 而关于如何使用kaggle图书馆内python

随机推荐