3 पॉइंट द्वारा GN⁺ 2023-12-10 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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'
)
  • supported full layout options में show_sidebar=True, show_sidebar=False, navigation='TABBED', tabbed_groups=True शामिल हैं
  • Advanced

    • default screen full/advanced settings screen है
    • ज्यादातर applications के लिए CLI structure से match करने वाला flat layout suitable होता है
    • कई paths या छोटे tools के combination वाले CLI के लिए column layout suitable होता है
    • column layout main path को left column में और corresponding arguments को right side में दिखाता है
    • current layout को parameter से explicitly specify नहीं किया जा सकता; यह code में subparsers होने या न होने के आधार पर configured होता है
  • Basic

    • advanced=False set करने पर basic view में switch होता है
    • यह तब suitable है जब users console application से familiar हों, लेकिन simple terminal से अधिक polished screen चाहते हों
    @gooey(advanced=False)
    def main():
    
    # rest of code
    
  • No Config

    • auto_start=True set करने पर settings screen के बिना सीधे display area में जाकर host program run होता है
    • छोटे one-off scripts का appearance improve करने के लिए इस्तेमाल होता है
    @Gooey(auto_start=True)
    def main():
        ...
    

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 हैं
    • on_success
    • on_error
  • दोनों 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 टिप्पणियां

 
GN⁺ 2023-12-10
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 बनाने की कोशिश में कई घंटे लगाए, फिर भी शुरुआत तक नहीं कर पाया
    • वाकई शानदार idea है। मुझे API से अलग interface पसंद है
      आजकल applications को programming से control न कर पाने की वजह से बहुत झुंझलाहट होती है। सच कहूं तो काश ऐसा कानून होता कि हर application feature के लिए API होना चाहिए
    • शानदार project! एक बात जाननी थी: आप sys.argv को current working directory की local file में dump क्यों करते हैं? https://github.com/chriskiehl/Gooey/blob/be4b11b8f27f500e732...
      tmp.txt कोई खास unique नाम नहीं है, इसलिए सोच रहा हूं कि क्या मैं कुछ miss कर रहा हूं
    • “आजकल Gooey खुद JSON पर चलता है और 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 हो, तो लगता है दोनों फायदे मिल सकते हैं
    • Gooey बहुत पुराना इसलिए है क्योंकि इसे neglect किया गया है। दोष देने के लिए नहीं कह रहा, बस reality यही है
      इससे भी खराब यह है कि इसे replace करने लायक कोई viable alternative भी नहीं आया, और दो forks में से किसी को भी traction नहीं मिला
  • क्या इसे “argparse-based” तक सीमित नहीं कहना चाहिए?
    argparse simple 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 रखने की है
    • पिछली नौकरी में बिल्कुल इसी use case के लिए इसे इस्तेमाल किया था। बहुत सारे काम automate किए और team के लिए tools बनाए, लेकिन ज्यादातर लोग Python programmers नहीं थे, इसलिए scripts के ऊपर Gooey से simple GUI लगा दिया। बहुत अच्छे से काम किया
    • ऐसा क्या है जो ठीक-ठीक 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 भी नहीं होता

    • अब PowerShell नाम की चीज़ है। थोड़ा और गंभीरता से जवाब दूँ तो, ऐसा सच में आज़माने वाला operating system शायद Plan 9 ही एकमात्र था
    • क्या आप operating system native support वाले किसी general-purpose gRPC exchange/CLI API जैसी चीज़ की बात कर रहे हैं? वह काफी शानदार हो सकता है
      हालांकि gRPC की मुख्य समस्या शायद यह है कि कई developers, मुझे मिलाकर, इसे language के अंदर natural लगने वाले solutions की तुलना में थोड़ा cumbersome मानते हैं
    • PowerShell आज़माना अच्छा रहेगा। मूलतः यह Microsoft के .NET ecosystem को interactive command line में ढालता है
      पक्का नहीं कि 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/

    • Gooey जैसा भी कुछ है: https://github.com/Textualize/trogon “Click CLI को आसानी से powerful terminal application में बदलें”
    • वाह, यह कैसे संभव है? Terminal example मेरी कल्पना से कहीं ज्यादा detailed है
    • लगता है camply में Textual support जोड़ना काफी आसान था। इसे मैंने implement नहीं किया, बस कभी-कभी project में contribute करता हूँ: https://juftin.com/camply/command_line_usage/#tui
      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 था, लेकिन जहाँ तक मुझे पता है, आखिरकार यह ठीक से सफल नहीं हुआ

    • Django में भी मिलती-जुलती philosophy है। Model define करें तो वह सीधे database table में reflect होता है, और उसी model से forms automatically generate किए जा सकते हैं
      मेरे हिसाब से समस्या यह है कि 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 करना अव्यावहारिक है। क्योंकि Model reference रखने वाला कोई भी code उसे मनमाने ढंग से बदल सकता है
  • अच्छा होगा अगर इसका उलटा करने वाली चीज़ भी हो

    • GUI में argparse से ली गई जानकारी के आधार पर parameter sweep set up करके, फिर उसे results को सही तरह run/save करने वाली shell script में वापस convert किया जा सके तो अच्छा होगा
    • क्या मतलब WYSIWYG editor CLI output करे? काफी cool लग सकता है, लेकिन अनिवार्य रूप से कुछ हद तक constrained होगा। जानना चाहूँगा कि किसी ने ऐसा approach आज़माया है या नहीं, लेकिन कोई example याद नहीं आ रहा
  • पुराने Macintosh Programmer's Workshop, यानी 80–90 के दशक के Mac OS के text-based shell MPW में लगभग हर command के लिए Commando नाम का मिलता-जुलता feature था
    Commando की जानकारी cmdo resource में रखी जाती थी। अगर 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