fry-qt6-io-widget
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 aQDockWidgetyourself 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 Aexample_b_folder_to_file.py— mode Bexample_c_file_to_folder.py— mode Cexample_d_file_to_file.py— mode Dexample_mode_switcher.py— switch modes via comboboxexample_dock_wrapper.py— wrap into aQDockWidget
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)
| File | Size | Uploaded | |
|---|---|---|---|
| fry_qt6_io_widget-0.1.5.tar.gz | 43.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|