基于PyQt5的图形化界面开发——队列动画演示

这篇具有很好参考价值的文章主要介绍了基于PyQt5的图形化界面开发——队列动画演示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0. 前言

本文使用PyQt5制作图形化界面演示数据结构中的队列操作,与上一节队列动画相对应
基于PyQt5的图形化界面开发——队列动画演示

操作系统:Windows10 专业版

开发环境:Pycahrm Comunity 2022.3

Python解释器版本:Python3.8

第三方库:PyQt5

1. 了解队列

队列(Queue)是一种常用的数据结构,类似于现实生活中的排队,是一种先进先出(First In,First Out)的数据结构,即最先进入队列的元素最先出队。

队列具有以下几个基本操作:

  • enqueue: 入队,将一个元素添加到队尾
  • dequeue: 出队,从队头移除一个元素,并返回这个元素的值
  • front: 队头,获取队头的元素值,但不将其移除
  • is_empty: 判断队列是否为空

队列可以使用数组或链表来实现。使用数组实现队列需要考虑到如何动态扩容,而链表实现则需要注意在队尾进行操作,否则操作的时间复杂度将变为 O(n)。

队列在很多场景中都得到了广泛应用,比如现实中的排队、计算机中的进程调度、网络中的数据传输等等。例如,当你使用计算机浏览网页时,网络数据被保存在队列中,一个请求还没有处理完毕时,其他的请求需要等待它前面的请求先完成,这就是队列的应用之一。

例如:
生活中排队买票是队列的一个常见例子。

假设你要去银行柜台排队取钱,如果前面没有人,你就可以直接到柜台取钱,而如果前面有人,你就必须排队等待。

如果你排在排队的最后,那么你需要等待所有其他人先取完钱后才能取钱,即先进入排队的人先取完钱后才轮到你。这就是队列的先进先出原则,即最先进入队列的元素最先出队。

这种情形也常用在电影院和公共汽车站中。在电影院中,你需要排队买票,然后按照先进先出的原则依次进入电影院;在公共汽车站中,你需要排队等车,车到后按照先进先出的原则上车。

在计算机中,进程调度和消息队列也应用了队列的先进先出原则。例如,当计算机向一个进程发送多个消息时,该进程会按照先进先出的原则依次处理每一个消息,这就是队列的应用之一。

堆栈特性为后进先出,也叫LIFO(Last In First Out);那么队列的特性与之对应为先进先出,又叫FIFO(First In First Out)。

2. 代码实现

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


class Node:
    def __init__(self, data):
        self.data = data
        self.next = None


class Queue:
    def __init__(self):
        self.head = None
        self.tail = None

    def enqueue(self, data):
        new_node = Node(data)
        if self.tail is None:
            self.head = new_node
            self.tail = new_node
        else:
            self.tail.next = new_node
            self.tail = new_node

    def dequeue(self):
        if self.head is not None:
            data = self.head.data
            self.head = self.head.next
            if self.head is None:
                self.tail = None
            return data
        else:
            return None

    def front(self):
        if self.head is not None:
            return self.head.data
        else:
            return None

    def is_empty(self):
        return self.head is None

    def display(self, scene):
        pen = QPen(QColor(0, 255, 0))
        font = QFont("Arial", 10)
        y = 100
        current_node = self.head
        while current_node is not None:
            # Draw node rectangle
            scene.addRect(50, y, 50, 50, pen)
            # Draw node text
            text = scene.addText(str(current_node.data), font)
            text.setDefaultTextColor(QColor(255, 255, 255))
            text.setPos(70, y + 10)
            current_node = current_node.next
            y += 70


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Queue Demo")
        self.setFixedSize(500, 500)

        self.scene = QGraphicsScene(self)
        self.view = QGraphicsView(self.scene, self)
        self.view.setGeometry(0, 0, 500, 500)

        self.queue = Queue()
        self.queue.enqueue(10)
        self.queue.enqueue(20)
        self.queue.enqueue(30)

        self.queue.display(self.scene)

        # Add UI elements
        enqueue_button = QPushButton("Enqueue", self)
        enqueue_button.move(10, 10)
        enqueue_button.clicked.connect(self.handle_enqueue)

        dequeue_button = QPushButton("Dequeue", self)
        dequeue_button.move(10, 40)
        dequeue_button.clicked.connect(self.handle_dequeue)

        front_button = QPushButton("Front", self)
        front_button.move(10, 70)
        front_button.clicked.connect(self.handle_front)

        clear_button = QPushButton("Clear", self)
        clear_button.move(10, 100)
        clear_button.clicked.connect(self.handle_clear)

        self.data_edit = QLineEdit(self)
        self.data_edit.move(100, 10)

    def handle_enqueue(self):
        data = self.data_edit.text()
        if data != "":
            self.queue.enqueue(data)
            self.scene.clear()
            self.queue.display(self.scene)

    def handle_dequeue(self):
        data = self.queue.dequeue()
        if data is not None:
            QMessageBox.information(self, "Dequeue", "Dequeued value: " + str(data))
            self.scene.clear()
            self.queue.display(self.scene)
        else:
            QMessageBox.warning(self, "Dequeue", "Queue is empty")

    def handle_front(self):
        data = self.queue.front()
        if data is not None:
            QMessageBox.information(self, "Front", "Front value: " + str(data))
        else:
            QMessageBox.warning(self, "Front", "Queue is empty")

    def handle_clear(self):
        self.queue = Queue()
        self.scene.clear()


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

3. 效果演示

还是初始化后存有三个元素,你可以使用最后一个按钮Clear给它清空
基于PyQt5的图形化界面开发——队列动画演示

