19 ms·
Gooey: Turn almost any Python command line program into a full GUI application
- SOLAR_FIELDS 3y agoShouldn't this be qualified with "argparse-based"? Argparse is good for simple stuff but there are many Click based CLI's and a lot of popular CLI libraries build on top of Click. There are also other Python CLI tools that aren't built on argparse or Click, though I will say that these two are probably the most popular ones. Is this confirmed to work with Click? I only see references to argparse. I would go so far to say, if the answer is no, that "almost any" is a flat out lie, and a much more accurate title would be "Turn almost any argparse-based Python command line program into a full GUI application". Also, the last substantial commit was over two years ago. This isn't itself a bad thing, but given the open issue count does not really signal confidence in the project. Otherwise it is a cool project. I would like to see more of this - it's one of those neat force multipliers, as referenced in the README, that some enterprising person could implement as a CLI and then share their automation for the rest of the nontechnical office in an easy way. Kind of like how Access did the same thing for DB's. Like Access, you would butt up against limitations once you started to introduce some level of size or complexity, but it could be "good enough" for a lot of small office use cases.
- pjacotg 3y agoI used it for exactly this in my previous role. I automated a lot of tasks and built tools for my previous team. Most of them weren't Python programmers so I used gooey to create simple GUI's on top of my scripts. It worked really well.
- gverrilla 3y agoMind you give some examples? curious.
- neuromanser 3y agoOne does not need to be a $lang programmer to use a CLI tool written in $lang.
- tourist2d 3y ago[flagged]
- paulddraper 3y agoIt does? Could you explain why you think that?
- selcuka 3y agoSee the author's comment: https://news.ycombinator.com/item?id=38587791 https://news.ycombinator.com/item?id=38587791
- SOLAR_FIELDS 3y agoThe author’s comment actually confirms that it doesn’t currently support anything else other than argparse though. The author says they wrote it to be generic enough to extend to other libraries easily, which is great, but that is not the same at all as currently supporting said libraries. They provided a link that said it supports any cli, but when you follow the link, the instructions tell you to implement an argparse compatible wrapper for your cli in Python, which of course, is supporting argparse
- selcuka 3y agoSure, I was talking about the workaround mentioned here: > You can also invoke any arbitrary executable [https://chriskiehl.com/article/gooey-as-a-universal-frontend https://chriskiehl.com/article/gooey-as-a-universal-frontend], not just python, which is pretty handy. Rhetorics aside, you can use Gooey for any CLI tool using a small Python glue (pardon the pun) code, so it was not a flat out lie.
- SOLAR_FIELDS 3y agoI know we are in semantics land now but most people would probably say that shelling out to another process doesn’t really constitute an integration. Put another way, you could just say that you could easily turn any CLI into a simple Python CLI with only a few lines of code with argparse itself, and that argparse supports any other CLI by just wrapping it, removing mentioning the Gooey part entirely. You’re essentially describing just the benefits and drawbacks of Python’s subprocess and argparse libraries at this point and not really saying anything about Gooey aside from the fact that it is argparse compatible. In other words: “Hey look at this cool thing argparse can do, and because Gooey is basically api compatible with argparse, it can do it too!” And don’t get me wrong, I think Python’s expressiveness with the argparse library and in general its ability to make CLI’s in very few lines of code is great. But really the magic is argparse and Python in that regard.
- jonnycomputer 3y agoI'm curious about the deficiencies you see in argparse... my bias is to minimize 3rd party dependencies ...
- jonnycomputer 3y agoI was genuinely seeking feedback. I use argparse regularly. I have found it somewhat difficult to use when creating nested subparsers. That Click is part of the The Pallets Project gives me more confidence in it being maintained indefinitely, but ...
- LtWorf 3y agoWhat can't you do with argparse exactly?
- cztomsik 3y agoThis reminds me naked objects. The idea was that you only define Java classes with some annotations + theme and the whole GUI (or web frontend) application will be generated for you. Very cool idea but it never worked out (to my knowledge).
- movpasd 3y agoDjango has a similar philosophy: define your models and they are reflected directly into database tables and you can auto-generate forms using them. IMO, the trouble is that it couples vertical concerns (presentation, domain, infrastructure). It's fine as long as the domain model has trivial presentational and database representations. However, if you want to make a complex interface with many convenience features, you'll have to let those requirements bleed into your domain layer; and if want to create complex domain models, it's impractical to enforce invariants at the language level (since anything with a reference to a Model can do arbitrary things to it).
- nathanfig 3y agoI would love something that could do the reverse.
- SOLAR_FIELDS 3y agoA WYSIWYG editor that spits out a CLI you mean? That would pretty neat, though I think would necessarily be kind of constrained. I wonder who has tried that approach, I can't think of any examples
- andy99 3y agoActually, something like a "zotero for argparse" would be cool. Where you enter arguments, their type, help string, defaults etc in a gui and then you can check the ones you need for a given python script and copy the relevant python code into your paste buffer. I don't think it would be a massive time saver however what I usually do now is find some previous script that had similar arguments and copy them, and then copy-paste-edit to add new arguments. The other advantage is you could enter the arguments agnostically and export as whatever language you're working in.
- exe34 3y agohttp://docopt.org/ http://docopt.org/ Not quite what you asked for, but close: type example invocations to generate the CLI, and just pull the arguments from a dictionary at runtime.
- andy99 3y agoI would like to be able to use a gui to set up parameter sweeps based on info pulled from argparse and then convert back to a shell script that runs and saves the output sensibly.
- nathanfig 3y agoNot quite; turn any GUI application into a Python command line program.
- blamazon 3y agoSee also: "Textual: lean application framework for Python. Build sophisticated user interfaces with a simple Python API. Run your apps in the terminal and a web browser." [1] [1]: https://github.com/textualize/textual/ https://github.com/textualize/textual/
- dgellow 3y agoWow, how is that even possible? The terminal examples are way more detailed than I would have imagined possible.
- tayo42 3y agoYeah that's interesting. I didn't think handling mouse clicks was possible. Wonder how it's done.
- eichin 3y agofor most xterm-compatible terminals, you send an escape sequence that enables mouse tracking, and then mouse clicks turn into escape sequences.
- tayo42 3y agoThat's cool! Thanks
- joombaga 3y agoA lot of popular terminal apps support mouse clicks. Off the top of my head vim, emacs, htop, and links2 all have mouse support.
- acaloiar 3y agoAdding Textual support to camply [1] was apparently very easy. I didn't to the implementation; I just contribute to the project sometimes: https://juftin.com/camply/command_line_usage/#tui https://juftin.com/camply/command_line_usage/#tui [1] https://juftin.com/camply/ https://juftin.com/camply/
- hesnuts 3y agoDoes this only build Windows applications, or can it do the same for MacOS/Linux? be great if you could build/package python code easily to run on native OS's without having the user install python, etc first.
- djha-skin 3y agoIt works a treat on those other operating systems and pairs well with pyinstaller to make a single executable.
- fuzztester 3y agoThere is PyInstaller, cx_Freeze, etc. for that. I've used PyInstaller to create standalone Windows EXEs for simple programs like command-line utilities, and even for simple wxPython GUI apps. Worked well, although I've read that there may be some issues for more complex or bigger apps.
- dragonwriter 3y ago"Almost any Python command line program" seems to be an exaggeration. It relies on the command-line program using argparse, and explicitly doesn't work for any that rely on optparse, which, sure, is older, but also means that things which rely on the popular Click command-line library won't work either.
- Spivak 3y ago> which, sure, is older And deprecated for going on 11 major versions of Python.
- dragonwriter 3y agoWhich is arguably a good reason Click should look for an alternative basis (though, OTOH, the reasons Click remains on optparse are, arguably, a reason that optparse, while it perhaps should not be further developed but for bug fixes, should not be considered deprecated), but in fact a lot of Python command-line programs depend on Click, so something that only works on argparse-based programs does not, in fact, support "almost any Python command line program". Interestingly, there is a gooey-inspired GUI generator for Click-based programs: https://github.com/szsdk/quick https://github.com/szsdk/quick
- 29athrowaway 3y agoSee also: Zenity, KDialog and GNU Dialog.
- metadat 3y agoI wonder if Gooey could be made to target generating a React or even JS-free vanilla web app, instead of a native GUI? In spirit, Gooey reminds me of one of my favorite low-code tools for technically savvy individuals to put a web frontend in front of arbitrary CLI programs: Python Script Server https://github.com/bugy/script-server https://github.com/bugy/script-server
- sgarland 3y ago“Instead of a native GUI, let us launch an entire browser” is how we got 100+ MB Hello World apps.
- mst 3y agoWhen it's launching a new tab in an existing browser it's rather less overhead, and also tends to be convenient in a way nothing I've dealt with other than Tcl/Tk is. (notably Tcl/Tk deals with remote X over ssh nicely and far too many things these days don't so much)
- metadat 3y agoHey SGarland, thanks for replying! Launching it only on demand is an interesting idea, and I totally get your sentiment on bloat. I was a 90s teen, 32MB of ram was enough for just about everything at the time, while today that's "embedded" territory, haha. Still, these days my web browser is generally already open. Anyhow, maybe my writing could have been more clear. I was thinking of it differently, running the app as a persistent webserver. Then I could access the things from anywhere. "Accessible from any web browser" is one of the primary properties I like about the Python Script Server (mentioned/linked in my first post). Just imagine if someone somehow figured out how to make a Gooey equivalent for Go or Rust. If done well, it could become very popular. Especially considering the difficulty of creating UIs in those languages! Much more challenging than Python.
- sgarland 3y agoOk, a webserver I could get behind, yes. It’s everything being made into Electron apps that bothers me. Spotify takes up well over 1 GiB of RAM, and for what?
- emmet 3y agoVery happy to see something like this! Wish it had been around years ago to save me the hours I spent wrangling gui2py
- Uptrenda 3y agoPython getting a lot of love on HN recently. >Feels good man
- dang 3y agoRelated: Gooey: Turn almost any Python command line program into a GUI application - https://news.ycombinator.com/item?id=27490291 https://news.ycombinator.com/item?id=27490291 - June 2021 (115 comments) Gooey: Turn command line programs into GUI applications - https://news.ycombinator.com/item?id=8218785 https://news.ycombinator.com/item?id=8218785 - Aug 2014 (74 comments)
- zikohh 3y agoDoes this work with any OS?
- agumonkey 3y agothere's a near complete isomorphism between cli/tui arg parse and web url routing someone is surely doing a smalltalkish metaclass trick to turn any object into a local tty or http or rest or else interfaced thing
- timeagain 3y agoAnything that can be handled by a compiler can be hacked to interface with anything that can be handled by an interpreter. That’s the kind of fundamental daoist “code is data is code” that underlies the power of computing.
- bqmjjx0kac 3y agoIt also turns out that code is mathematical proofs and proofs are code, thanks to the Curry-Howard isomorphism. https://en.wikipedia.org/wiki/Curry%E2%80%93Howard_correspondence https://en.wikipedia.org/wiki/Curry%E2%80%93Howard_correspon...
- agumonkey 3y agoyeah but so far these are all separate microcosms with no clear common model
- munch117 3y agoWhen all you have is a web framework, everything looks like an url.
- goostavos 3y agoHey, what the -- this is my thing. ^_^ What's it doing at the top of HN? A quick reply to some of the comments about argparse. Gooey is super old at this point. Argparse was a solid choice at the time when Gooey started. These days, Gooey itself speaks in JSON and is decoupled from argparse itself. However, argparse remains the main "blessed" interface (mostly because nobody else has built a different one). Some fun FYIs: You can also invoke any arbitrary executable[0], not just python, which is pretty handy. Re: last commit being 2 years ago. It gets harder to justify working for free on niche software as you get older and priorities change :( If it's any consolation, I DO feel guilty all the time. I have no idea why, but where I live, there's "GOOEY" graffiti tagged all over the place, so it's a nice ever-present reminder of the issue tracker that's currently going unloved. haha. [0] https://chriskiehl.com/article/gooey-as-a-universal-frontend https://chriskiehl.com/article/gooey-as-a-universal-frontend
- c6401 3y agoThank you for your work, awesome software. I'm wondering if there's a way to use python-fire instead of argpraser with gooey?
- seeknotfind 3y agoThis is a really cool idea. I love interface disconnected from APIs. We have so many annoyances these days because applications can't be programmatically controlled. Honestly, I'd like to see legislation saying all application functionality needs to have APIs.
- sezna 3y agoI would not like to have to concern myself with exposing government-compliant APIs when coding any arbitrary tool...the free market can reward good development.
- dimask 3y ago> the free market can reward good development ha ha No way, especially because all the people taking most market-business-related decisions (eg which software to buy) are not tech-oriented. If we had more power on these decisions, that would mean that development, and even advertising of products, would be closer to what the parent comment suggest. But alas.
- jimboBimbo69 3y ago[flagged]
- dietr1ch 3y agoI wish that the OS and shell had better insight on how to run programs without need for specific library parsing libraries. I'd love to see programs communicate through a typed JSON/proto format that shed enough details to make this more independent, and get useful shell command structuring/completion or full blown GUIs from simply introspecting the expected input and output types. Today it seems that the best you can get is still made out of carefully placed straws as programs need to export completion files to many shells, there's vastly different styles for flags across programs and parsing libraries, and obviously, there's no GUIs around.
- SOLAR_FIELDS 3y agoKind of like some generic gRPC interchange/CLI API with native OS support? Something like that could be neat. I conjecture the main problem with gRPC is that a lot of developers (myself included) find dealing with it a bit unwieldy compared to more native (by native I mean in-language) solutions.
- Too 3y agoIf you look into IPC primitives in each OS you can find goodies that do expose structured metadata about what interfaces are available and how they can be called. D-Bus, sd-bus, COM, Binder, to name a few. It’s just that the tooling around it isn’t as easily exposed and they aren’t tailored for on-demand launch via command line. If the shell treated such as a more first class citizen, good results may come out. Another big problem is portability, if you designed your app with sdbus, it’s not going to work on a non systemd distro, even less on Windows. What’s needed is a standardized abstraction layer on top.
- Cloudef 3y agoNow you have a thing called powershell. Though as more serious answer plan9 was probably the only OS that really tried this.
- jay-barronville 3y agoIs there anything good Plan 9 hasn’t tried? I feel like every time I hear about a good OS idea, someone brings up Plan 9. Haha.
- deleted 3y ago[deleted]
- hoten 3y agoHow would one integrate this with a CLI tool that expects some user input during execution? Would love to package this around a bisect script I use to debug issues for my game engine. Giving it a GUI would make it possible to share it with users such that they too can help bisect problems.
- rodneyzeng 3y agoIs there an counterpart tool for ffmpeg with those parameters in GUI? That would be an omnipower app...
- hiAndrewQuinn 3y agoTry Handbrake!
- defrost 3y agoThe Handbrake suggestion is a good one if your only interest is transcoding ... which barely scratches the breadth of what ffmpeg as a tool can do. Try: https://amiaopensource.github.io/ffmprovisr/ https://amiaopensource.github.io/ffmprovisr/ for a 'better' ffmpeg CLI documentation, your mileage may vary, it's task and example focused. Try: https://github.com/topics/ffmpeg-gui https://github.com/topics/ffmpeg-gui for 66 variations on a GUI for ffmpeg of which I have no comment, I'm an old school CLI user through and through.
- poisonborz 3y agoThere are gajillions of ffmpeg UIs like Handbrake. But for me, more oftan than not GPT is the fastest way.
- theoogway 3y agoWow, what a nice coincidence to see this on HN! Just two days ago, I was hacking up a similar project. https://github.com/livetheoogway/python-uime https://github.com/livetheoogway/python-uime This one is a much smaller hack to spruce up your local scripts. Although it's still a work in progress with features pending, I'd really appreciate any initial feedback or thoughts. Thanks for checking it out! [0] https://github.com/livetheoogway/python-uime https://github.com/livetheoogway/python-uime
- sanjjay 3y agoMotion
- inetknght 3y agoI've wondered about doing something like this in C++ with imgui and boost program_options. I'm very happy to see an example of it already done in Python!
- warangal 3y agoI sometimes find GUIs equivalent to comfort-food as you can just stroll through a gui interface without lot of cognitive overload that may come from a rarely used CLI. A bit tangential to current discussion, but i came across CUDATEXT editor a few months ago here which provides a single file python API to let me use arbitrary GUI elements like MENU, INPUTS etc which editor is itself using. I currently generate my blog from editor itself with configuration done through these simple GUI elements.
- Cloudef 3y agoDid something similar with my pokemon emerald randomizer. This parses output of wasm/wasi program's --help output and generates a web interface https://cloudef.github.io/pokeemerald-randomizer/ https://cloudef.github.io/pokeemerald-randomizer/ the aruments are then passed to the wasi/wasm binary to generate the final rom.
- DeathArrow 3y agoSo is it a kind of Swagger for command line apps?
- amai 3y agoWould be nice to combine this with Google Fire: https://google.github.io/python-fire/guide/ https://google.github.io/python-fire/guide/
- jll29 3y agoNice. Now we'd like the converse program: one that transforms any GUI application into a cmdline tool or wraps it. ;-)
- Alifatisk 3y agoThat's incredible
- broner 3y agoReminds me of this previous HN submission Blotato: https://news.ycombinator.com/item?id=38206235 https://news.ycombinator.com/item?id=38206235
- ksherlock 3y agoWith the old Macintosh Programmer's Workshop (MPW; a text-based shell for Mac OS of the 80s and 90s) there was similar functionality called Commando for almost every command. The commando information was kept in a 'cmdo' resource. Something similar could be done today with extended attributes, if support wasn't so hit or miss. Oh, apparently, A/UX had commando as well. If you double-clicked a terminal command from the Finder, it would pop up the commando box to choose your CLI options, then run it in a shell window. Today, running a terminal command from Finder just runs it without any arguments in a shell window. https://cohost.org/boredzo/post/804893-i-still-want-a-moder https://cohost.org/boredzo/post/804893-i-still-want-a-moder http://toastytech.com/guis/aux3.html http://toastytech.com/guis/aux3.html
- enjrolas 3y agoHey, I just want to say thanks for making this wonderful piece of software! I love gooey and have used it extensively for several different programs. For me, it perfectly fits this area where you have a python script that does something important, and now you need to set it up so that non-programmers can use it as well.
- Levitating 3y agoThere are also similar applications for usage with clap-rs.[1][2] [1]: https://github.com/MichalGniadek/klask https://github.com/MichalGniadek/klask [2]: https://github.com/grantshandy/claui https://github.com/grantshandy/claui
- mppowers 3y agoCool! I've wanted to write something similar to turn a python cli into a web app, something like those sites that convert file types but general purpose.
- theoogway 3y agoSuggesting a look at this hack of mine for web apps https://github.com/livetheoogway/python-uime https://github.com/livetheoogway/python-uime
- deleted 3y ago[deleted]
- stormking 3y agoGenerating a graphical form for the options and arguments does not turn a command line program into "a full GUI application".
- unnouinceput 3y agoAnd then there is me who tries to fight with all my clients to have their GUI friendly applications to, at least, have command parameters, so that it can be automated through services/task scheduler/cron
- sim7c00 3y agolooks pretty neat honestly to make ur programs more easily accessible. gui programming is always such a mess!. hunter42 :').