- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 PyQt5 构建具有多个按钮的应用程序。我想要完成的是为我的一些按钮创建闪烁的背景颜色(黄色-红色)。
btn1.setStyleSheet("background-color: green; color: red; font-weight: 800; font-size: 22")
tobyte = 'styleSheet'
a = bytearray(tobyte, 'utf-8')
animation = QtCore.QPropertyAnimation(' + 'btn' + str(yy) + ', a)
animation.setDuration(1000)
animation.setLoopCount(1000)
animation.setStartValue("background-color: yellow; color: red; font-weight: 800; font-size: 22")
animation.setEndValue("background-color: red; color: red; font-weight: 800; font-size: 22")
animation.start()
动画开始(它删除了预定义的绿色背景),但它不会将按钮的背景颜色更改为黄色或红色。
有什么想法吗?
最佳答案
您不应该对样式表进行动画处理,因为存在必须对特定值进行动画处理(插值)的模糊性。 PyQt5 类中没有样式表的内部解析器。尽管如此,还是有办法解决这个问题。下面是动画 QLabel 的工作示例(QLabel 的背景色)。
主要思想在于使用自定义 QtCore.QPropertyAnimation。在本例中,它的名称是 zcolor。您还应该在派生自 QLabel(和任何其他类)的类中创建属性 QtCore.pyqtProperty。
此外,您可以在类里面使用多个动画,例如,您可以在三种类型的动画(无动画、类型 1、类型 2)之间切换。
当然,一些小部件的一些参数可以通过QtGui.QPalette.Window动画而无需解析ss(见注释中的三个字符串从 # pal = self.palette() 开始,但是恕我直言,通过样式表的方式更加灵活。
import sys
import re
from PyQt5.QtWidgets import (QApplication, QFormLayout, QLabel, QDialog, QLineEdit, QPushButton)
from PyQt5 import QtCore, QtGui
class AnimatedLabel(QLabel):
def __init__(self):
QLabel.__init__(self)
color1 = QtGui.QColor(255, 0, 0)
color2 = QtGui.QColor(255, 144, 0)
color3 = QtGui.QColor(255, 255, 0)
color4 = QtGui.QColor(224, 192, 192)
color5 = QtGui.QColor(192, 224, 192)
color6 = QtGui.QColor(192, 192, 192)
color7 = QtGui.QColor(212, 208, 200)
self.co_get = 0
self.co_set = 0
byar = QtCore.QByteArray()
byar.append('zcolor')
self.color_anim = QtCore.QPropertyAnimation(self, byar)
self.color_anim.setStartValue(color4)
self.color_anim.setKeyValueAt(0.15, color1)
self.color_anim.setKeyValueAt(0.3, color2)
self.color_anim.setKeyValueAt(0.5, color3)
self.color_anim.setKeyValueAt(0.75, color2)
self.color_anim.setEndValue(color4)
self.color_anim.setDuration(2000)
self.color_anim.setLoopCount(1)
self.color_anim_ok = QtCore.QPropertyAnimation(self, byar)
self.color_anim_ok.setStartValue(color5)
self.color_anim_ok.setKeyValueAt(0.5, color6)
self.color_anim_ok.setEndValue(color7)
self.color_anim_ok.setDuration(1000)
self.color_anim_ok.setLoopCount(-1)
self.custom_anim = QtCore.QPropertyAnimation(self, byar)
def parseStyleSheet(self):
ss = self.styleSheet()
sts = [s.strip() for s in ss.split(';') if len(s.strip())]
return sts
def getBackColor(self):
self.co_get += 1
# print(fuin(), self.co_get)
return self.palette().color(self.pal_ele)
def setBackColor(self, color):
self.co_set += 1
sss = self.parseStyleSheet()
bg_new = 'background-color: rgba(%d,%d,%d,%d);' % (color.red(), color.green(), color.blue(), color.alpha())
for k, sty in enumerate(sss):
if re.search('\Abackground-color:', sty):
sss[k] = bg_new
break
else:
sss.append(bg_new)
# pal = self.palette()
# pal.setColor(self.pal_ele, color)
# self.setPalette(pal)
self.setStyleSheet('; '.join(sss))
pal_ele = QtGui.QPalette.Window
zcolor = QtCore.pyqtProperty(QtGui.QColor, getBackColor, setBackColor)
# this class is only for test
class SomeDia2(QDialog):
def __init__(self, parent=None):
"""Sets up labels in form"""
QDialog.__init__(self, parent)
self.co_press = 0
self.setModal(True)
self.setWindowTitle('Animation Example')
self.edit_pad = QLineEdit('-1')
self.edit_rad = QLineEdit('-1')
self._mapHeight = QLineEdit('0')
self.layout = QFormLayout()
self.lab_pad = QLabel('Padding (px):')
self.lab_rad = QLabel('Radius (px):' )
self.layout.addRow(self.lab_pad, self.edit_pad)
self.layout.addRow(self.lab_rad, self.edit_rad)
self.anila = AnimatedLabel()
self.anila.setText('Label for animation:')
# self.anila.setStyleSheet('padding: 0 4px; border-radius: 4px;')
self.layout.addRow(self.anila, self._mapHeight)
self.ok = QPushButton()
self.ok.setText('OK -- change animation')
self.ok.clicked.connect(self._okPress)
self.layout.addRow(self.ok)
self.layout.setLabelAlignment(QtCore.Qt.AlignRight)
self.setLayout(self.layout)
self.set_initial_data()
def set_initial_data(self):
pad_vali = QtGui.QIntValidator(0, 20)
rad_vali = QtGui.QIntValidator(0, 10)
self.edit_pad.setValidator(pad_vali)
self.edit_rad.setValidator(rad_vali)
pad, rad = 4, 4
self.edit_pad.setText(str(pad))
self.edit_rad.setText(str(rad))
self.set_ss(pad,rad)
# slots
self.edit_pad.textChanged.connect(self.change_padrad)
self.edit_rad.textChanged.connect(self.change_padrad)
def set_ss(self, pad, rad):
self.anila.setStyleSheet('padding: 0 %dpx; border-radius: %dpx;' % (pad, rad))
for lab in [self.lab_rad, self.lab_pad]:
lab.setStyleSheet('padding: 0 %dpx;' % pad)
def change_padrad(self):
try:
pad = int(self.edit_pad.text())
rad = int(self.edit_rad.text())
# print(pad, rad)
self.set_ss(pad, rad)
except Exception as ex:
print(type(ex).__name__)
def _okPress(self, flag):
# print('OK PRESS', flag)
self.co_press += 1
typ = self.co_press % 3
if 0 == typ:
print('Animation NO')
self.anila.color_anim.stop()
self.anila.color_anim_ok.stop()
elif 1 == typ:
print('Animation type 1')
self.anila.color_anim_ok.stop()
self.anila.color_anim.start()
elif 2 == typ:
print('Animation type 2')
self.anila.color_anim.stop()
self.anila.color_anim_ok.start()
if __name__ == "__main__":
app = QApplication(sys.argv)
dia = SomeDia2()
dia.show()
app.exec_()
关于python - PyQt5 styleSheet 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40287398/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!