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.GoodValue
或 fidget.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
没有纯文本解析器,只有 str
和 repr
作为打印机。
添加打印机和解析器
可以通过实现 Fidget
的 plaintext_printers
或 plaintext_parsers
方法,或者通过在类中创建一个用 InnerPlaintextPrinter
或 InnerPlaintextParser
包装的方法来添加打印机和解析器。
双 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的成员来实现(目前,仅支持以此种方式导入QtGui
、QtWidgets
和QtCore
)。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码发行版
构建发行版
fidget-0.1.3-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d4ffc2f13c9c2556b3616cdae6ecd4e3a040b522ac69b393673247edcd4ddacc |
|
MD5 | a09a60aeaa6530dc9235f2541d21de2f |
|
BLAKE2b-256 | 60579ae0a03860d0d9b481591e1fb270bd30ee57c98f1c86591a76b0e46cac7e |