QFunnyWidgets
Definition. A library of 35 custom-painted, animated Qt widgets with a sense of humour, written on top of ManyQt so the same code runs on PyQt5, PyQt6, PySide6 (and the other bindings ManyQt supports), under Python 2.7 and Python 3.
Goal. Give serious applications a little personality: every widget is a drop-in, fully
configurable QWidget that behaves like a normal control (signals, properties, keyboard support)
but animates like a cartoon. Pure Python: ManyQt + one Qt binding, nothing else.
Contents:
Interactive controls:
| Package | Class | What it does |
|---|---|---|
jellyswitch |
JellySwitchWidget |
Toggle switch whose jelly knob has a face: sleeps with floating "z" when off, wakes up blushing when on, squashes when pressed and wobbles as it slides. |
moodslider |
MoodSliderWidget |
Slider whose thumb is a face that goes from furious (red, shaking, steaming) to ecstatic (heart eyes, floating hearts). Tilts with drag speed, shows a mood bubble. |
runawaybutton |
RunawayButtonWidget |
A button that dodges the cursor with springy squash & stretch and taunts you; after maxEscapes it gets tired, sweats and lets you click it (confetti). |
ratingstars |
StarRatingWidget |
Star rating where every star has a face: hover previews the mood, clicks send a bounce wave, 1 star makes the others cry, 5 stars makes them all dance. |
holdbutton |
NervousHoldButtonWidget |
Hold-to-confirm button for destructive actions. Fills while held, shakes and sweats more with each stage ("Are you sure?"), sighs "Phew!" if released early, faints when confirmed. |
volumeknob |
VolumeKnobWidget |
Rotary volume dial with a face: zipped mouth when muted, hums and sings (floating notes) at mid volume, squints with sound waves when loud, screams and turns red at 100 %. Drag, wheel, arrows, double-click or M to mute. |
dropzone |
DropZoneMonsterWidget |
Real drag-and-drop upload zone guarded by a hungry monster: opens wide and drools when files hover, chomps and burps when they drop, sticks its tongue out at unaccepted extensions. Click to browse. |
ducklingpager |
DucklingPagerWidget |
Carousel page indicator: pages are lily pads, mother duck swims to the current one with her ducklings in tow and quacks on arrival. Click, wheel or arrow keys. |
searchdetective |
SearchDetectiveWidget |
Debounced search field with a deerstalker detective: pipe smoke while idle, sweeping magnifier while typing, "Elementary!" on results, a personal rain cloud on none. Emits searchRequested; report with setResultCount() or pass a searchFunction. |
robotcheck |
RobotCheckWidget |
"I'm not a robot" box with a robot hiding behind it: pops up sweating oil during the check, winks and gives a thumbs-up when you pass. Optional failChance. |
chameleonpicker |
ChameleonColorPickerWidget |
Swatch color picker: the chameleon's eyes move independently, its tongue grabs the chosen color, and the color washes over it from head to tail. |
snailstepper |
SnailStepperWidget |
Wizard / checkout step indicator: a snail carries progress between steps at a strictly limited pace, leaving a glistening slime trail and complaining when rushed. |
pancakestepper |
PancakeStepperWidget |
Quantity input (spin box) as a pancake stack: "+" drops one on with a squash, "-" flips the top one off; butter and syrup on top; it wobbles near the maximum and refuses more. |
heartlike |
HeartLikeButtonWidget |
Like button: liking pops the heart with a burst of mini hearts and a heartbeat; un-liking cracks it (then a bandage); toggling too fast makes it dizzy. Odometer-style counter. |
copyblob |
CopyBlobButtonWidget |
Copy-to-clipboard chip for commands, keys or codes: the blob mascot splits in two and the clone hops into the clipboard. Shows a masked label while copying the real text. |
rockettop |
RocketBackToTop |
Back-to-top button for any scroll area: appears after a threshold, launches with flame and smoke while smoothly scrolling up, returns by parachute. Only the rocket takes clicks. |
dachshundtabs |
DachshundTabsWidget |
Segmented control / tab bar whose selection highlight is a dachshund: the front end runs ahead, the body stretches across the tabs, the rear catches up. |
puffercounter |
PufferCounterWidget |
Text area with a character limit and a pufferfish that inflates as you approach it, grows spikes, and turns red and furious past it. Optional hard limit. |
helpowl |
HelpOwlWidget |
Inline "?" help icon that is a sleeping owl: hover and it wakes, swivels its head and shows a floating help bubble (flips side near window edges). Click to pin. |
antbreadcrumb |
AntBreadcrumbWidget |
Breadcrumb navigation of real bread crumbs: ants march underneath, carry away crumbs when you go up and carry in new ones when you go deeper. |
passwordjudge |
PasswordJudgeWidget |
Password field reviewed live by a powdered-wig judge: eyes follow the text cursor, monocle pops off at bad passwords, strength meter, covers his eyes on "Show". JudgeFaceWidget and passwordStrength() are usable on their own. |
Feedback & indicators:
| Package | Class | What it does |
|---|---|---|
typingindicator |
TypingIndicatorWidget |
Chat "..." indicator whose dots are creatures: bouncing (Typing), staring up with a "?" (Thinking), vibrating while vanishing one by one (Deleting) or snoozing (Sleeping). autoCycle simulates an indecisive human. |
pigeontoast |
PigeonToast |
Toast overlay for any widget: a flapping carrier pigeon flies in with your message on a swinging banner, drops a few feathers and flies off. Queued, mouse-transparent, follows the parent's size. |
autosave |
AutosaveSquirrelWidget |
Autosave status with built-in debounce and retry: the squirrel naps (saved), sits up (unsaved), stashes acorns (saving) or drops one and facepalms (error). Shows "Saved 2 min ago". |
batterybuddy |
BatteryBuddyWidget |
Battery indicator that bounces when full, yawns when low, sweats and slumps near empty, flickers at 3 % and happily munches electricity while charging. Emits lowBattery(). |
deadline |
DeadlineCountdownWidget |
Countdown timer hosted by a tear-off calendar: sunglasses with plenty of time, focus, sweat, shaking red panic, and calmly on fire ("This is fine") when overdue. extend() brings relief. |
panicbell |
PanicBellWidget |
Notification bell that naps at 0, swings and dings on new items, sweats past panicThreshold, melts down at "99+" (spiral eyes, alarm glow). Click to clear; it sighs with relief. |
hamsterloader |
HamsterLoaderWidget |
Progress indicator powered by a hamster in a wheel. Runs faster as progress grows, sweats past 60 %, cycles silly status messages, celebrates at 100 %. Indeterminate mode with progress < 0. |
Banners & placeholders:
| Package | Class | What it does |
|---|---|---|
errorgremlin |
ErrorGremlinWidget |
Inline alert banner whose gremlin matches the severity: napping (Info), peeking with a wrench (Warning), chewing a cable with sparks (Error), bouncing in front of a fire (Critical). Retry scares it off; close fades out. |
cookieconsent |
CookieConsentWidget |
Cookie banner starring a cookie: hopeful puppy eyes, excited when you hover Accept, lip quivering at Decline. Accepted, it is eaten in three bites with crumbs; declined, it sobs. |
emptystate |
EmptyStateWidget |
"Nothing here yet" placeholder in a tiny desert: bouncing tumbleweed, bored cactus, chirping crickets and a call-to-action button. |
Containers:
| Package | Class | What it does |
|---|---|---|
catsection |
SleepyCatSectionWidget |
Collapsible section with animated height and a cat on the header: asleep when collapsed, startled awake on expand, yawning on collapse. Holds any widget. CatHeaderWidget is usable alone. |
Identity:
| Package | Class | What it does |
|---|---|---|
presenceavatar |
PresenceAvatarWidget |
Initials avatar with a name-derived color whose presence status is its mood: online (eyes follow you), away (dozing, moon badge), busy (headphones, frown), offline (a floating ghost). |
Decorative / mascots:
| Package | Class | What it does |
|---|---|---|
googlyeyes |
GooglyEyesWidget |
Googly eyes with real spring + gravity physics that follow the cursor anywhere on screen, blink, spin dizzy when poked and get angry if poked 3 times quickly. |
rubberduck |
RubberDuckWidget |
Rubber-duck-debugging companion bobbing on water. Squeaks on click and dispenses dev advice; listen(text) makes it nod thoughtfully before answering. |
Key features:
- 60 fps animation driven by
QTimer+QElapsedTimer(frame-rate independent physics); timers stop when the widget is hidden. - Everything painted with
QPainterand antialiasing, scales cleanly to any size. - Every option is a constructor kwarg, a
getX()/setX()pair (setters are@pyqtSlots) and apyqtProperty. - Every event is a
pyqtSignal, also accepted as a callable kwarg (toggled=self.onToggled). - Colours accept
QColor,Qt.GlobalColor, hex strings or ints. Painted text follows the palette, so widgets work on light and dark themes. - Each package is standalone: copy one folder into your project and it works.
- One code base for every Qt binding (through ManyQt) and for Python 2.7 / 3.x (see Compatibility).
- Every widget ships its own icon,
<widget>/logo.png, right beside its module (used as the demo window icon). - Qt Designer plugins for 33 widgets in a single
plugins/directory (PyQt and PySide6 Designer), with live property editing anduicsupport. - Installable with pip (universal Python 2/3 wheel), with
funnywidgets-mainwindowandfunnywidgets-designercommands.
Installation:
QFunnyWidgets needs ManyQt and one Qt binding. From the project folder
(the one containing setup.py):
pip install .[pyqt5] # library + a binding; or .[pyqt6], .[pyside6], .[pyside2]
pip install . # library only, when a binding is already installed
pip install -e .[pyqt5] # editable install for development
To build distributable archives (a universal py2.py3 wheel and a source archive):
pip wheel . --no-deps -w dist # dist/QFunnyWidgets-1.0.0-py2.py3-none-any.whl
python setup.py sdist # dist/QFunnyWidgets-1.0.0.tar.gz
Python 2.7 installs the same way; enum34 is pulled in automatically there (it backs the four widgets that use
enums). Installing also adds two commands:
| Command | What it does |
|---|---|
funnywidgets-mainwindow |
Opens the seven-page gallery of all widgets. |
funnywidgets-designer [form.ui ...] |
Opens Qt Designer with the QFunnyWidgets plugins loaded (see Qt Designer). |
Before publishing, fill in author, url and a license in setup.py (and add a LICENSE file); they are
left empty on purpose.
Run:
Installed:
funnywidgets-mainwindow
QT_API=pyqt6 funnywidgets-mainwindow # pick a backend explicitly (pyqt4/pyqt5/pyqt6/pyside/pyside2/pyside6)
From a source checkout (no install needed, just pip install ManyQt PyQt5):
python QFunnyWidgets/main.py # the full gallery
python QFunnyWidgets/googlyeyes/main.py # any single widget demo
Qt Designer:
All Designer plugins live in one directory, plugins/ (installed as QFunnyWidgets.plugins):
| File | Used by |
|---|---|
funnywidgetsplugin.py |
Qt Designer of PyQt4 / PyQt5 / PyQt6 (loads *plugin.py from PYQTDESIGNERPATH) |
registerfunnywidgets.py |
Qt Designer of PySide6 (runs register*.py from PYSIDE_DESIGNER_PLUGINS) |
funnywidgetsinfo.py |
Shared table of the 33 widgets (class, group, tooltip, default size) and helpers |
Easiest: funnywidgets-designer (or python -m QFunnyWidgets.designer from a checkout) finds the plugins,
sets the environment and starts the first Designer it finds: pyside6-designer (comes with PySide6),
pyqt5-tools designer / pyqt6-tools designer, or a system designer. Set QT_API to prefer one.
funnywidgets-designer --print-env prints the variables if you prefer to start Designer yourself:
export PYQTDESIGNERPATH=/path/to/plugins # PyQt Designer
export PYSIDE_DESIGNER_PLUGINS=/path/to/plugins # PySide6 Designer
export PYTHONPATH=/path/to/project # only for a source checkout
In Designer the widgets appear in six groups (QFunnyWidgets: Inputs, Buttons, Navigation, Feedback,
Containers & helpers, Mascots) with their logos as icons. Every option shows up in the property editor (they
are pyqtPropertys), and saved forms compile normally: pyuic5, pyuic6 and pyside6-uic generate
from QFunnyWidgets.<package> import <Class>.
Notes:
PigeonToastandRocketBackToTopare not in Designer: they are overlays that attach to a parent widget or a scroll area when created, so create them in code.- Each plugin makes ManyQt use the binding of the Designer that loads it (the PySide6 file selects
pyside6), so widgets never load a second Qt binding into Designer. - If a widget does not appear, start Designer with
FUNNYWIDGETS_DESIGNER_DEBUG=1to see what the plugins did. - PyQt's Designer comes from
pyqt5-tools/pyqt6-tools, which currently publish no wheels for Python 3.12; use Python 3.11 or earlier for those, or PySide6 Designer.
Compatibility:
| Status | |
|---|---|
| PyQt5 (ManyQt default) | All 35 demos, the 7-page gallery and interaction tests pass. |
| PyQt6 | All 35 demos, the gallery and interaction tests pass. |
| PySide6 | Same results, but see Known issue below (a ManyQt bug, not a QFunnyWidgets one). |
| Python 3 | Developed and tested on 3.12. |
| Python 2.7 | Every file compiles with CPython 2.7.18; the sdist and the universal wheel install with Python 2.7's pip, and enum34 (installed automatically) covers the four widgets with enums. |
| PySide6 Designer | Tested in the real pyside6-designer: all 33 widgets register, from a checkout and from an installed wheel. |
| PyQt5 / PyQt6 Designer | The plugin was exercised the way Designer's loader uses it (all 33 classes, icons, XML, include paths) on both bindings; a real PyQt Designer could not be run here (see Qt Designer notes). |
How the code stays neutral:
- Imports come from
ManyQt.QtCore / QtGui / QtWidgets;pyqtSignal,pyqtSlotandpyqtPropertyare provided by ManyQt under every binding. - APIs that differ between Qt versions are feature-detected: mouse positions through a small
eventPos(e)helper (position()on Qt 6,localPos()on Qt 5,posF()on Qt 4),QWidget.screen()vsQDesktopWidget,QButtonGroup.idClickedvsbuttonClicked[int], Qt-5-only HiDPI attributes. - Properties use types every binding can register (
QObject,object,'QString','QStringList').
Known issue (ManyQt 0.4.8 + PySide6 >= 6.8 on Python >= 3.11). import ManyQt.QtCore raises
AttributeError: <enum 'RegexFlag'> cannot set attribute 'NOFLAG' from ManyQt/_fixes.py
(lift_enum_namespace calls setattr on Python's own re.RegexFlag). It happens before any QFunnyWidgets
code runs. Wrapping that setattr(type_, name, value) in try/except AttributeError fixes it; until ManyQt
ships a fix, use PyQt5 or PyQt6, or patch locally.
Integration:
pip install .[pyqt5](see Installation), or copy theQFunnyWidgetspackage folder (or a single widget folder such asjellyswitch/) into your project andpip install ManyQtplus a binding.- Design forms in Qt Designer with the plugins (see Qt Designer), or create widgets in code.
- Import and use it like any other widget:
from QFunnyWidgets import JellySwitchWidget, HamsterLoaderWidget, MoodSliderWidget, NervousHoldButtonWidget
switch = JellySwitchWidget(checked=True, onColor='#5E60CE', toggled=lambda on: print('on' if on else 'off'))
loader = HamsterLoaderWidget(progress=0.0, finished=lambda: print('done'))
loader.setProgress(0.42) # 0..1, or -1 for indeterminate
mood = MoodSliderWidget(value=50, moodChanged=print)
delete = NervousHoldButtonWidget(holdDuration=2000, confirmed=self.deleteEverything)
from QFunnyWidgets import PigeonToast
toast = PigeonToast(self.centralWidget()) # overlay, follows the parent's size
toast.showMessage('File saved successfully.')
layout.addWidget(switch)
Logos:
Each package contains logo.png (256 x 256, transparent corners) right beside its module, e.g.
heartlike/heartlike.py + heartlike/logo.png, so copying the folder copies the icon too. Use it anywhere:
from os.path import dirname, join
from ManyQt.QtGui import QIcon
import QFunnyWidgets.googlyeyes as pkg
icon = QIcon(join(dirname(pkg.__file__), 'logo.png'))
The logos are rendered from the real widgets by makelogos.py, which puts each widget in its most
characteristic state, crops to the character and places it on a rounded-square tile. After changing a widget,
regenerate them with python QFunnyWidgets/makelogos.py (optionally python QFunnyWidgets/makelogos.py 512).
Options at a glance:
- GooglyEyesWidget:
eyeCount,eyeColor,pupilColor,lidColor,wobble(0..1),gravity,blinkInterval,autoBlink; signalspoked(int),gotAngry(); slotsblink(),makeDizzy(). - RunawayButtonWidget:
text,tiredText,color,textColor,dodgeRadius,maxEscapes(0 = never gives up),taunts,autoReset; signalsclicked(),escaped(int),caught(int); slotreset(). - JellySwitchWidget:
checked,onColor,offColor,knobColor,wobbliness,showFace; signaltoggled(bool); slottoggle(). Space/Enter toggles. - HamsterLoaderWidget:
progress,speed,hamsterColor,wheelColor,accentColor,messages,messageInterval,doneText,showPercent; signalsfinished(),progressChanged(float); slotreset(). - StarRatingWidget:
rating,maxRating,starColor,emptyColor,labels,placeholder,showLabel,allowClear; signalsratingChanged(int),hovered(int). Arrow and number keys. - NervousHoldButtonWidget:
stages,doneText,reliefText,holdDuration,color,textColor,autoReset; signalsconfirmed(),cancelled(float); slotreset(). Hold Space works too. - PanicBellWidget:
count,color,badgeColor,panicThreshold,maxDisplay,clearOnClick; signalsclicked(),countChanged(int); slotsincrement(),clear(),ring(). - RubberDuckWidget:
duckColor,beakColor,waterColor,advice,adviceOnClick,adviceDuration,squeakText; signalssqueaked(int),adviceGiven(str); slotssqueak(),listen(text). - PasswordJudgeWidget:
text,placeholder,minLength,showToggle,revealed; signalsstrengthChanged(int)(-1 empty, 0 terrible .. 4 strong),textChanged(str),returnPressed();getLineEdit()/getFace()give access to the children. - CookieConsentWidget:
title,message,acceptText,declineText,acceptedMessage,declinedMessage,accentColor,panelColor,textColor,cookieColor,autoReset; signalsaccepted(),declined(); slotsaccept(),decline(),reset(). - TypingIndicatorWidget:
state(Typing,Thinking,Deleting,Sleeping),name,bubbleColor,dotColor,autoCycle; signalstateChanged(int). - EmptyStateWidget:
title,subtitle,actionText(empty hides the button),accentColor,sandColor,speed; signalactionClicked(). - VolumeKnobWidget:
value(0..100),knobColor,trackColor,showLabel; signalvalueChanged(int); slottoggleMute(). - PigeonToast: create with the widget to cover, e.g.
PigeonToast(self.centralWidget());duration,bannerColor,textColor,pigeonColor,caption,margin; slotsshowMessage(text, duration=-1),dismiss(); signalsmessageShown(str),messageFinished(str). - DropZoneMonsterWidget:
acceptedExtensions(empty = all),hint,subtitle,monsterColor,accentColor,clickToBrowse; signalsfilesDropped(list),filesRejected(list); slotsfeed(paths),browse(). - BatteryBuddyWidget:
level(0..100),charging,lowThreshold,caseColor,showLabel; signalslevelChanged(int),chargingChanged(bool),lowBattery(). - PresenceAvatarWidget:
name,status(Online,Away,Busy,Offline),color(default derived from the name),badgeBorderColor; signalsclicked(),statusChanged(int). - DucklingPagerWidget:
count,current,ducklings(0..6),wrap,duckColor,ducklingColor,padColor; signalcurrentChanged(int); slotsnext(),previous(). - DeadlineCountdownWidget:
duration(s),title,timeScale,accentColor; signalsexpired(),remainingChanged(int); slotsstart(seconds=-1),pause(),resume(),extend(seconds). - SearchDetectiveWidget:
text,placeholder,debounce(ms),searchFunction(text -> count); signalssearchRequested(str),textChanged(str),returnPressed(); slotsetResultCount(int).DetectiveFaceWidgetis usable on its own. - RobotCheckWidget:
text,verifiedText,failChance,panelColor,textColor,robotColor; signalsverified(),failed(); slotsverify(),reset(). - ChameleonColorPickerWidget:
color,colors,columns,showHex,branchColor; signalcolorChanged(QColor). Arrow keys move between swatches. - ErrorGremlinWidget:
severity(Info,Warning,Error,Critical),title,message,retryText(empty hides it),closable,panelColor,textColor; signalsretryClicked(),dismissed(); slotsshowAlert(severity, title, message),dismiss(). - SnailStepperWidget:
steps,current,speed(px/s),clickable,accentColor,shellColor; signalscurrentChanged(int),arrived(int); slotsnext(),previous(). - PancakeStepperWidget:
value,minimum,maximum(<= 20),unit,accentColor; signalvalueChanged(int); slotsincrement(),decrement(). Wheel, arrows, +/-. - HeartLikeButtonWidget:
liked,count,color,showCount; signalslikedChanged(bool),countChanged(int); slottoggle(). - CopyBlobButtonWidget:
text(copied),label(shown, optional),prompt,blobColor,chipColor,textColor; signalcopied(str); slotcopy(). Ctrl+C works when focused. - RocketBackToTop: create with the scroll area, e.g.
RocketBackToTop(myScrollArea);threshold(px),color,bodyColor,label; signallaunched(); slotlaunch(). - SleepyCatSectionWidget:
title,expanded,contentWidget(orcontent=kwarg), header colours via kwargscatColor,barColor,textColor; signaltoggled(bool); slotstoggle(),setExpanded(bool). For accordion behaviour, collapse the others ontoggled(True). - DachshundTabsWidget:
tabs,current,dogColor,trackColor; signalcurrentChanged(int). Left/Right keys. - PufferCounterWidget:
text,placeholder,maxLength,enforceLimit; signalstextChanged(str),limitExceeded(bool);getEditor()returns theQPlainTextEdit.PufferFooterWidgetis usable alone. - HelpOwlWidget:
helpText,title,owlColor; signalsshown(),hidden(); slotsshowHelp(),hideHelp(). F1/Space toggles, Esc closes.HelpBubbleis usable alone. - AntBreadcrumbWidget:
path,crumbColor,antColor,marchingAnts; signalscrumbClicked(int),pathChanged(list); slotspush(name),navigateTo(index),setPath(list). - AutosaveSquirrelWidget:
status(Saved,Unsaved,Saving,Error),autosaveDelay,retryDelay,squirrelColor; signalssaveRequested(),statusChanged(int); slotsmarkDirty(),requestSave(),saveFinished(ok). Wire your editor's change signal tomarkDirtyand your save routine tosaveRequested. - MoodSliderWidget:
value,minimum,maximum,labels,showLabel,trackColor; signalsvalueChanged(int),moodChanged(str). Mouse drag, wheel, arrows, PageUp/Down, Home/End.
Support:
If QFunnyWidgets is useful to you, feel free to support its development:
- ba9chich: https://ba9chich.com/fr/IninouUsama
- Ko-fi: https://ko-fi.com/usamatn
Thank you :)
License:
See LICENSE.md.
Metadata
Release files for QFunnyWidgets 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| qfunnywidgets-1.0.0.tar.gz | 2.6 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| qfunnywidgets-1.0.0-py2.py3-none-any.whl | Python 3, Python 2 | none | any | Details |
Total release size: 3.7 MB
Release files / qfunnywidgets-1.0.0.tar.gz
| Download URL | qfunnywidgets-1.0.0.tar.gz |
|---|---|
| Size | 2.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
da8f3e85ac70c9e59fd9515186bfc86d40b6cf7f7c118f2796039893486ca999
|
|
BLAKE2b-256 checksum How to use checksums |
1b83da6618ff5d4041e2080bd884d525733f3c4296b0c5f2f6b6f46690198cfa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.
Transparency logRelease files / qfunnywidgets-1.0.0-py2.py3-none-any.whl
| Download URL | qfunnywidgets-1.0.0-py2.py3-none-any.whl |
|---|---|
| Size | 1.2 MB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
9dba8fe5301683d1113d0562cdd71c0724c652cc2c0bc97612917560fe9c5fd7
|
|
BLAKE2b-256 checksum How to use checksums |
a2eebadf6b347b15e0d9a9d3a1d57a24cf83df10991896dfab758a62b6e5105a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.
Transparency logSecurity for QFunnyWidgets 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for qfunnywidgets-1.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.