【问题标题】:How to change the label color color continuously in python pyqt5如何在python pyqt5中连续更改标签颜色颜色
【发布时间】:2019-10-05 04:59:07
【问题描述】:

我是 python 新手,我正在尝试学习 simpy 和 pyqt5。我正在制作一些程序,我想在每次迭代时更改标签颜色,但我不知道为什么它只显示一种颜色。

首先要更改颜色,我先提到绿色,然后是黑色,但启动程序后它只显示黑色。有什么办法可以连续改变颜色。

def carParking(env, name, ps, depart_time, parking_Duration):
    yield env.timeout(depart_time)
    print("Car %d arrived on station at %d" % (name, env.now))
    app.processEvents()
    dlg.parkedCars.display(name)
    app.processEvents()
    dlg.lEnter.setStyleSheet('color: Green')
    dlg.lEnter.setStyleSheet('color: Black')
    dlg.lEnter.setStyleSheet('color: Green')
    time.sleep(0.30)
    with ps.request() as req:
        yield req
        time.sleep(0.30)
        print("%d parked at %s" % (name, env.now))
        yield env.timeout(parking_Duration)
        time.sleep(0.30)
        print("%d leaving the Parking Station at %s" % (name, env.now))
        dlg.lExit.setStyleSheet('color: Red')

在上面的代码中,您可以看到绿色黑色绿色,但它不是那样工作的。它只显示一种颜色,即绿色。 剩下的代码在下面给出

env = simpy.Environment()
ps = simpy.Resource(env, capacity=5)

def syslot(self):
    #a=dlg.parkingSpace.setText(str(float(dlg.nCars.text())))
    ab=int(dlg.nCars.text())
    for i in range(ab):
        a = randint(1, 5)
       # dlg.lEnter.setStyleSheet('color: black')
       # dlg.lExit.setStyleSheet('color: black')
        env.process(carParking(env,  i, ps, i * 2, a))
        time.sleep(0.10)
        print("The parking duration of Car %d is %d" % (i, a))
        env.run()

app =QtWidgets.QApplication([])
dlg = uic.loadUi("design.ui")
dlg.visualize.clicked.connect(syslot)
dlg.show()
sys.exit(app.exec_())

请告诉我应该怎么做才能连续更改标签颜色。提前谢谢你。

【问题讨论】:

  • 虽然你有很多错误,例如在程序运行时尝试改变窗口大小你会看到你的窗口冻结,我看到另一个你没有意识到的错误:我们的眼睛很慢,所以最后几个 us / ms 的变化我们不会观察到它,在你的情况下,3 个连续的命令将在这些单位时间内,所以没有观察到从绿色-黑色-绿色的颜色变化。你觉得我指的是什么?
  • @eyllanesc 谢谢你的评论。你能在这方面指导我吗?
  • 我有一个问题:你想要的颜色变化是G-B-G,每个颜色应该显示多长时间?
  • 一段时间。实际上这个程序是可视化停车场。所以要想象任何一辆车是否进入公园,我想改变标签颜色。例如。如果汽车进入它应该变成绿色然后回到原来的黑色。如果汽车要离开,那么它应该变成红色并变回默认颜色,就像这样。
  • 问题是选择时间。根据您的指示,我了解到有两个重要的时间T1:进入时间和T2:离开时间。在你的程序中,哪个命令行相当于“进入时间”和“离开时间”?同时分享.ui

标签: python python-3.x pyqt5 simpy


【解决方案1】:

为了让用户感知到变化,由于视觉很慢,所以不能这么快,想法是给一个可感知的时间,例如 500 毫秒。另一方面,必须在另一个线程中执行循环,以免阻塞 GUI 并通过信号与 GUI 通信。

综合以上,解决办法是:

import random
import threading
import time

import simpy

from PyQt5 import QtCore, QtWidgets, uic


def car_parking(env, name, ps, depart_time, parking_duration, manager):
    yield env.timeout(depart_time)
    print("Car %d arrived on station at %d" % (name, env.now))
    manager.valueChanged.emit(name)
    manager.entered.emit()
    time.sleep(0.3)
    with ps.request() as rq:
        yield rq
        time.sleep(0.3)
        print("%d parked at %s" % (name, env.now))
        yield env.timeout(parking_duration)
        time.sleep(0.30)
    print("%d leaving the Parking Station at %s" % (name, env.now))
    manager.exited.emit()


def loop(number_of_cars, manager):
    env = simpy.Environment()
    ps = simpy.Resource(env, capacity=5)

    for i in range(number_of_cars):
        t = random.randint(1, 5)
        env.process(car_parking(env, i, ps, i * 2, t, manager))
        time.sleep(0.3)
        print("The parking duration of Car %d is %d" % (i, t))
        env.run()


class Manager(QtCore.QObject):
    entered = QtCore.pyqtSignal()
    exited = QtCore.pyqtSignal()
    valueChanged = QtCore.pyqtSignal(int)

    def start(self, number_of_cars):
        threading.Thread(target=loop, args=(number_of_cars, self), daemon=True).start()


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        uic.loadUi("design.ui", self)
        self.manager = Manager()
        self.manager.valueChanged.connect(self.parkedCars.display)
        self.manager.entered.connect(self.on_entered)
        self.manager.exited.connect(self.on_exited)
        self.visualize.clicked.connect(self.on_clicked)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        try:
            n = int(self.nCars.text())
            self.manager.start(n)
        except ValueError:
            print("It must be an integer")

    @QtCore.pyqtSlot()
    def on_entered(self):
        self.lEnter.setStyleSheet("color: green")
        QtCore.QTimer.singleShot(500, lambda: self.lEnter.setStyleSheet("color: black"))

    @QtCore.pyqtSlot()
    def on_exited(self):
        self.lExit.setStyleSheet("color: red")
        QtCore.QTimer.singleShot(500, lambda: self.lExit.setStyleSheet("color: black"))


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

【讨论】:

  • 但它不与打印语句同步。如果汽车进入绿色会闪烁,当汽车离开红色会闪烁,就像这样,它不是这样工作的。在这种情况下,双方都在闪烁而不与打印语句同步
  • @Tayyab 您似乎不了解应用程序的不同元素如何交互。 1)如果您意识到我将颜色更改为 500 毫秒,并且在现实世界中它可以工作,因为汽车的退出时间比那个时间长,但在您的仿真中您使用 300 毫秒,这非常少。 2)控制台和GUI是2个独立的进程,每个进程都有自己的生命周期,所以不要期望完美同步。
猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多