跳转到主要内容

Fidget是Qt到函数式接口的适配器。Fidget可以无缝与PySide6、PySide2、PyQt5一起使用。Fidget旨在为数据科学和分析创建一个轻松且丰富的UI。

项目描述

Fidget

Fidget是Qt6/Qt5到函数式接口的适配器。Fidget可以无缝与PySide6、PySide2和PyQt5一起使用。Fidget旨在为数据科学和分析创建一个轻松且丰富的UI。

概念

fidget的使用集中在Fidget类上。简单来说,一个Fidget(简称功能小部件)是一个带有值的QWidget。这个值可以由父小部件或Python程序读取和使用。

示例用法

from typing import Tuple

from fidget.backend.QtWidgets import QLineEdit, QHBoxLayout, QApplication
from fidget.core import Fidget, ParseError

class PointWidget(Fidget[Tuple[float, float]]):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.x_edit = None
        self.y_edit = None
        self.init_ui()
        self.change_value()

    def init_ui(self):
        super().init_ui()

        layout = QHBoxLayout()
        with self.setup_provided(layout):
            self.x_edit = QLineEdit()
            self.x_edit.setPlaceholderText('X')
            self.x_edit.textChanged.connect(self.change_value)
            layout.addWidget(self.x_edit)

            self.y_edit = QLineEdit()
            self.y_edit.setPlaceholderText('Y')
            self.y_edit.textChanged.connect(self.change_value)
            layout.addWidget(self.y_edit)
        self.setLayout(layout)

    def parse(self):
        try:
            x = float(self.x_edit.text())
        except ValueError as e:
            raise ParseError('error in x') from e

        try:
            y = float(self.y_edit.text())
        except ValueError as e:
            raise ParseError('error in y') from e

        return x, y

app = QApplication([])
w = PointWidget('point', make_indicator=True, make_plaintext=True, make_title=True)
w.show()
res = app.exec_()
print(w.value())
if res != 0:
    exit(res)

哎呀,这里有很多是标准的QWidget用法,所以我们只介绍新的部分

class PointWidget(Fidget[Tuple[float, float]]):

每个Fidget都必须扩展Fidget类(它扩展了QWidget类)。Fidget是一个泛型类型,可以用其值类型(在这种情况下,是浮点数的元组)来参数化。像所有泛型类型一样,泛型参数对代码没有影响。

with self.setup_provided(layout):

Fidget 提供了一些附加的小部件,称为提供的小部件,可以添加到其中以增强可用性。这些小部件可以从简单的标题标签、根据 UI 状态是否有效而变化的标签,甚至是一个打开具有多种导入/导出值(纯文本)方法的复杂对话框的按钮。setup_provided 方法返回一个便捷的上下文管理器,该管理器在主 UI 之前和之后添加这些提供的小部件。所有这些提供的小部件都可以通过继承类中的常量值或在创建小部件时使用参数来禁用(例如:PointWidget('point', make_indicator=True, make_plaintext=True, make_title=True))。

self.x_edit.textChanged.connect(self.change_value)
self.y_edit.textChanged.connect(self.change_value)

Fidget 的值由于子组件的值发生变化而改变时,必须通知 Fidget。因此,其 change_value 插槽必须连接到任何此类信号。

def parse(self):

这是一个抽象方法,所有 Fidget 都必须实现。它处理小部件子组件的内部状态,并返回一个值(或引发一个 ParseError)。

print(w.value())

每个 Fidget 都有一个存储的值,可以像正常一样提取和使用。注意,此值是 fidget.core.fidget_value.GoodValuefidget.core.fidget_value.BadValue 之一。这些可以通过 is_ok() 方法轻松区分。

这是一项大量工作,fidget 提供了许多默认实现,以尽可能简化使用。

from fidget.backend.QtWidgets import QHBoxLayout, QApplication
from fidget.widgets import FidgetInt, FidgetTuple

class PointWidget(FidgetTuple):
    INNER_TEMPLATES = [
        FidgetInt.template('x', make_title=False),
        FidgetInt.template('y', make_title=False)
    ]
    MAKE_PLAINTEXT = True
    MAKE_TITLE = True
    MAKE_INDICATOR = True
    LAYOUT_CLS = QHBoxLayout

app = QApplication([])
w = PointWidget('point')
w.show()
res = app.exec_()
print(w.value())
if res != 0:
    exit(res)

这将创建一个具有与上述类似功能的控件。

纯文本功能

这是 fidget 最广泛的功能之一,其具有纯文本转换能力。每个 Fidget 都有一组纯文本打印机和纯文本解析器,可以选择用于导入/导出 Fidget 的值。默认情况下,Fidget 没有纯文本解析器,只有 strrepr 作为打印机。

添加打印机和解析器

可以通过实现 Fidgetplaintext_printersplaintext_parsers 方法,或者通过在类中创建一个用 InnerPlaintextPrinterInnerPlaintextParser 包装的方法来添加打印机和解析器。

双 API

如示例所示,几乎所有在创建 Fidget 时可以提供的参数,都可以通过扩展类来填充默认值。

from fidget.widgets import FidgetCheckBox

w = FidgetCheckBox('title', ('YES', 'NO'), make_title=True)
# the following will create a widget equivalent to w
class MyFidgetCheckBox(FidgetCheckBox):
    MAKE_TITLE=True

w = MyFidgetCheckBox('title', ('YES', 'NO'))

支持小部件

Fidget 带有许多内置小部件以简化使用。大多数使用情况都不需要子类化 Fidget 或实现 parse

Fidget 子类 描述
FidgetCheckBox 一个复选框,包含两个值之一
FidgetCombo 一个组合框,包含多个值之一
FidgetComplex 一个用于 complex 的行编辑器
FidgetConfirmer 一个包含“确定”按钮的 fidget 包装器,用于执行更复杂的验证
FidgetConverter 一个将内部值转换为外部值的 fidget 包装器
FidgetDict 一个将多个 fidget 聚合到 dict 中的 fidget
FidgetEditCombo 一个可编辑的组合框,包含多个值或转换后的字符串值之一
FidgetFloat 一个用于 float 的行编辑器
FidgetFilePath 一个用于选择文件路径的行编辑器和浏览按钮
FidgetInt 一个用于 int 的行编辑器
FidgetLabel 一个具有标签的常量值 fidget
FidgetLineEdit 一个包含单个值字符串的行编辑器
FidgetOptional 一个可以禁用内部 fidget 并提供默认值的 fidget 包装器
FidgetQuestion 一个作为对话框打开的专业 FidgetConfirmer
FidgetStacked 多个相同类型的小部件,在任何时候只有一个可使用
FidgetTuple 一个将多个 fidget 聚合到 tuple 中的 fidget

兼容性

Fidget 可以使用 PySide6、PySide2 或 PyQt5。默认情况下,它将按以下顺序尝试导入:PySide6、PySide2 或 PyQt5。它将使用成功导入的第一个。这可以通过 fidget.backend 的函数 prefer 来更改。

使用fidget的用户还可以直接使用fidget所使用的任何后端(从而确保兼容性),通过从fidget.backend导入Qt的成员来实现(目前,仅支持以此种方式导入QtGuiQtWidgetsQtCore)。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码发行版

本版本没有可用的源代码发行版文件。请参阅生成发行版存档的教程

构建发行版

fidget-0.1.3-py3-none-any.whl (78.6 kB 查看哈希值)

上传时间 Python 3

由以下组织支持