Skip to main content

fry-qt6-io-widget

Python PyQt6 License: MIT

A reusable PyQt6 widget for picking input and output paths.

Four I/O modes out of the box:

Mode Input Output Example use case
A Folder Folder Batch image processing
B Folder File Aggregate a directory into one report
C File Folder Extract / decompose an archive
D File File One-shot conversion (md → html)

Built-in features:

  • Drag-and-drop a file or folder onto the input box
  • Live path validity check (✓ exists / ○ will be created / ✗ invalid)
  • Auto-sync: output path is generated from input path (postfix + optional timestamp)
  • Safe browse-dialog fallback when a typed path no longer exists
  • Freeze-proof browse dialog: always uses Qt's non-native QFileDialog (never the Windows shell dialog, which can hang on disconnected network drives), prettified and with a curated local-only sidebar
  • Opens the input/output location in the OS file manager
  • get_params_dict() / load_params_dict() for trivial persistence
  • Ships as a QWidget — wrap it in a QDockWidget yourself if you need that (see examples/example_dock_wrapper.py)

Install

pip install fry-qt6-io-widget

Requires Python 3.8+, PyQt6 ≥ 6.2, and QtAwesome ≥ 1.2.

Quick start

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow
from fry_qt6_io_widget import FryIOWidget, IOMode

app = QApplication(sys.argv)
win = QMainWindow()

widget = FryIOWidget(mode=IOMode.FOLDER_TO_FOLDER)
win.setCentralWidget(widget)

widget.input_path_changed.connect(lambda p: print("in:", p))
widget.output_path_changed.connect(lambda p: print("out:", p))

win.show()
sys.exit(app.exec())

Pick a mode

FryIOWidget(mode=IOMode.FOLDER_TO_FOLDER)   # A
FryIOWidget(mode=IOMode.FOLDER_TO_FILE)     # B
FryIOWidget(mode=IOMode.FILE_TO_FOLDER)     # C
FryIOWidget(mode=IOMode.FILE_TO_FILE)       # D

Or switch at runtime:

widget.set_mode(IOMode.FILE_TO_FILE)

Use it as a dock

The package intentionally ships only a QWidget. Wrapping it in a dock is three lines:

from PyQt6.QtWidgets import QDockWidget
from PyQt6.QtCore import Qt

dock = QDockWidget("输入输出", main_window)
dock.setWidget(FryIOWidget(mode=IOMode.FOLDER_TO_FOLDER))
main_window.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, dock)

A complete runnable example is in examples/example_dock_wrapper.py.

Useful options

FryIOWidget(
    mode=IOMode.FOLDER_TO_FILE,
    output_path_postfix="_report",          # appended to the auto-generated output
    output_use_timestamp=True,              # also append HHMMSS_mmm
    input_file_filter="Images (*.png *.jpg);;All (*)",
    output_file_filter="CSV (*.csv)",
    default_output_extension=".csv",        # used in modes B and D
)

Helpful methods

widget.get_input_path()                     # -> str
widget.get_output_path()                    # -> str
widget.set_input_path("/some/path")
widget.set_output_path("/elsewhere")

widget.get_params_dict()                    # serialise current state
widget.load_params_dict(params)             # restore it

widget.create_output_folder_if_needed()     # mkdir -p for the output directory
widget.compute_auto_output_path("/foo")     # preview what auto-sync would generate

Signals

Signal Payload When
input_path_changed str input text changes
output_path_changed str output text changes

Examples

Five runnable examples are in examples/:

  • example_a_folder_to_folder.py — mode A
  • example_b_folder_to_file.py — mode B
  • example_c_file_to_folder.py — mode C
  • example_d_file_to_file.py — mode D
  • example_mode_switcher.py — switch modes via combobox
  • example_dock_wrapper.py — wrap into a QDockWidget

Run any of them:

python examples/example_a_folder_to_folder.py

Core concepts

For internals (auto-sync rules, path-validity states, how each mode re-uses the same UI), see docs/CORE_CONCEPTS.md.


Development

git clone https://gitlab.com/fanrenyi33/fry_python_lib_d130_fry_qt6_io_widget.git
cd fry_python_lib_d130_fry_qt6_io_widget
pip install -e ".[dev]"
pytest

To build distributions:

python -m build
# dist/fry_qt6_io_widget-0.1.5-py3-none-any.whl
# dist/fry_qt6_io_widget-0.1.5.tar.gz

License

MIT — see LICENSE.

Release files for fry-qt6-io-widget 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fry-qt6-io-widget 0.1.5
File Size Uploaded
fry_qt6_io_widget-0.1.5.tar.gz 43.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fry-qt6-io-widget 0.1.5
File Interpreter ABI Platform
fry_qt6_io_widget-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 58.2 kB

Release files / fry_qt6_io_widget-0.1.5.tar.gz

Download URL fry_qt6_io_widget-0.1.5.tar.gz
Size 43.2 kB
Tags Source
SHA-256 checksum
How to use checksums
03f4dcaa42eec4e556a2444d853db0ea36af02797ecc03b72c1dcec99be348a9
BLAKE2b-256 checksum
How to use checksums
e6e649413ed4b9694044d614a6a1c29dd4dace74d320356c58a1b2467ffbe380
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release files / fry_qt6_io_widget-0.1.5-py3-none-any.whl

Download URL fry_qt6_io_widget-0.1.5-py3-none-any.whl
Size 15.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
885380fb4aa9bdcb0eea9b46c42ddb9e21bcdc58a3d9da08c113cab262cab09d
BLAKE2b-256 checksum
How to use checksums
a1417c1ef6e5b23dba9a058e9576bfcacf50800bd3ec9e8f6b8c70a52d49840b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.13

Release history Release notifications | RSS feed

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page