清空了所有元素:
基于PyQt5的图形化界面开发——队列动画演示
然后入队两个元素,分别是1和2:
基于PyQt5的图形化界面开发——队列动画演示

现在我们进行队首元素查询,这个操作不应该让元素出队,并且应该遵循先进先出的原则,应该查询到1,演示效果的确如此:
基于PyQt5的图形化界面开发——队列动画演示

现在出队两次,那么就又回到了初始的转态,即空队,现在再进行出队会怎么样呢?

收到了提示队列为空:
基于PyQt5的图形化界面开发——队列动画演示

其他PyQt5文章

基于PyQt5的图形化界面开发——自制MQTT客户端

基于PyQt5的图形化界面开发——Windows内存资源监视助手[附带编译exe教程]

基于PyQt5的图形化界面开发——模拟医院管理系统

基于PyQt5的图形化界面开发——自制ssh工具

基于PyQt5的图形化界面开发——PyQt示例_计算器

基于PyQt5的图形化界面开发——PyQt示例_扫雷

基于PyQt5的图形化界面开发——自制Redis图形化客户端(文末附源码)

基于PyQt5的图形化界面开发——堆栈动画演示

基于PyQt5的图形化界面开发——队列动画演示文章来源地址https://www.toymoban.com/news/detail-469451.html

到了这里,关于基于PyQt5的图形化界面开发——队列动画演示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PyQT5: 构建图形用户界面的Python指南

    PyQt5是一个Python绑定的跨平台C++库,用于创建丰富的图形用户界面(GUI)。它是Qt库的Python接口,Qt库由Qt公司开发,用于开发GUI程序,也称作应用程序框架。在此,我们将详细介绍如何使用PyQt5创建图形用户界面。 在开始之前,我们需要确保已经在Python环境中安装了PyQt5。如果

    2024年02月13日
    浏览(57)
  • RAMMAP(运行内存清理工具)自动释放内存,并利用pyqt5制作图形界面

    上一篇文章用python制作了一个自动清理内存的程序,利用cmd端口调用Rammap,不过只是做了一个托盘图标,这回用pyqt5做一个简单的图形界面,并实现对自动清理模式的一些设置 首先利用pyqt5工具qt designer生成UI界面,这里命名为F_UI.ui(并利用信号/槽编辑器将滑动条和微调框绑

    2024年02月11日
    浏览(50)
  • 【PyQt5】构建强大的Python图形用户界面应用程序 -- 入门指南

      作者主页: 爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主 爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域. https://blog.csdn.net/Code_and516?type=blog 个人简介:打工人。 持续分

    2024年02月15日
    浏览(54)
  • 界面开发(2)--- 使用PyQt5制作用户登陆界面

    上篇文章已经介绍了如何配置PyQt5环境,这篇文章在此基础上展开,主要记录一下如何使用 PyQt5 制作用户登陆界面,并对一些基础操作进行介绍。 下面是具体步骤,一起来看看吧! 1. 打开 Pycharm 中的 Qt Designer 工具。 2. 选择Main Window模式,创建界面窗口。 3. 移除菜单栏和状态

    2024年02月05日
    浏览(56)
  • 界面开发(1) --- PyQt5环境配置

    第一步:首先安装社区版Pycharm 下载地址:https://www.jetbrains.com/pycharm/download/#section=windows 第二步:安装Anaconda3,配置虚拟环境 下载地址:https://www.anaconda.com/ 第三步:安装 Python 第三方库,包括 pyqt5,pyqt5-tools 和 pyqt5designer 在cmd中使用 pip install pyqt5 , pip install pyqt5-tools , pip in

    2024年04月12日
    浏览(51)
  • 【pyqt5界面化开发-5】网格布局(九宫格)界面

    需要模块:QGridLayout 代码

    2024年02月11日
    浏览(39)
  • 【pyqt5界面化工具开发-11】界面化显示检测信息

    目录 0x00 前言: 一、布局的设置 二、消息的显示 我们在10讲的基础上,需要将其输出到界面上 思路: 1、消息的传递 2、布局的设置 先考虑好消息的传递,再来完善布局 其实先完善布局,再来设置消息的传递也行 (我不是中国人,就是外国人) 将布局设置好以后,我们就

    2024年02月10日
    浏览(46)
  • 界面开发(3)--- PyQt5用户登录界面连接数据库

    为了实现用户登录界面的登录功能,我们必须建立一个数据库,并把账号和对应的密码,存储到数据库中。如果输入的账号和密码与数据库中的一致,那我们就允许用户登录,进入新的界面。 上篇文章介绍了如何使用PyQt5制作用户登录界面,这篇文章在此基础上展开,建立简

    2024年02月05日
    浏览(55)
  • Python - PyQT5开发UI界面 - 环境搭建

    没有做过UI界面的都会把UI的制作想象的很神秘,我在刚开始的时候也是感觉异常神秘、很复杂、并且无从下手,不过在真正的做出来一个界面后,发现也并没有想象中的那么难,而且做出来可视化的东西所带来的成就感是超越代码本身的;不过整个过程也并不顺利,网上都是

    2023年04月23日
    浏览(49)
  • 【pyqt5】【多线程】【matplotlib】解决子线程上运行的matplotlib无法在主线程上的UI界面上绘制图形的问题

    在使用PyQt5为一个项目写UI界面的时候,我试图把matplotlib绘制的图像展示在UI界面的窗口中,但matplotlib是运行在一个子线程中的,这导致它出现了如下警告: UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail. 并且我无法使用 matplotlib.backends.backend_qt5agg 下的 Figur

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包