Skip to main content

Package to construct PySide6 widgets from dataclass

Project description

Python package to dynamically create PySide6 widgets from dataclass

Introduction

dataclass2PySide6 is a package which provides widgets to represent dataclass instance as PySide6 GUI.

For example, here is a simple dataclass:

from dataclasses import dataclass
from typing import Tuple

@dataclass
class DataClass:
    a: int
    b: Tuple[float, bool] = (4.2, True)

Dataclass widget can be dynamically created as follows.

from PySide6.QtWidgets import QApplication
import sys
from dataclass2PySide6 import DataclassWidget

app = QApplication(sys.argv)
widget = DataclassWidget.fromDataclass(DataClass)
widget.show()
app.exec()
app.quit()

Installation

Before you install, be careful for other Qt-dependent packages installed in your environment. For example, non-headless OpenCV-Python module modifies the Qt dependency thus making PySide6 unavailable.

dataclass2PySide6 can be installed using pip.

$ pip install dataclass2PySide6

How to use

DataclassWidget is a widget for single dataclass type. For multiple dataclass types in one widget, StackedDataclassWidget and TabDataclassWidget are provided.

Single dataclass

DataclassWidget is the core object of dataclass2PySide6. It contains subwidgets which represent each fields of the dataclass.

User may subclass DataclassWidget to define own datclass widget. Refer to the docstring for detailed description.

Creating widget

To construct DataclassWidget, pass dataclass type object to DataclassWidget.fromDataclass() method.

To construct suitable widget for each field, DataclassWidget searches for Qt_typehint metadata. Its value must be the type annotation, not necessarily identical to type attribute of the field.

See Dataclass example for the use case of Qt_typehint.

If Qt_typehint does not exist, it uses type attribute of the field as a fallback.

Currently supported types are:

  1. Enum : converted to combo box
  2. bool : converted to check box (Union with None allowed)
  3. int and float : converted to line edit with validator (Union with None allowed)
  4. str : converted to line edit
  5. Tuple : converted to group box if element types are supported

Getting data value

When data from any subwidget changes, DataclassWidget.dataValueChanged signal emits the new dataclass instance with current value. For check box or combo box, this is when the current selection changes. For line edit, this is when editing is finished.

DataclassWidget.dataValue() method returns the new dataclass instance with current data value. Fields can define fromQt_converter metadata to preprocess the data before dataclass construction. Its value must be a unary function which converts the widget data to field value.

See Dataclass example for the use case of fromQt_converter.

Setting data value

DataclassWidget.setDataValue() method updates the subwidget data with new dataclass instance. Fields can define toQt_converter metadata to preprocess the data before dataclass construction. Its value must be a unary function which converts the field value to widget data.

See Dataclass example for the use case of toQt_converter.

Multiple dataclasses

StackedDataclassWidget and TabDataclassWidget provide multiple DataclassWidget in one widget.

Both classes provide addDataclass() method to add new widget for dataclass, and indexOf() method to search widget for dataclass. When current widget's value is changed, dataValuechanged signal emits the new dataclass instance with current value.

Dataclass example

This is the example of dataclass which includes custom object. Widget is constructed by Tuple[int, int] to represent two parameters of MyObj. Conversion from tuple to MyObj and vice versa is defined.

from dataclasses import field
from typing import Tuple

class MyObj:
    def __init__(self, x: int, y: int):
            self.x = x
            self.y = y

@dataclass
class DataClass:
        my_obj: MyObj = field(
                metadata=dict(
                    Qt_typehint=Tuple[int, int],
                    fromQt_converter=lambda tup: MyObj(*tup),
                    toQt_converter=lambda obj: (obj.x, obj.y)
                )
        )

Here is the constructed widget.


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dataclass2PySide6-1.7.1.tar.gz (17.1 kB view details)

Uploaded Source

Built Distribution

dataclass2PySide6-1.7.1-py3-none-any.whl (17.8 kB view details)

Uploaded Python 3

File details

Details for the file dataclass2PySide6-1.7.1.tar.gz.

File metadata

  • Download URL: dataclass2PySide6-1.7.1.tar.gz
  • Upload date:
  • Size: 17.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for dataclass2PySide6-1.7.1.tar.gz
Algorithm Hash digest
SHA256 f3b13026cd7c0d73207da6a5b214516cc83b6150edb68ec0f712cdcc48bcdf84
MD5 3042c2e8e3aed7210b641f63bc5cf61e
BLAKE2b-256 0e3447da975e5464252222a5ef52163f938572a5791e7ef01a87b56190f34cee

See more details on using hashes here.

File details

Details for the file dataclass2PySide6-1.7.1-py3-none-any.whl.

File metadata

  • Download URL: dataclass2PySide6-1.7.1-py3-none-any.whl
  • Upload date:
  • Size: 17.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.10.2

File hashes

Hashes for dataclass2PySide6-1.7.1-py3-none-any.whl
Algorithm Hash digest
SHA256 17bf8da2b5bf992f4537e03292e8fe85258de955458bf2fc737bad467e2a091d
MD5 6e0ce68ed1904190253d8b6b8d71b1f1
BLAKE2b-256 cca432d133b721c4ef19b4b628f1b4632ad70c0ff6013d79a32ac396ef2ae3f7

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page