#python #pyqt #pyqt5
Вопрос:
Это мой код. Как назначить значения для CSS через переменную и использовать то же самое в таблице стилей PyQt5 ?
self.label = QLabel("sample")
self.label.setObjectName("label_1")
self.label.setStyleSheet(my_stylesheet())
def my_stylesheet():
return """
QLabel#label_1{color:red;background-color:blue;}
"""
Вместо прямых значений (например, красного, синего) назначьте его в переменной и как его использовать.
Для бывших :
color_1 =red
color_2 = blue
QLabel#label_1{"color:color_1; background-color:color_2;}
Комментарии:
1. Используйте f-строку или
str.format
метод, например:f"{{color: {color_1}; background-color: {color_2};}}"
2. не работай на меня
3. Ты этим пользовался?
f"QLabel#label_1{{color: {color_1}; background-color: {color_2};}}"
также в вашемcolor_1 =red
красном должна быть строка.4. @tckraomuqnt вы спрашиваете, можете ли вы использовать ссылку на «динамическую» переменную в таблице стилей, чтобы при каждом изменении значения этой переменной таблица стилей также обновлялась? Если это так, то нет, вы не можете: таблицы стилей-это статические строки, которые оцениваются после их установки.
5. @Bala здесь
Ответ №1:
Возможным решением является использование свойства, в котором изменение таблицы стилей Qt применяется в установщике:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QFont
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow
class Label(QLabel):
def __init__(
self, background=QColor("white"), foreground=QColor("black"), parent=None
):
super().__init__(parent)
self._background = background
self._foreground = foreground
self._change_stylesheet()
@property
def background(self):
return self._background
@background.setter
def background(self, color):
if self._background == color:
return
self._background = color
self._change_stylesheet()
@property
def foreground(self):
return self._foreground
@foreground.setter
def foreground(self, color):
if self._foreground == color:
return
self._foreground = color
self._change_stylesheet()
def _change_stylesheet(self):
qss = "QLabel{color:%s;background-color:%s}" % (
self.background.name(),
self.foreground.name(),
)
self.setStyleSheet(qss)
if __name__ == "__main__":
app = QApplication(sys.argv)
label = Label()
label.setText("Qt is awesome!!!")
label.setAlignment(Qt.AlignCenter)
label.setFont(QFont("Arial", 40))
label.background = QColor("red")
label.foreground = QColor("blue")
w = QMainWindow()
w.setCentralWidget(label)
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
Ответ №2:
Этот код не дает прямого решения вашей проблемы. Но это как-то решает вашу проблему.
import sys
from PyQt5 import QtWidgets
color_red = "color_red"
color_blue = "color_blue"
backcolor_skyblue = "bcolor_skyblue"
backcolor_lightgreen = "bcolor_lightgreen"
class CssSample(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Css Stylesheet")
self.label_1 = QtWidgets.QLabel("Sample 1 Label")
self.label_1.setFixedSize(200,50)
self.label_1.setProperty("color",color_red )
self.label_1.setProperty("backcolor",backcolor_skyblue)
self.label_1.setStyleSheet(my_stylesheet())
self.label_2 = QtWidgets.QLabel("Sample 2 Label")
self.label_2.setFixedSize(200, 50)
self.label_2.setProperty("color", color_blue)
self.label_2.setProperty("backcolor",backcolor_lightgreen)
self.label_2.setStyleSheet(my_stylesheet())
self.vbox = QtWidgets.QVBoxLayout()
self.vbox.addWidget(self.label_1)
self.vbox.addWidget(self.label_2)
self.setLayout(self.vbox)
def my_stylesheet():
return """
QLabel[color = "color_red"]
{ color : red;font-family: Trebuchet MS; font-style: normal; font-size:12pt; font-weight:700; }
QLabel[color = "color_blue"]
{ color : blue;font-family: Trebuchet MS; font-style: normal; font-size:12pt; font-weight:700;}
QLabel[backcolor = "bcolor_skyblue"]
{ background-color : skyblue}
QLabel[backcolor = "bcolor_lightgreen"]
{ background-color : lightgreen}
QLabel{ background-color: @mycolor;}
"""
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainwindow = CssSample()
mainwindow.show()
sys.exit(app.exec_())