- Gooey Python 3 console applications को ऐसे GUI applications में बदलता है जिन्हें end users आसानी से इस्तेमाल कर सकें, और यह
argparse declarations वाले function पर decorator की एक लाइन जोड़कर काम करता है
- basic installation
pip install Gooey से की जा सकती है, और @Gooey decorator को ArgumentParser के साथ इस्तेमाल करने पर Gooey arguments पढ़कर WX components आधारित UI बनाता है
- जब default widget selection पर्याप्त न हो, तो
ArgumentParser के replacement के रूप में GooeyParser डालकर और widget argument specify करके FileChooser, DateChooser, PasswordField, Slider जैसे custom widgets चुने जा सकते हैं
- target users वे tools नहीं हैं जिन्हें developers सीधे CLI से चलाते हैं, बल्कि office-use “run and finish” scripts या non-programmers के लिए tools हैं; यह advanced/basic/no-config run modes, menus, progress display, internationalization, icon changes, और packaging को support करता है
- dynamic validation और lifecycle events को experimental features के रूप में mark किया गया है;
optparse अभी support नहीं है, और यह ArgumentParser-based code तथा optional event subscription को assume करता है
Console program को GUI में बदलने का तरीका
- Gooey console applications को ऐसे GUI applications में बदलता है जिन्हें end users आसानी से operate कर सकें
- core usage यह है कि
argparse declarations वाले function पर @Gooey decorator लगाया जाए
from gooey import Gooey
@Gooey
def main():
parser = ArgumentParser(...)
# rest of code
- style और behavior को decorator arguments से adjust किया जा सकता है
advanced: advanced settings screen दिखानी है या नहीं
language: JSON-based translation selection
auto_start: settings screen skip करके तुरंत run करना
target: subprocess के रूप में चलाने के लिए command specify करना
program_name, program_description: GUI display name और description
default_size: GUI का initial size
dump_build_config, load_build_config: Gooey build settings JSON save/load करना
monospace_display: output screen में fixed-width font इस्तेमाल करना
Installation और examples
- install करने का सबसे आसान तरीका pip है
pip install Gooey
- repository clone करने के बाद
setup.py चलाकर भी install किया जा सकता है
git clone https://github.com/chriskiehl/Gooey.git
python setup.py install
- तैयार example scripts Gooey Examples repository से मिल सकती हैं
- examples repository Gooey के अलग-अलग layouts, widgets, और features को explore करने के लिए दी गई है
इसकी जरूरत क्यों है
- Gooey को command prompt से unfamiliar users को expose करने की समस्या कम करने के लिए बनाया गया है
- अगर program को एक या अधिक काम करने हैं, तो उसे options लेने पड़ते हैं; पहले या तो GUI खुद बनाना पड़ता था या users को console application में arguments pass करने का तरीका समझाना पड़ता था
- Gooey developers को उनके familiar तरीके से configurable programs बनाने देता है, while display और interaction GUI के रूप में provide करता है
उपयुक्त users और अनुपयुक्त cases
- खुद के लिए या दूसरे programmers के लिए utilities, या दूसरे console applications में pipe किए जाने वाले results बनाने वाले tools के लिए Gooey शायद suitable न हो
- office-use execution scripts, point A से B तक data move करने वाले tools, और non-programmers के लिए programs में यह suitable है
- goal यह है कि complex application बनाते समय GUI side बिना extra cost के मिल जाए
Internal behavior और argparse mapping
- Gooey runtime पर Python script से
ArgumentParser references parse करता है
optparse अभी support नहीं है
- extracted arguments को उनके provided
action के आधार पर component type assign किया जाता है और GUI construction में इस्तेमाल किया जाता है
ArgumentParser._actions default रूप से इन WX components पर map होता है
store: TextCtrl
store_const, store_true, store_False, version: CheckBox
append: TextCtrl
count: DropDown
Mutually Exclusive Group: RadioGroup
choice: DropDown
GooeyParser और custom widgets
- अगर default widget selection काफी नहीं है, तो
ArgumentParser के drop-in replacement GooeyParser का इस्तेमाल किया जा सकता है
GooeyParser extra keyword argument widget देता है, जिससे display होने वाले component का नाम specify किया जा सकता है
from gooey import Gooey, GooeyParser
@Gooey
def main():
parser = GooeyParser(description="My Cool GUI Program!")
parser.add_argument('Filename', widget="FileChooser")
parser.add_argument('Date', widget="DateChooser")
- supported custom widgets में ये शामिल हैं
DirChooser, FileChooser, MultiFileChooser
FileSaver, MultiFileSaver
DateChooser, TimeChooser
PasswordField
Listbox
BlockCheckbox
ColourChooser
FilterableDropdown
IntegerField, DecimalField
Slider
DateChooser और TimeChooser application को जो values pass करते हैं वे हमेशा ISO format में होती हैं, जबकि GUI के कुछ हिस्सों में end-user settings के अनुसार localized values दिख सकती हैं
BlockCheckbox लंबे help text होने पर default inline checkbox से बेहतर दिखाने के लिए text block को सामान्य position में ले जाता है, और control के पास छोटा block_label दिखाता है
Internationalization
- Gooey decorator के
language argument से display language चुनता है
@Gooey(language='russian')
def main():
...
- सभी program text external JSON files में store होते हैं
- नई language support जोड़ने का तरीका
gooey/languages/ directory में key/value add करना है
- अभी 18 से अधिक translations built-in मिलते हैं
Global settings और UI configuration
- Gooey का overall look और behavior decorator arguments से adjust किया जाता है
- मुख्य settings में ये शामिल हैं
encoding: display character encoding, default utf-8
advanced: full settings screen या simplified screen चुनना
auto_start: बिना settings के तुरंत run करना
target: Gooey खुद को फिर से कैसे execute करेगा, यह specify करना
suppress_gooey_flag: custom target use करते समय extra CLI parameter injection रोकना
fullscreen: full screen में start करना
image_dir: custom images/icons directory
language_dir: custom language files directory
disable_stop_button, show_stop_warning: running के दौरान stop button और warning control करना
show_success_modal, show_failure_modal: success/failure summary modal दिखाना है या नहीं
run_validators: program call से पहले validation perform करना है या नहीं
progress_regex, progress_expr: progress text parsing और conversion
navigation: TABBED या SIDEBAR
body_bg_color, header_bg_color, footer_bg_color, sidebar_bg_color: color settings
terminal_font_family, terminal_font_size, terminal_font_color: terminal display font settings
menus: custom menu groups और items
clear_before_run: re-run पर previous output delete करना
Layouts और run modes
- Gooey inputs को default रूप से
positional और optional दो groups में divide करता है
argparse के add_argument_group() का इस्तेमाल करके inputs को logical groups में बाँधा जा सकता है और हर group का layout adjust किया जा सकता है
parser = ArgumentParser()
search_group = parser.add_argument_group(
"Search Options",
"Customize the search options"
)
search_group.add_argument(
'--query',
help='Base search string'
)
Menu features
- Gooey 1.0.2 से top पर Menu Bar add किया जा सकता है
- menus को
@Gooey(menu=[{}, {}, ...]) form की maps list के रूप में specify किया जाता है
- हर menu group में
name और items होते हैं
- हर menu item में हमेशा
type और menuTitle शामिल होते हैं
- supported menu item types ये हैं
AboutDialog: program information जैसे name, version, license आदि दिखाना
MessageDialog: user को informational message दिखाना
Link: specified URL को default browser में खोलना
HtmlDialog: limited HTML subset का उपयोग करके dialog दिखाना
Dynamic validation
- Dynamic Validation एक experimental feature है और API बदल या हट सकती है
- Gooey user input को program को pass करने से पहले optionally pre-validate कर सकता है
- यह feature ज्यादातर Argparse argument types में available
type parameter का उपयोग करता है
def must_be_exactly_ten(value):
number = int(value)
if number == 10:
return number
else:
raise TypeError("Hey! you need to provide exactly the number 10!")
- validation default रूप से run नहीं होता
- इसे enable करने के लिए
VALIDATE_FORM event subscribe करना होगा
from gooey import Gooey, Events
@Gooey(use_events=[Events.VALIDATE_FORM])
def main():
...
- क्योंकि यह feature internally heavy Monkey Patching इस्तेमाल करता है, इसलिए फिलहाल opt-in तरीका है
Lifecycle events और UI control
- Gooey 1.2.0 से program को lifecycle hooks expose करता है
- यह feature भी experimental है और API बदल या हट सकती है
- अभी दो main hooks हैं
- दोनों hooks process complete होने के बाद run होते हैं
- handler parsed Argparse object और current Gooey UI state लेते हैं, और updated state return करने पर वह UI में reflect हो सकती है
- handler को
GooeyParser create करते समय connect किया जाता है
parser = GooeyParser(
on_success=my_success_handler,
on_failure=my_failure_handler)
- use करने के लिए events को explicitly subscribe करना होगा
from gooey import Gooey, Events
@Gooey(use_events=[Events.ON_SUCCESS, Events.ON_ERROR])
def main():
...
Progress और time display
- Gooey existing text progress output पढ़कर Progress Bar drive कर सकता है
- simple cases में
Progress 83% जैसे string को regex से match करके progress में convert किया जाता है
@Gooey(progress_regex=r"^progress: (\d+)%$")
- ज्यादा complex output को
progress_expr से regex match result में transform किया जा सकता है
@Gooey(progress_regex=r"^progress: (?P<current>\d+)/(?P<total>\d+)$",
progress_expr="current / total * 100")
hide_progress_msg=True specify करने पर progress से matched text output को console से hide किया जा सकता है
timing_options use करने पर elapsed time और remaining time दिखाया जा सकता है
- time display केवल
progress_regex और progress_expr use करने पर काम करता है
Icons और packaging
- Gooey 6 default icons देता है, और
image_dir argument से custom image directory specify करके इन्हें override किया जा सकता है
- images file name के आधार पर खोजी जाती हैं, और override किए जा सकने वाले filenames ये हैं
program_icon.png
success_icon.png
running_icon.png
loading_icon.gif
config_icon.png
error_icon.png
- executable packaging के लिए PyInstaller usage example दिया गया है
- summary procedure यह है कि application root में
build.spec रखें, APPPNAME, name, pathex values को project के अनुसार modify करें, फिर run करें
pyinstaller -F --windowed build.spec
1 टिप्पणियां
Hacker News की राय
अरे, यह तो मेरा प्रोजेक्ट है ^_^ HN के टॉप पर क्यों आ गया?
argparseसे जुड़े comments का छोटा-सा जवाब: Gooey अब काफी पुराना प्रोजेक्ट है और जब इसे शुरू किया था, तबargparseएक मजबूत विकल्प थाआजकल Gooey खुद JSON पर चलता है और
argparseसे अलग है, लेकिन बहुत कम लोगों ने दूसरे interface बनाए, इसलिएargparseअब भी मुख्य “official” interface बना हुआ हैमजेदार बात यह है कि यह सिर्फ Python ही नहीं, बल्कि किसी भी executable file को भी call कर सकता है, इसलिए काफी उपयोगी है: https://chriskiehl.com/article/gooey-as-a-universal-frontend
आखिरी commit 2 साल पहले होने वाली बात पर: उम्र बढ़ने और priorities बदलने पर niche software को मुफ्त में लगातार maintain करते रहने की वजह ढूंढना मुश्किल हो जाता है :( पता नहीं इससे तसल्ली मिलेगी या नहीं, लेकिन guilt हमेशा महसूस होता है
अजीब बात है कि मेरे इलाके में जगह-जगह “GOOEY” graffiti है, जो छोड़े हुए issue tracker की लगातार याद दिलाने वाले permanent reminder जैसा लगता है haha
argparseअब भी काफी अच्छा विकल्प है। यह बहुत व्यापक रूप से इस्तेमाल होता है, इसकी documentation अच्छी है और यह comparatively आसान हैTyper और Click भी usability के लिहाज से अच्छे हैं, लेकिन मुझे लगता है कि Typer की “tutorial” style documentation में
Typer.App()कौन-से arguments लेता है जैसे जवाब search करना काफी मुश्किल हैजिस program पर मैं अभी काम कर रहा हूं, उसमें user खुद argument parsing शुरू करता है, इसलिए
argparseअच्छा fit है। मैं user को text-based UI का option देना चाहता हूं, लेकिन लगता है Textualize को Click चाहिए था, और Textual को सीधे code में जोड़कर UI बनाने की कोशिश में कई घंटे लगाए, फिर भी शुरुआत तक नहीं कर पायाआजकल applications को programming से control न कर पाने की वजह से बहुत झुंझलाहट होती है। सच कहूं तो काश ऐसा कानून होता कि हर application feature के लिए API होना चाहिए
sys.argvको current working directory की local file में dump क्यों करते हैं? https://github.com/chriskiehl/Gooey/blob/be4b11b8f27f500e732...tmp.txtकोई खास unique नाम नहीं है, इसलिए सोच रहा हूं कि क्या मैं कुछ miss कर रहा हूंargparseसे अलग है” वाला हिस्सा अच्छा लगाtitle देखकर click करने से पहले मैंने सोचा था “यह पक्का
argparseपर बहुत ज्यादा depend करता होगा”, लेकिन अच्छे मायने में surprise हुआमैं
getoptका बड़ा fan हूं, क्योंकि मेरे हिसाब से developer convenience से कहीं ज्यादा user convenience महत्वपूर्ण है। User को इससे मतलब नहीं होना चाहिए कि developer ने कौन-सी programming language या option parsing library चुनी हैargparse, Click, Go काflag/X11 style आदि कई libraries आधी सदी से बनी collective muscle memory में बैठे conventions को तोड़ती हैं। लेकिन अगर बीच में एक layer हो, तो लगता है दोनों फायदे मिल सकते हैंइससे भी खराब यह है कि इसे replace करने लायक कोई viable alternative भी नहीं आया, और दो forks में से किसी को भी traction नहीं मिला
क्या इसे “
argparse-based” तक सीमित नहीं कहना चाहिए?argparsesimple use cases के लिए अच्छा है, लेकिन Click-based CLI भी बहुत हैं और popular CLI libraries में से काफी Click पर बनी हैं।argparseया Click के अलावा भी Python CLI tools हैं, लेकिन ये दोनों शायद सबसे popular हैंक्या यह confirm हुआ है कि यह Click के साथ भी काम करता है? अभी तो सिर्फ
argparseसे जुड़ी चीजें दिख रही हैं। अगर जवाब नहीं है, तो “almost any” कहना साफ तौर पर गलत है, और ज्यादा accurate title होगा “लगभग हरargparse-based Python command-line program को full GUI application में बदलना”आखिरी meaningful commit 2 साल से भी ज्यादा पहले का है। यह अपने-आप में खराब बात नहीं है, लेकिन खुले issues की संख्या देखकर project पर बहुत भरोसा नहीं बनता
फिर भी project अच्छा है। ऐसी चीजें और देखना चाहूंगा। README में जैसा कहा है, यह force multiplier tool है, जिससे कोई CLI से automation बना सकता है और non-technical office staff के साथ आसानी से share कर सकता है। कुछ वैसा ही जैसा Access ने databases के लिए किया था
Access की तरह, scale या complexity बढ़ने पर इसकी limit सामने आएगी, लेकिन छोटे office use के लिए यह काफी “good enough” हो सकता है
argparseमें क्या कमी दिखती है। मेरी preference external dependencies को minimum रखने की हैargparseसे नहीं किया जा सकता?संबंधित posts:
Gooey: Turn almost any Python command line program into a GUI application - https://news.ycombinator.com/item?id=27490291 - जून 2021, 115 comments
Gooey: Turn command line programs into GUI applications - https://news.ycombinator.com/item?id=8218785 - अगस्त 2014, 74 comments
अच्छा होगा अगर ऑपरेटिंग सिस्टम और shell किसी खास parsing library पर निर्भर हुए बिना यह बेहतर समझ सकें कि प्रोग्राम कैसे चलाया जाता है
अच्छा होगा अगर प्रोग्राम typed JSON/proto format में communicate करें, और सिर्फ अपेक्षित input/output types को inspect करके shell command structuring/autocomplete या पूरा GUI मिल सके
अभी तो सावधानी से straw लगाकर बनाया गया स्तर ही best लगता है। हर प्रोग्राम को अलग-अलग shells के लिए कई autocomplete files export करनी पड़ती हैं, हर प्रोग्राम और parsing library में flag styles काफी अलग होते हैं, और जाहिर है GUI भी नहीं होता
हालांकि gRPC की मुख्य समस्या शायद यह है कि कई developers, मुझे मिलाकर, इसे language के अंदर natural लगने वाले solutions की तुलना में थोड़ा cumbersome मानते हैं
पक्का नहीं कि PowerShell इसके core में मौजूद static types का पूरी तरह लाभ उठा सकता है या नहीं, लेकिन command line पर objects pass करने की इसकी क्षमता लगभग बेजोड़ है
Linux पर
jc(https://github.com/kellyjonbrazil/jc) औरjq(https://jqlang.github.io/jq/) को मिलाकर command line pipelines बनाई जा सकती हैं, लेकिन PowerShell की built-in capability की तुलना में अभी भी दो extra steps करने पड़ते हैंGUI कभी-कभी comfort food जैसा लगता है। क्योंकि शायद ही कभी इस्तेमाल होने वाली CLI से आने वाले cognitive load के बिना आप बस GUI interface को browse कर सकते हैं
थोड़ा अलग मुद्दा है, लेकिन कुछ महीने पहले यहीं CUDATEXT editor के बारे में पता चला, जो एक single-file Python API से MENU, INPUTS जैसे मनचाहे GUI elements इस्तेमाल करने देता है। ये elements editor खुद भी इस्तेमाल करता है
अब मैं ऐसे simple GUI elements से settings कर रहा हूँ, और editor के अंदर ही सीधे blog generate कर रहा हूँ
साथ में देखने लायक:
“Textual: Python के लिए lightweight application framework. Simple Python API से sophisticated user interfaces बनाएं, और apps को terminal और web browser में चलाएं” https://github.com/textualize/textual/
camply: https://juftin.com/camply/
इस शानदार software को बनाने के लिए धन्यवाद कहना चाहता हूँ। मुझे Gooey पसंद है और मैंने इसे कई programs में खूब इस्तेमाल किया है
मेरे लिए यह उस exact जगह पर perfectly fit होता है जहाँ Python script कोई महत्वपूर्ण काम कर रही होती है और अब उसे non-programmers के इस्तेमाल लायक बनाना होता है
इससे naked objects याद आते हैं। Idea यह था कि Java class में बस कुछ annotations और theme define कर दें, तो पूरा GUI या web frontend application generate हो जाए
बहुत शानदार idea था, लेकिन जहाँ तक मुझे पता है, आखिरकार यह ठीक से सफल नहीं हुआ
मेरे हिसाब से समस्या यह है कि presentation, domain, infrastructure जैसे vertical concerns आपस में coupled हो जाते हैं। जब domain model की screen representation और database representation simple हों तो यह ठीक है
लेकिन अगर आप बहुत सारी convenience features वाला complex interface बनाना चाहते हैं, तो वे requirements domain layer में leak करनी पड़ती हैं। उलटा, अगर complex domain model बनाना चाहते हैं, तो language level पर invariants enforce करना अव्यावहारिक है। क्योंकि
Modelreference रखने वाला कोई भी code उसे मनमाने ढंग से बदल सकता हैअच्छा होगा अगर इसका उलटा करने वाली चीज़ भी हो
argparseसे ली गई जानकारी के आधार पर parameter sweep set up करके, फिर उसे results को सही तरह run/save करने वाली shell script में वापस convert किया जा सके तो अच्छा होगापुराने Macintosh Programmer's Workshop, यानी 80–90 के दशक के Mac OS के text-based shell MPW में लगभग हर command के लिए Commando नाम का मिलता-जुलता feature था
Commando की जानकारी
cmdoresource में रखी जाती थी। अगर extended attributes support इतना inconsistent न होता, तो आज भी वैसा कुछ किया जा सकता थाखोजने पर पता चला कि A/UX में भी Commando था। Finder में terminal command पर double-click करने पर CLI options चुनने के लिए Commando box खुलता था, और फिर वह shell window में execute होता था। आजकल Finder में terminal command run करें तो वह arguments के बिना बस shell window में execute हो जाता है
https://cohost.org/boredzo/post/804893-i-still-want-a-moder
http://toastytech.com/guis/aux3.html