Установить свойства виджета в PySide можно не только через соответствующие методы и конструктор класса. Можно их изменять с помощью метода setProperty по имени.
btn = QPushButton("Click Me")
btn.setProperty("flat", True)
Это аналогично вызову
btn.setFlat(True)
Если указать несуществующее свойство, то оно просто создается
btn.setProperty("btnType", "super")
Получить его значение можно методом .property(name)
btn_type = btn.property("btnType")
Когда это может быть полезно?
▫️Можно просто хранить какие то данные в виджете и потом их доставать обратно
widget = QWidget()
widget.setProperty('my_data', 123)
print(widget.property('my_data'))
▫️ Назначая эти свойства разным виджетам можно потом отличить виджеты во время итераци по ним. Например, найти все кнопки со свойством my_data="superbtn".
Но ведь вместо кастомного свойства можно использовать objectName, будет тот же результат.
Да, но y ObjectName есть ограничение - только строки.
▫️ Если нам потребуется не просто поиск а, например, сортировка по числу, то свойства позволяют нам это сделать. Поддерживается любой тип данных
widget.setProperty('my_data', {'Key': 'value'})
widget.setProperty('order', 1)
all_widgets.sort(key=w: w.property('order'))
Но ведь Python позволяет всё вышеперечисленное сделать простым созданием атрибута у объекта
widget.order = 1
widget.my_data = 123
Да, но я думаю что не надо объяснять почему не стоит так делать. К тому же, если у виджета нет свойства то метод .property(name) вернет None, а отсутствующий атрибут выбросит исключение.
▫️ Действительно полезное применение кастомным свойствам - контроль стилей. Здесь атрибутами не обойтись, нужны именно свойства.
Дело в том, что в селекторах стилей можно указывать конкретные свойства виджетов на которые следует назначать стиль.
Просто запустите этот код
from PySide2.QtWidgets import *
if __name__ == "__main__":
app = QApplication([])
widget = QWidget(minimumWidth=300)
layout = QVBoxLayout(widget)
btn1 = QPushButton("Action 1")
btn2 = QPushButton("Action 2")
btn3 = QPushButton("Action 3", flat=True)
layout.addWidget(btn1)
layout.addWidget(btn2)
layout.addWidget(btn3)
# добавим кастомное свойство одной кнопке
btn1.setProperty("btnType", "super")
# добавляем стили
widget.setStyleSheet(
"""
QPushButton[btnType="super"] {
background-color: yellow;
color: red;
}
QPushButton[flat="true"] {
color: yellow;
}
"""
)
widget.show()
app.exec_()
С помощью селектора мы избирательно назначили стили на конкретные кнопки.
Как получить список всех кастомный свойств?
Функция получения списка кастомных свойств отличается от получения дефолтных.
def print_widget_dyn_properties(widget):
for prop_name in widget.dynamicPropertyNames():
property_name = prop_name.data().decode()
property_value = widget.property(property_name)
print(f"{property_name}: {property_value}")
#tricks#qt
💻 Бесплатный мини-курс: MySQL для новичков.
• Еще один бесплатный курс от Selectel для новичков, который описывает установку и настройку базы данных MySQL и как ими управлять, Вы научитесь работать с таблицами и разными типами данных, создавать ключи и настраивать права доступа. В конце курса — подборка полезных книг, которые точно пригодятся в начале пути.
- Как установить MySQL на Windows;
- Как установить и настроить MySQL в Ubuntu 20.04;
- Создание базы данных в MySQL;
- Типы данных в MySQL;
- Как создавать таблицы в MySQL (Create Table);
- Создание нового пользователя и настройка прав в MySQL;
- Сброс пароля root в MySQL;
- ALTER TABLE — изменение таблицы в SQL;
- Insert в MySQL — добавление данных в таблицу;
- Работа с командой UPDATE — как обновить данные в таблице MySQL;
- Как установить и использовать MySQL Workbench;
- Как создать первичные и внешние ключи MySQL;
- Книги по MySQL: пособия для начинающих и продолжающих.
#MySQL
https://www.tutorialspoint.com/python/python_database_access.htm
Python - #MySQL#Database Access
The Python standard for database interfaces is the Python DB-API. Most Python database interfaces adhere to this standard.
You can choose the right database for your application. Python Database API supports a wide range of database servers such as
#python#django#MySQL
🐍
The Ultimate Django Series Part 3
Description
This course is the 3 part of a series. Build production-grade backends with industry best practices.A comprehensive, fun and highly-practical course that prepares you for the job
• Building an API to upload files
• Sending emails
• Running background tasks with Celery
• Scheduling periodic tasks
• Monitoring scheduled tasks
• Writing automated tests with PyTest
• Running performance tests with Locust
• Profiling with Silk
• Implementing caching with Redis
• Managing static assets
• Logging
• Managing development and production configuration
• Deploying to Heroku
• Django best practices
• And much, much more!
Author: Mosh Hamedani
Language: English
Duration: 4h+
🔗Link
-----
Main channel:@repo_science
Coupons: @freecoupons_reposcience
-----
#python#django#MySQL
🐍
The Ultimate Django Series Part2
Description
This course is the second part of a series. The first part covers the fundamentals of building websites with Python and Django. In this part, you'll learn:
• Fundamentals of RESTful APIs
• Working with class-based views
• Creating serializers
• Using mixins and generic views
• Generating routes with routers
• Filtering, searching, sorting, and pagination
• Django authentication system
• Creating custom User models
• Securing APIs with JSON Web Tokens (JWT)
• Using signals to decouple apps
• Troubleshooting common errors
• Applying best practices
• And much, much more!
Author: Mosh Hamedani
Language: English
Duration: 5h 41m
🔗Link
-----
Main channel:@repo_science
Coupons: @freecoupons_reposcience
-----
#python#django#MySQL
🐍
The Ultimate Django Series
Description
Master Django to Build Awesome Backends! This course is the first part of a series. In this part, you'll learn
• The fundamentals of web development
• Installing Django
• Creating and understanding Django projects
• Building reusable Django apps
• Building a data model for an e-commerce application
• Implementing generic relationships using Content Types Framework
• Setting up and using MySQL in your Django projects
• Creating and updating database tables using Django migrations
• Populating your database dummy data
• Querying and manipulating data using Django ORM
• Managing your application data using Django admin
• Django best practices
• And much, much more!
Author: Mosh Hamedani
Language: English
Duration: 4h 48m
Subtitle: Included
🔗Link
-----
Main channel:@repo_science
Coupons: @freecoupons_reposcience
-----
https://github.com/aio-libs/aiomysql
#aiomysql is a "driver" for accessing a #MySQL database from the #asyncio (PEP-3156/tulip) framework. It depends on and reuses most parts of #PyMySQL . aiomysql tries to be like awesome #aiopg library and preserve same api, look and feel.
Internally aiomysql is copy of PyMySQL, underlying io calls switched to async, basically yield from and asyncio.coroutine added in proper places)). sqlalchemy support ported from aiopg.