help me reviewing and organizing my code =)

Peter Otten __peter__ at web.de
Thu Jun 2 06:41:54 EDT 2011


Tracubik wrote:

> if you like, off course :)
> 
> I'm making a port in python of a program made of bash commands + zenity
> for the GUI.
> so, i've to re-create a GUI in pyGTK and associate the right bash commands
> to the buttons.
> Instead of executing the bash script i simply print they in the console.
> 
> so, here's my code
> 
> import gtk
> 
> class myProgram:
> 
>   def __init__(self):
>    ...
>    self.btnUname = gtk.Button("uname")
>    self.btnLs = gtk.Button("ls")
> 
>    self.btnUname.connect("clicked", self.print_associated_command,
>    "uname") self.btnLs.connect("clicked", self.print_associated_command,
>    "ls") ...
> 
>   def print_associated_command(self, widget, data=None):
>     UNAME_CODE = ['uname']
>     LS_CODE = ['cd /home/myUserId/Images/SashaGray',
>                'ls *.jpg']
> 
>     command_list = {
>     "uname" : UNAME_CODE,
>     "ls"    : LS_CODE
>     }
>     for item in command_list[data]:
>        print 'COMMAND: ' + item
>     print '-----------------------------------------------------'
> 
> 
> do you like it?
> considering i'll have about 40+ buttons, do you suggest me to move some
> part of code outside in a different module?

If all buttons work the same you can treat them uniformly:

import gtk

command_defs = {
    "uname" : ['uname'],
    "ls"    : ['cd /home/myUserId/Images/EarlGray',
               'ls *.jpg']
    }

class MyProgram:

    def __init__(self):
        ...
        for name, command in command_defs.iteritems():
            button = gtk.Button(name)
            button.connect("clicked", self.print_associated_command, 
command)
            button.show()
            ...
        ...

    def print_associated_command(self, widget, data=None):
        for item in data:
           print 'COMMAND:', item
        print '-----------------------------------------------------'

You can then move the command_defs dictionary into another module or 
alternatively turn it into a JSON file and load it with the json module from 
the standard library:

import json
with open("command_defs.json") as f:
    command_defs = json.load(f)

The corresponding JSON file would then look like

{
    "uname" : ["uname"],
    "ls"    : ["cd /home/myUserId/Images/EarlGray",
               "ls *.jpg"]
}

Note that with this approach all strings become unicode objects.





More information about the Python-list mailing list