chriskiehl / gooey Goto Github PK
View Code? Open in Web Editor NEWTurn (almost) any Python command line program into a full GUI application with one line
License: MIT License
Turn (almost) any Python command line program into a full GUI application with one line
License: MIT License
Can this have a Terminate/Stop like button next to loading image so that job can be stopped in between.
And a "Restart" button will help to start it again.
:) sorry for all the reports but I think it just means you have an awesome plugin and people use it!
So when I specify the following argument:
parser.add_argument('gpx_files', type=argparse.FileType('r'), nargs='+', help='File containing GPX metadata that will be uploaded to the UV server.')
I get one input field in the required (which is correct because + means one or more) and an optional but empty fieldset. Is there a way to dynamically add an optional field? Like a [+] button.
Also, it seems that type=file gets a file input widget but argparse.FileType gets just a text input.
Invoking python ./test.py
on the commandline gives me the following error
Traceback (most recent call last):
File "./test.py", line 7, in <module>
from gooey import gooey
File "/home/mb/Documents/python/Gooey/gooey/__init__.py", line 1, in <module>
from gooey_decorator import Gooey
File "/home/mb/Documents/python/Gooey/gooey/gooey_decorator.py", line 16, in <module>
from gooey.gui.base_window import BaseWindow
File "/home/mb/Documents/python/Gooey/gooey/gui/base_window.py", line 16, in <module>
import header
File "/home/mb/Documents/python/Gooey/gooey/gui/header.py", line 10, in <module>
from gooey import i18n
File "/home/mb/Documents/python/Gooey/gooey/i18n.py", line 37, in <module>
_DICTIONARY = load(get_path(_LANG))
File "/home/mb/Documents/python/Gooey/gooey/i18n.py", line 35, in load
'translation file is in the languages directory, ')
IOError: [Errno Language file not found. Make sure that your ] translation file is in the languages directory,
What kind of graphics do you need?
Can you provide a list / table with, for each graphic elements:
As written, Gooey does not handle more complex ArgumentParser configurations. The two hitches I ran into are mutually exclusive groups, and directly populating custom classes. For example, I have the following code from a script I threw together for slicing out a geographically relevant subset from a larger dataset:
parser = argparse.ArgumentParser(description='Extract a subset of data from a directory structure')
verbosity = parser.add_mutually_exclusive_group()
verbosity.add_argument('-v', '--verbose', dest='verbose', action="store_true", help="Show more details")
verbosity.add_argument('-q', '--quiet', dest='quiet', action="store_true", help="Only output on error")
parser.add_argument('-i', '--indir', dest='indir', type=str, help="The top level of the input directory", required=True)
parser.add_argument('-o', '--outdir', dest='outdir', type=str, help="Output directory for selected data (Note that this directory will be created if it does not already exist. If it already exists, it will be overwritten)", required=True)
parser.add_argument('--sw', '--southwest', dest='swCorner', type=Coordinate.fromString, nargs=1, help='Southwest corner of selection region in integer degrees', metavar="{N|S}##{E|W}###", required=True)
parser.add_argument('--ne', '--northeast', dest='neCorner', type=Coordinate.fromString, nargs=1, help='Northeast corner of selection region in integer degrees', metavar="{N|S}##{E|W}###", required=True)
Gooey immediately choked on the verbosity
object. This appears to be due to the fact that monkey_parser.py
is naievely eval
ing the input code, and expecting all lines to be simple add_argument
calls. Removing the verbosity
object and making those arguments on the base parser got around the issue, but now there is no way to ensure that one and only one of those switches is active. This seems like the sort of thing that would be good to support, perhaps as radio buttons.
The second hitch I ran into was with the last two arguments, which directly insert data into new instances of the custom Coordinate
object, via Coordinate.fromString()
. This too can be worked around by putting those arguments into strings, then calling fromString()
after the fact, but that is sub-optimal, since it results in otherwise un-necessary extra complexity and code.
Turn (almost) any command line program into a full GUI application with one line
So my little C programs can have GUI for free? Wow.
setup.py
Python? Sad, no easy Windows portability.
Gooey is attached to your code via a simple decorator ...
So it's not just Gooey in Python, but also the target program nees to be in Python? So it's not that useful... But I still have a number of sys.argv
-parsing Python programs, which I'll now automagically ...
parses it for all references to
ArgumentParser
What is it? Probably a python battery for parsing command line arguments (never used that). So none of my programs can be "covered" by Gooey. Sad.
I think the scope (Python programs using ArgumentParser) should be declared up front, not in the middle of README. (almost) any command line program
is an exaggeration.
Or you will add a mode for arbitrary external programs (i.e. calling them with --help
, parsing that human-readable (but structuted) description of possible command line arguments and values, then showing the window)?
Specifically in source_parser when it attempts to read __dict__
from the string object. Test using a file with """Some content""" inline - I believe any multiline comments will exhibit the same behavior
The symptom AFAIK is an error emitted from modules when the post-guification code is attempted to be executed.from a source file that includes docstrings.
Really cool library.
Not so much an issue, more of a feature request: have Gooey work with or use docopt.
Hi there,
Finally decided to test this out on Linux. When I decide to invoke the script like so:
python imgur.py
I get an error like this:
Traceback (most recent call last):
File "imgur.py", line 35, in <module>
main()
File "/usr/local/lib/python2.7/dist-packages/Gooey-0.1.0-py2.7.egg/gooey/gooey_decorator.py", line 85, in inner
parser = get_parser(module_path)
File "/usr/local/lib/python2.7/dist-packages/Gooey-0.1.0-py2.7.egg/gooey/gooey_decorator.py", line 114, in get_parser
return source_parser.extract_parser(module_path)
File "/usr/local/lib/python2.7/dist-packages/Gooey-0.1.0-py2.7.egg/gooey/source_parser.py", line 144, in extract_parser
client_module = modules.load(module_source)
File "/usr/local/lib/python2.7/dist-packages/Gooey-0.1.0-py2.7.egg/gooey/modules.py", line 32, in load
os.remove(tmp_py_file)
OSError: [Errno 2] No such file or directory: '/usr/local/lib/python2.7/dist-packages/Gooey-0.1.0-py2.7.egg/gooey/d26058977d6da0ec2afd7fee0e636.py'
Invoking the script with sudo python imgur.py
seems to fix that issue, but then when I decide to run it, the program crashes and I end up with something like this (emphasis on the last error to do with the double free corruption thingy):
(python:2533): Gtk-CRITICAL **: gtk_text_layout_real_invalidate: assertion 'layout->wrap_loop_count == 0' failed
(python:2533): Gtk-WARNING **: Invalid text buffer iterator: either the iterator is uninitialized, or the characters/pixbufs/widgets in the buffer have been modified since the iterator was created.
You must use marks, character numbers, or line numbers to preserve a position across buffer modifications.
You can apply tags and insert marks without invalidating your iterators,
but any mutation that affects 'indexable' buffer contents (contents that can be referred to by character offset)
will invalidate all outstanding iterators
(python:2533): Pango-CRITICAL **: pango_layout_index_to_pos: assertion 'layout != NULL' failed
*** Error in `python': double free or corruption (fasttop): 0x00000000027dbd10 ***
Not sure if this has something to do with the way I installed wxPython, perhaps? I had to follow these instructions to get it installed:
http://wiki.wxpython.org/InstallingOnUbuntuOrDebian
For DIST I used "natty" since that seemed to be the newest Ubuntu distro in that list. But even then, I'm using Linux Mint, not Ubuntu (even though Mint is based on Ubuntu).
This was my Gooey script I used:
https://github.com/chrispy645/gooey-imgur
Cheers
The situation is hard to describe but basically,
@Gooey
def main():
"""Main"""
bar = 'bar'
parser = ArgumentParser(description='Desc')
parser.add_argument('bar', help=('bar')) ##################
args = parser.parse_args()
print(args)
return True
works just fine but if you replace 'bar' with bar in the line flagged with '######', you get
Traceback (most recent call last):
File "letscode.py", line 20, in <module>
main()
File "/home/sylvaindesodt/TmpCode/.tmp/letscode/letscode/Gooey/gooey/gooey_decorator.py", line 47, in inner
parser = get_parser(module_path)
File "/home/sylvaindesodt/TmpCode/.tmp/letscode/letscode/Gooey/gooey/gooey_decorator.py", line 76, in get_parser
return source_parser.extract_parser(module_path)
File "/home/sylvaindesodt/TmpCode/.tmp/letscode/letscode/Gooey/gooey/source_parser.py", line 99, in extract_parser
return MonkeyParser(python_code)
File "/home/sylvaindesodt/TmpCode/.tmp/letscode/letscode/Gooey/gooey/monkey_parser.py", line 27, in __init__
self._parser_instance = self._build_argparser_from_client_source(source_code)
File "/home/sylvaindesodt/TmpCode/.tmp/letscode/letscode/Gooey/gooey/monkey_parser.py", line 60, in _build_argparser_from_client_source
eval(line)
File "<string>", line 1, in <module>
NameError: name 'bar' is not defined
Similar to #25.
Would improve usability, and would reduce confusion from incorrectly formatted date strings.
Leave thks
When in try to install Gooey using pip ( pip install https://github.com/chriskiehl/Gooey.git
) I get this error:
Traceback (most recent call last):
File "/home/tim/Workspace/thedotabot/task_queue/env/local/lib/python2.7/site-packages/pip/basecommand.py", line 122, in main
status = self.run(options, args)
File "/home/tim/Workspace/thedotabot/task_queue/env/local/lib/python2.7/site-packages/pip/commands/install.py", line 278, in run
requirement_set.prepare_files(finder, force_root_egg_info=self.bundle, bundle=self.bundle)
File "/home/tim/Workspace/thedotabot/task_queue/env/local/lib/python2.7/site-packages/pip/req.py", line 1197, in prepare_files
do_download,
File "/home/tim/Workspace/thedotabot/task_queue/env/local/lib/python2.7/site-packages/pip/req.py", line 1375, in unpack_url
self.session,
File "/home/tim/Workspace/thedotabot/task_queue/env/local/lib/python2.7/site-packages/pip/download.py", line 582, in unpack_http_url
unpack_file(temp_location, location, content_type, link)
File "/home/tim/Workspace/thedotabot/task_queue/env/local/lib/python2.7/site-packages/pip/util.py", line 627, in unpack_file
and is_svn_page(file_contents(filename))):
File "/home/tim/Workspace/thedotabot/task_queue/env/local/lib/python2.7/site-packages/pip/util.py", line 210, in file_contents
return fp.read().decode('utf-8')
File "/home/tim/Workspace/thedotabot/task_queue/env/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: invalid start byte
It also would be nice to publish this great project on PyPI. :)
Hi,
When we execute our job using UI and do some changes in linked file and then want to execute again.
We have to do following:
Instead.
This can just have a "Restart" button that can run the job with last supplied parameters for ease.
This would greatly increase its usefulness, since now the generated Application is limited to what gooey does with the argparse code.
If it were to output the source code, a developer could then finetune it to his specific needs. I would personally use it as a boilerplate GUI for scripts I write.
I'm trying to get mock_argparse_example.py to run as is, but after pressing start I get this error:
Traceback (most recent call last):
File "/home/vesa/venv/local/lib/python2.7/site-packages/Gooey-0.1.0-py2.7.egg/gooey/gui/windows/footer.py", line 152, in OnStartButton
self._controller.OnStartButton(event, self)
File "/home/vesa/venv/local/lib/python2.7/site-packages/Gooey-0.1.0-py2.7.egg/gooey/gui/controller.py", line 61, in OnStartButton
self.RunClientCode(command)
File "/home/vesa/venv/local/lib/python2.7/site-packages/Gooey-0.1.0-py2.7.egg/gooey/gui/controller.py", line 72, in RunClientCode
p = subprocess.Popen(command, bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
My current environment:
(venv)vesa@xubuntu ~> lsb_release -d
Description: Ubuntu 14.04.1 LTS
(venv)vesa@xubuntu ~> python --version
Python 2.7.6
(venv)vesa@xubuntu ~> pip freeze
Gooey==0.1.0
Pillow==2.7.0
argparse==1.2.1
docx==0.2.4
jdcal==1.0
lxml==3.4.1
openpyxl==2.1.4
wsgiref==0.1.2
wxPython==2.8.12.1
On startup of any gooey app (including mockapp.py
) I get the error message
"can't open file '/usr/local/Cellar/python/2.7.7/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Gooey-0.1.0-py2.7.egg/gooey/images/loader.gif" (error 2: No such file or directory)".
In the folder /usr/local/Cellar/python/2.7.7/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Gooey-0.1.0-py2.7.egg/gooey/images/ I have
__init__.py
__init__.pyc
alessandro_rei_checkmark.png
computer2.png
icon.ico
settings2.png
computer.png
computer3.png
images.jpg
It looks like loader.gif is not getting installed.
On running test.py / my own test program, it errors saying that gooey-decorator is not a module.
Your setup.py reads in README.md but is not included in your MANIFEST.in.
$ python setup.py sdist
$ cd dist
$ pip install Gooey-0.1.0.tar.gz
Unpacking ./Gooey-0.1.0.tar.gz
Running setup.py (path:/var/folders/sg/4lw8t2_91mz6p8qdgl2q_h_80000gn/T/pip-fme_83-build/setup.py) egg_info for package from file:///Users/ctokheim/Desktop/Gooey/dist/Gooey-0.1.0.tar.gz
Traceback (most recent call last):
File "<string>", line 17, in <module>
File "/var/folders/sg/4lw8t2_91mz6p8qdgl2q_h_80000gn/T/pip-fme_83-build/setup.py", line 5, in <module>
with open('README.md') as readme:
IOError: [Errno 2] No such file or directory: 'README.md'
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 17, in <module>
File "/var/folders/sg/4lw8t2_91mz6p8qdgl2q_h_80000gn/T/pip-fme_83-build/setup.py", line 5, in <module>
with open('README.md') as readme:
IOError: [Errno 2] No such file or directory: 'README.md'
----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /var/folders/sg/4lw8t2_91mz6p8qdgl2q_h_80000gn/T/pip-fme_83-build
Storing debug log for failure in /Users/ctokheim/.pip/pip.log
It looks like either you could change your setup.py to use README.txt (not sure why you have two readme's?):
with open('README.txt') as readme:
long_description = readme.read()
Or just include README.md in your MANIFEST.in file.
more a request feature than a bug, there is no site for the project, if you create a "gh-pages" branch I can push request this http://ludovio.github.io/Gooey/
you just have to select the theme you want
Using Gooey 0.1.0 on OSX Mavericks (10.9), I did a git clone from github, then installed:
git clone https://github.com/chriskiehl/Gooey.git
sudo python setup.py install
When I try to run the mockapp.py from the mockapplications directory, I got a permission error:
richs-mbp-8408:mockapplications richb$ python mockapp.py
['mockapp.py']
Traceback (most recent call last):
File "mockapp.py", line 69, in <module>
main()
File "/Library/Python/2.7/site-packages/Gooey-0.1.0-py2.7.egg/gooey/python_bindings/gooey_decorator.py", line 86, in inner
with open(filepath, 'w') as f:
IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/Gooey-0.1.0-py2.7.egg/gooey/_tmp/mockapp.py'
What can I do to fix the permissions? Thanks!
NB: I used sudo on the python setup.py install
because without sudo, I get:
richs-mbp-8408:Gooey richb$ python setup.py install
running install
Checking .pth file support in /Library/Python/2.7/site-packages/
error: can't create or remove files in install directory
The following error occurred while trying to add or remove files in the
installation directory:
[Errno 13] Permission denied: '/Library/Python/2.7/site-packages/test-easy-install-10774.pth'
The installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:
/Library/Python/2.7/site-packages/
Perhaps your account does not have write access to this directory? If the
installation directory is a system-owned directory, you may need to sign in
as the administrator or "root" account. If you do not have administrative
access to this machine, you may wish to choose a different installation
directory, preferably one that is listed in your PYTHONPATH environment
variable.
For information on other options, you may wish to consult the
documentation at:
https://pythonhosted.org/setuptools/easy_install.html
Please make the appropriate changes for your system and try again.
My script:
import argparse
from gooey import Gooey
@gooey(advanced=True, program_name='Test', program_description='Test')
def main():
parser = argparse.ArgumentParser('Get my users')
parser.add_argument('-type', "--type", type=str, action='store', dest='type', help= "type Query")
parser.add_argument('-dst', "--datestart", type=str, action='store', dest='date_start', help= "from Date")
parser.add_argument('-dsp', "--datestop", type=str, action='store', dest='date_stop', help= "to Date")
parser.add_argument('-n',"--IDuser", type=str, action='store', dest='idu', help="IDuser")
parser.add_argument('-t',"--text", type=str, action='store', dest='text', help="find Text")
parser.add_argument('-f',"--file", type=str, action='store', dest='filepath', help="File Save")
args = parser.parse_args()
query_type = args.type
date_start=args.date_start
date_stop=args.date_stop
userid=args.idu
input_data = args.text
path_to_file = args.filepath
print path_to_file
if name == 'main':
main()
Errors:
alessandro_rei_checkmark = os.path.join(image_dir, "alessandro_rei_checkmark.png")
computer = os.path.join(image_dir, "computer.png")
computer2 = os.path.join(image_dir, "computer2.png")
computer3 = os.path.join(image_dir, "computer3.png")
icon = os.path.join(image_dir, "icon.ico")
images = os.path.join(image_dir, "images.jpg")
loader = os.path.join(image_dir, "loader.gif")
settings2 = os.path.join(image_dir, "settings2.png")
init = os.path.join(image_dir, "init.py")
init = os.path.join(image_dir, "init.pyc")
Traceback (most recent call last):
File "1.py", line 26, in
main()
File "c:\python27\lib\site-packages\gooey-0.1.0-py2.7.egg\gooey\gooey_decorator.py", line 59, in inner
frame = BaseWindow(BodyPanel, client_app, params)
File "c:\python27\lib\site-packages\gooey-0.1.0-py2.7.egg\gooey\gui\base_window.py", line 44, in init
self._init_components(BodyPanel)
File "c:\python27\lib\site-packages\gooey-0.1.0-py2.7.egg\gooey\gui\base_window.py", line 66, in _init_components
parent=self)
File "c:\python27\lib\site-packages\gooey-0.1.0-py2.7.egg\gooey\gui\header.py", line 32, in init
self._init_components(heading, subheading)
File "c:\python27\lib\site-packages\gooey-0.1.0-py2.7.egg\gooey\gui\header.py", line 45, in _init_components
self._subheader = wx.StaticText(self, label=subheading)
File "c:\python27\lib\site-packages\wx-3.0-msw\wx_controls.py", line 997, in init
controls.StaticText_swiginit(self,controls.new_StaticText(_args, *_kwargs))
TypeError: String or Unicode type required
Hi, Gooey is a great idea, I was wondering is it possible to add Python 3 compatibility for this project?
Hi all,
I am trying to run a very simple example with argparse and gooey (found here), just to start learning how I could use it.
import argparse
from gooey import Gooey
@Gooey
def Main():
parser = argparse.ArgumentParser(description="Short sample app")
parser.add_argument('-a', action="store_true", default=False)
parser.add_argument('-b', action="store", dest="b")
parser.add_argument('-c', action="store", dest="c", type=int)
print parser.parse_args()
if __name__ == "__main__":
Main()
Unfortunately, I already run through an error:
PS C:\Users\xx> python .\gooeyparstest.py
alessandro_rei_checkmark = os.path.join(image_dir, "alessandro_rei_checkmark.png")
computer = os.path.join(image_dir, "computer.png")
computer2 = os.path.join(image_dir, "computer2.png")
computer3 = os.path.join(image_dir, "computer3.png")
icon = os.path.join(image_dir, "icon.ico")
images = os.path.join(image_dir, "images.jpg")
settings2 = os.path.join(image_dir, "settings2.png")
__init__ = os.path.join(image_dir, "__init__.py")
__init__ = os.path.join(image_dir, "__init__.pyc")
Traceback (most recent call last):
File ".\gooeyparstest.py", line 15, in <module>
Main()
File "C:\Anaconda\lib\site-packages\gooey-0.1.0-py2.7.egg\gooey\gooey_decorator.py", line 45, in inner
parser = get_parser(module_path)
File "C:\Anaconda\lib\site-packages\gooey-0.1.0-py2.7.egg\gooey\gooey_decorator.py", line 77, in get_parser
'Could not locate ArgumentParser statements in Main().'
gooey.parser_exceptions.ParserError: Could not locate ArgumentParser statements in Main().
This is probably my fault :( Please checkout github.com/chriskiehl/gooey to file a bug!
Any ideas on why ArgumentParser cannot be found?
Thanks a lot
After testing the application to work from source, I've built an executable:
pyinstaller.exe --onefile app.py
When I run the app.exe from the cmd, it prints the following error to the log:
Traceback (most recent call last):
File "", line 146, in
File "C:...\build\app\out00-PYZ.pyz\gooey.python_bindings.gooey_decorator", line 86, in inner
IOError: [Errno 2] No such file or directory: 'C:\Users...\AppData\Local\Temp_MEI108682\gooey_tmp\app.exe'
Does Gooey play well with PyInstaller or it hasn't been tested?
Now #8 is fixed, I can install gooey on Ubuntu.
Running a very simple test program (code stolen from argparse docs example) gives me an error:
from gooey import Gooey
import argparse
@Gooey
def main():
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
python cli.py
Traceback (most recent call last):
File "cli.py", line 1, in <module>
from gooey import Gooey
File "/usr/local/lib/python2.7/dist-packages/gooey/__init__.py", line 1, in <module>
from gooey_decorator import Gooey
File "/usr/local/lib/python2.7/dist-packages/gooey/gooey_decorator.py", line 16, in <module>
from gooey.gui.base_window import BaseWindow
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/base_window.py", line 16, in <module>
import header
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/header.py", line 10, in <module>
from gooey import i18n
File "/usr/local/lib/python2.7/dist-packages/gooey/i18n.py", line 37, in <module>
_DICTIONARY = load(get_path(_LANG))
File "/usr/local/lib/python2.7/dist-packages/gooey/i18n.py", line 24, in get_path
raise IOError('Could not find {} language file'.format(language))
IOError: Could not find english language file
Looking in my /usr/local/lib/python2.7/dist-packages/gooey/languages
, there's no .json files, only eng.py, init.py and their .pyc companions.
Something is still not going quite right with copying over the language files.
The path where I have the gooey download is /home/mb/Documents/python/Gooey
, nothing exotic in there.
When I copy over the language files manually, it then complains that it can't find the images directory
OSError: [Errno 2] No such file or directory: '/usr/local/lib/python2.7/dist-packages/gooey/images'
After copying those over as well, it works pretty well ๐
Edit: found where the files get copied to: the files from gooey/images
and gooey/languages
get copied to /usr/local
for some reason, instead of to /usr/local/lib/python2.7/dist-packages/gooey/...
In the mockapplication module_with_no_argparse, build spec is shown to be referenced before assignment.
Traceback (most recent call last):
File "C:\Python27\Lib\site-packages\gooey\gooey\mockapplications\module_with_no_argparse.py", line 18, in <module>
main()
File "C:\Python27\lib\site-packages\gooey-0.1.0-py2.7.egg\gooey\python_bindings\gooey_decorator.py", line 127, in inner
frame = BaseWindow(BodyPanel, build_spec, params)
UnboundLocalError: local variable 'build_spec' referenced before assignment
Steps to reproduce:
/main.py
from argparse import ArgumentParser
from argparse import RawDescriptionHelpFormatter
from gooey import Gooey
@Gooey(config=False)
def main():
parser = ArgumentParser(description='Example', formatter_class=RawDescriptionHelpFormatter)
args = parser.parse_args()
print "hello, world"
if __name__ == '__main__':
main()
Expected result when run:
Gooey should start up in console mode, without a configuration step.
Actual result:
Traceback (most recent call last):
File "C:/.../main.py", line 12, in <module>
main()
File "C:\Python27\lib\site-packages\gooey\gooey_decorator.py", line 62, in inner
frame.ManualStart()
File "C:\Python27\lib\site-packages\gooey\gui\base_window.py", line 106, in ManualStart
self._controller.ManualStart()
File "C:\Python27\lib\site-packages\gooey\gui\controller.py", line 67, in ManualStart
self._payload_runner.start()
AttributeError: 'Controller' object has no attribute '_payload_runner'
Right now, file dialogs can only open existing files. An example use case for a "save" dialog would be specifying where to save the result of the program, where to save some sort of file output, etc.
I observed that there was an OS X support feature in the TODO, but no issue in the tracker so I added one as I would like to hear when this will be available.
Adding Qt support would greatly increase your userbase :-).
Just tried Gooey - and it stumbled upon subparsers:
alessandro_rei_checkmark = os.path.join(image_dir, "alessandro_rei_checkmark.png")
computer = os.path.join(image_dir, "computer.png")
computer2 = os.path.join(image_dir, "computer2.png")
computer3 = os.path.join(image_dir, "computer3.png")
icon = os.path.join(image_dir, "icon.ico")
images = os.path.join(image_dir, "images.jpg")
loader = os.path.join(image_dir, "loader.gif")
settings2 = os.path.join(image_dir, "settings2.png")
__init__ = os.path.join(image_dir, "__init__.py")
Traceback (most recent call last):
File "C:/development/work/avatar_hulk/gooey_subparser.py", line 153, in <module>
sys.exit(main())
File "C:\development\tools\venv\avatar\lib\site-packages\gooey\gooey_decorator.py", line 47, in inner
parser = get_parser(module_path)
File "C:\development\tools\venv\avatar\lib\site-packages\gooey\gooey_decorator.py", line 76, in get_parser
return source_parser.extract_parser(module_path)
File "C:\development\tools\venv\avatar\lib\site-packages\gooey\source_parser.py", line 99, in extract_parser
return MonkeyParser(python_code)
File "C:\development\tools\venv\avatar\lib\site-packages\gooey\monkey_parser.py", line 27, in __init__
self._parser_instance = self._build_argparser_from_client_source(source_code)
File "C:\development\tools\venv\avatar\lib\site-packages\gooey\monkey_parser.py", line 60, in _build_argparser_from_client_source
eval(line)
File "<string>", line 1, in <module>
NameError: name 'parameter_clients_parser' is not defined
I tweaked your example https://github.com/chriskiehl/Gooey/blob/master/gooey/mockapplications/example_argparse_souce_in_main.py a little bit to contain subparsers:
#!/usr/local/bin/python2.7
# encoding: utf-8
'''
bin.example_argparse_souce -- shortdesc
bin.example_argparse_souce is a description
It defines classes_and_methods
@author: user_name
@copyright: 2013 organization_name. All rights reserved.
@license: license
@contact: user_email
@deffield updated: Updated
'''
import sys
import os
from argparse import ArgumentParser
from argparse import RawDescriptionHelpFormatter
from gooey import Gooey
__all__ = []
__version__ = 0.1
__date__ = '2013-12-13'
__updated__ = '2013-12-13'
DEBUG = 0
TESTRUN = 0
PROFILE = 0
class CLIError(Exception):
'''Generic exception to raise and log different fatal errors.'''
def __init__(self, msg):
super(CLIError).__init__(type(self))
self.msg = "E: %s" % msg
@property
def __str__(self):
return self.msg
def __unicode__(self):
return self.msg
@Gooey
def main(argv=None): # IGNORE:C0111
'''Command line options.'''
if argv is None:
argv = sys.argv
else:
sys.argv.extend(argv)
program_name = os.path.basename(sys.argv[0])
program_version = "v%s" % __version__
program_build_date = str(__updated__)
program_version_message = '%%(prog)s %s (%s)' % (program_version, program_build_date)
program_shortdesc = __import__('__main__').__doc__.split("\n")[1]
program_license = '''%s
Created by user_name on %s.
Copyright 2013 organization_name. All rights reserved.
Licensed under the Apache License 2.0
http://www.apache.org/licenses/LICENSE-2.0
Distributed on an "AS IS" basis without warranties
or conditions of any kind, either express or implied.
USAGE
''' % (program_shortdesc, str(__date__))
# Setup argument parser
parser = ArgumentParser(description='Example Argparse Program', formatter_class=RawDescriptionHelpFormatter)
parser.add_argument("filename", help="filename")
subparsers = parser.add_subparsers(help='sub-command -h for sub-command help', dest='subparser_name')
parameter_parser = subparsers.add_parser("param", help='add some CRUD capabilities for Parameters ...')
parameter_parser.add_argument('-c', '--create', action="store_true", help='creates a new parameter')
enum_parser = subparsers.add_parser(ENUM, help='add some CRUD capabilities for Enumerations ...')
enum_parser.add_argument('-a', '--add_enum_type', action="store_true", help='adds a new enumeration type')
parser.add_argument("-r", "--recursive", dest="recurse", action="store_true",
help="recurse into subfolders [default: %(default)s]")
parser.add_argument("-v", "--verbose", dest="verbose", action="count",
help="set verbosity level [default: %(default)s]")
parser.add_argument("-i", "--include", action="append",
help="only include paths matching this regex pattern. Note: exclude is given preference over include. [default: %(default)s]",
metavar="RE")
parser.add_argument("-m", "--mycoolargument", help="mycoolargument")
parser.add_argument("-e", "--exclude", dest="exclude",
help="exclude paths matching this regex pattern. [default: %(default)s]", metavar="RE")
parser.add_argument('-V', '--version', action='version')
parser.add_argument('-T', '--tester', choices=['yes', 'no'])
parser.add_argument(dest="paths", help="paths to folder(s) with source file(s) [default: %(default)s]",
metavar="path", nargs='+')
# Process arguments
args = parser.parse_args()
paths = args.paths
verbose = args.verbose
recurse = args.recurse
inpat = args.include
expat = args.exclude
if verbose > 0:
print("Verbose mode on")
if recurse:
print("Recursive mode on")
else:
print("Recursive mode off")
if inpat and expat and inpat == expat:
raise CLIError("include and exclude pattern are equal! Nothing will be processed.")
for inpath in paths:
### do something with inpath ###
print(inpath)
return 0
if __name__ == "__main__":
if DEBUG:
sys.argv.append("-h")
# sys.argv.append("-v")
sys.argv.append("-r")
main()
sys.exit()
if TESTRUN:
import doctest
doctest.testmod()
if PROFILE:
import cProfile
import pstats
profile_filename = 'bin.example_argparse_souce_profile.txt'
cProfile.run('main()', profile_filename)
statsfile = open("profile_stats.txt", "wb")
p = pstats.Stats(profile_filename, stream=statsfile)
stats = p.strip_dirs().sort_stats('cumulative')
stats.print_stats()
statsfile.close()
sys.exit(0)
sys.exit(main())
The code preparation in https://github.com/chriskiehl/Gooey/blob/master/gooey/code_prep.py does not play well with this (multiple subparsers with similar names).
Being able to do the equivalent of ^C by pressing a cancel button without losing the console output could be handy in many situations.
It could be interesting to have the choice to use filer picker instead of text field.
I have started to work on such a change but I haven't got time to make this perfect and shiny.
Here is what I have done so far
It would be great if gooey could run under python3. It's the future !
When I run the following MWE:
from gooey import Gooey, GooeyParser
@Gooey
def main():
parser = GooeyParser(description="My Cool GUI Program!")
parser.add_argument('Filename', widget="FileChooser")
parser.add_argument('--hello', action='store_true', default=False)
args = parser.parse_args()
print args.Filename
if args.hello:
print 'Hello!!'
if __name__ == '__main__':
main()
I get the following error:
Traceback (most recent call last):
File "gui.py", line 16, in <module>
main()
File "/usr/local/lib/python2.7/site-packages/gooey/python_bindings/gooey_decorator.py", line 118, in inner
parser = get_parser(main_module_path)
File "/usr/local/lib/python2.7/site-packages/gooey/python_bindings/gooey_decorator.py", line 161, in get_parser
return source_parser.extract_parser(module_path)
File "/usr/local/lib/python2.7/site-packages/gooey/python_bindings/source_parser.py", line 146, in extract_parser
client_module = modules.load(module_source)
File "/usr/local/lib/python2.7/site-packages/gooey/python_bindings/modules.py", line 21, in load
return __import__(tmpfilename)
File "/var/folders/9m/f1_73gtj5fq855hdxt9mb0nc0000gn/T/tmpP5Y9qh.py", line 9
print 'Hello!!'
^
IndentationError: unexpected indent
I took a look at what is being passed to modules.load()
and it is the following:
from gooey import Gooey, GooeyParser
def main():
parser = GooeyParser(description="My Cool GUI Program!")
parser.add_argument('Filename', widget="FileChooser")
parser.add_argument('--hello', action='store_true', default=False)
return parser
print 'Hello!!'
if __name__ == '__main__':
main()
I understand that there is a fair amount of magic going on under the hood to get this to work, but it seems that this magic does not expect there to be any nested code structures in the main()
function after the parser has been fully defined. Everything works as expected if there are no nested structures or if the nested structures are put into a separate function.
Could Gooey
be updated to either handle this situation, or reflect this limitation in the README (if this limitation cannot be overcome)?
P.S. Amazing library!
Need new screens showing Restart button
WX is not yet stable/ready for python3. Would dynamically pick the GUI backend based on what is available. I intend to pull request a proposal for this change. Would pave the way for other alternate GUI backends.
Decided to tinker with this a couple days ago and I'm really liking it. I wrote a simple example Gooey app (to present to fellow Pythoners) and then I thought, it would be nice if we had some sort of page here (i.e. a wiki page) that could showcase some examples made by the community or whatever. It would possibly help out those that are a bit new to argparse as well.
Not a particularly big deal though. :)
If the script can measure its progress, it would be nice to make calls to update the status of the progress bar instead of it being infinite.
Hi,
I have made a small script that is using Gooey and when I converted it to a exe using py2exe or pythonInstaller I am getting following problem.
Traceback (most recent call last):
File "command_ui.py", line 1, in
File "gooey__init__.pyc", line 1, in
File "gooey\gooey_decorator.pyc", line 16, in
File "gooey\gui\base_window.pyc", line 16, in
File "gooey\gui\header.pyc", line 10, in
File "gooey\i18n.pyc", line 37, in
File "gooey\i18n.pyc", line 24, in get_path
IOError: Could not find english language file
One-off scripts might be small enough not to specifically require argparse, or might have everything managed via a config file. Not strictly requiring argparse would permit an easier integration (just the decorator) in this use case.
Improve all the textbox to support drag folder and file to the textbox, then the path of file/folder should be added to textbox
Hi,
I ran into this issue while just testing Gooey on the Python doc argparse example:
icon = os.path.join(image_dir, "icon.ico")
__init__ = os.path.join(image_dir, "__init__.py")
__init__ = os.path.join(image_dir, "__init__.pyc")
loader = os.path.join(image_dir, "loader.gif")
images = os.path.join(image_dir, "images.jpg")
settings2 = os.path.join(image_dir, "settings2.png")
alessandro_rei_checkmark = os.path.join(image_dir, "alessandro_rei_checkmark.png")
computer = os.path.join(image_dir, "computer.png")
computer3 = os.path.join(image_dir, "computer3.png")
computer2 = os.path.join(image_dir, "computer2.png")
returning resized image
returning resized image
returning resized image
Traceback (most recent call last):
File "whyd2/testtt.py", line 18, in <module>
main()
File "/home/jtanay/.virtualenvs/whyd2/lib/python2.7/site-packages/gooey/gooey_decorator.py", line 59, in inner
frame = BaseWindow(BodyPanel, client_app, params)
File "/home/jtanay/.virtualenvs/whyd2/lib/python2.7/site-packages/gooey/gui/base_window.py", line 44, in __init__
self._init_components(BodyPanel)
File "/home/jtanay/.virtualenvs/whyd2/lib/python2.7/site-packages/gooey/gui/base_window.py", line 67, in _init_components
self.config_panel = BodyPanel(self)
File "/home/jtanay/.virtualenvs/whyd2/lib/python2.7/site-packages/gooey/gui/advanced_config.py", line 38, in __init__
self._do_layout()
File "/home/jtanay/.virtualenvs/whyd2/lib/python2.7/site-packages/gooey/gui/advanced_config.py", line 59, in _do_layout
self.AddWidgets(container, self.components.required_args, add_space=True)
File "/home/jtanay/.virtualenvs/whyd2/lib/python2.7/site-packages/gooey/gui/advanced_config.py", line 79, in AddWidgets
widget_group = component.Build(parent=self)
File "/home/jtanay/.virtualenvs/whyd2/lib/python2.7/site-packages/gooey/gui/components.py", line 38, in Build
self._msg = self.CreateHelpMsgWidget(parent, self._action)
File "/home/jtanay/.virtualenvs/whyd2/lib/python2.7/site-packages/gooey/gui/components.py", line 67, in CreateHelpMsgWidget
base_text.SetLabelText(base_text.GetLabelText() + self.CreateNargsMsg(action))
AttributeError: 'StaticText' object has no attribute 'SetLabelText'
Am I missing something? I just reinstalled a fresh version of Gooey from github (pip install -U git+https://github.com/chriskiehl/Gooey.git
). It might be a bug.
edit : I'm running py27 on a Fedora 20.
Let me know if I can help!
Thx
Traceback (most recent call last):
File "lib/qidev.py", line 114, in <module>
main()
File "/usr/local/lib/python2.7/dist-packages/gooey/python_bindings/gooey_decorator.py", line 138, in inner
frame = BaseWindow(BodyPanel, build_spec, params)
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/windows/base_window.py", line 36, in __init__
self._init_components(BodyPanel)
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/windows/base_window.py", line 60, in _init_components
self.config_panel = BodyPanel(self)
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/windows/advanced_config.py", line 39, in __init__
self._do_layout()
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/windows/advanced_config.py", line 70, in _do_layout
self.CreateComponentGrid(container, self.components.general_options, cols=2)
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/windows/advanced_config.py", line 90, in CreateComponentGrid
hsizer.Add(widget.build(self), 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10)
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/widgets/components2.py", line 30, in build
return self.do_layout(parent)
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/widgets/components2.py", line 38, in do_layout
core_widget_set = self.widget_pack.build(self.panel, self.data)
File "/usr/local/lib/python2.7/dist-packages/gooey/gui/widgets/widget_pack.py", line 141, in build
self.option_string = data['commands'][0]
IndexError: list index out of range
If it's helpful for debugging, all of the code for qidev.py
is available on my github
Distributor ID: Ubuntu
Description: Ubuntu 14.10
Release: 14.10
Codename: utopic
Linux 3.16.0-30-generic #40-Ubuntu SMP Mon Jan 12 22:07:27 UTC 2015 i686 i686 i686 GNU/Linux
WindowsError: [Error 2] The system cannot find the file specified: 'C:\\Python27\\lib\\site-packages\\gooey-0.1.0-
py2.7.egg\\gooey\\python_bindings\\da56848393418e7c55974af7edbbb2d2.pyc'
This just results from the inclusion of the decorator in any program
sudo python setup.py install
running install
running build
running build_py
package init file 'gooey/images/__init__.py' not found (or not a regular file)
package init file 'gooey/images/__init__.py' not found (or not a regular file)
running install_lib
running install_data
error: can't copy 'computer3.png': doesn't exist or not a regular file
Changing images
and languages
to below
images = [os.path.join(imagepath, image) for image in os.listdir(imagepath)]
languages = [os.path.join(languagepath, lang)
for lang in os.listdir(languagepath)
if '.py' not in lang]
...
setup(
...
data_files = [
('', images),
('', languages)
],
...
)
Fixes it. I'm not entirely sure why though. Are you developing on Windows? I'm running Ubuntu
http://docopt.org/ (python project at https://github.com/docopt/docopt) is a great tool for commandline scripts. It would be great to have Gooey support it :)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.