Re: [Tutor] Simple program with menu to view videos

2009-01-16 Thread spir
Le Fri, 16 Jan 2009 11:35:13 -0500,
David da...@abbottdavid.com a écrit :

 Hi,
 I just received the dvd Python Fundamentals by Wesley J. Chun and it was 
 packaged by the distributor for use on Window and Mac but I use Linux so 
 I pulled the videos of of the dvd. There are 10 lessons with a total of 
 58 individual videos. Most lessons are 6-8 videos long. So I did as Alan 
 has suggested and came up with a plan of attack. What my basic program 
 does is plays the first video and then the next in that lesson and when 
 finished them all goes back to the menu. I am asking for some tips on 
 how I can make this program with less code and using some classes, if 
 that is the best way to proceed. I have a lot of code that is just 
 copied from one function to the next. I am new to python and enjoy these 
 little projects because I can see them in action. Here is my starting point;
 http://dwabbott.com/code/index6.html
 thanks
 -david

Just had a look at your code. As you say: a lot of code that is just copied 
from one
function to the next. The only reason for that is your functions have no 
argument (parameter):

def lesson3b():
player = /usr/bin/mplayer
fname = /home/david/Desktop/core_video/data/python_0302.flv
subprocess.call([player, fname])
lesson3c()

From this instance of a specific lesson player function, you can simply define 
a generic one:

def play_lesson(lesson_id):
# does not belong here:
player = /usr/bin/mplayer
fname = lesson_file_name(lesson_id) # how to get the file name?
subprocess.call([player, fname])
# does not belong here:
lesson3c()

Note that player is a constant, so that it does not belong to the function. 
At best, it may be
an optional argument which could later be overriden (by e.g. a command line 
argument -- if ever
you chage the player).
Also, the lesson3c() call is part of an overall scheduling logic that should be 
controled from an
external loop or menu -- this depends on how you intend to use the application.
Finally, note that the lesson file names are pretty regular: There are built 
out a single
prefix, a series number, then a lesson letter. Provided you do not change 
this logic, you can
build the filenames easily. The prefix can be written as an optional arg, like 
the player. Also, I
would distinguish series from lesson (this may be helpful at the schedular 
level). An
alternative may be a lesson file lookup in a dictionary of 
(lesson_id:lesson_file_name)
pairs, but there is no need for that here.

So that the core lesson playing function may look like that:

def play_lesson(series_id, lesson_id,
player = /usr/bin/mplayer,
prefix=/home/david/Desktop/core_video/data/python_):
# convert lesson lowercass letter id to a ordinal:
# (a,b,...z -- 97,98,...122)
lesson_id = ord(lesson_id) - 96
# I use below a string formatting expression
# but the file name may be constructed manually
fname = %s%02d%02d %(prefix, series_id, lesson_id)
subprocess.call([player, fname])

Now, you need a master control function, from which the user can possibly 
choose which lesson to
watch, that will accordingly call the lesson player func. As said, this mainly 
depends on how you
expect it as a user.
Note that the logic you first coded is a kind of masked recursivity:

play1a
  play1b
play1c

playnx
  playny

This would be implemented in the above version by an additional explicit 
recursive call:

def play_lesson(series_id, lesson_id,
player = /usr/bin/mplayer,
prefix=/home/david/Desktop/core_video/data/python_):
...
subprocess.call([player, fname])
play_lesson(next_lesson(series_id, lesson_id))

(provided the next_lesson func exists)
This is very probably *not* the user model of an adaptative lesson player tool 
;-)

For a question of taste or programming style, I would personly rather create a 
lesson type
(class) that holds and handles all that stuff: identification, file_name, 
play(), next()... But it
would probably be neither clearer, nore simpler. You could do it afterwards as 
an introduction to
objects (the list will help you).

Denis

--
la vida e estranya
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Simple program with menu to view videos

2009-01-16 Thread Kent Johnson
On Fri, Jan 16, 2009 at 11:35 AM, David da...@abbottdavid.com wrote:
  I am asking for some tips on how I can make
 this program with less code and using some classes, if that is the best way
 to proceed. I have a lot of code that is just copied from one function to
 the next.

When you are copy/pasting code, think about how you can make a
function that abstracts the copied bits. For example you could have
this function:

def play(filename):
player = /usr/bin/mplayer
fname = /home/david/Desktop/core_video/data/ + filename
subprocess.call([player, fname])

Then for example you would have
def lesson10f():
play(python_1006.flv)
menu()

So that is a start. Now look at what you are doing with the individual
sub-lessons. You really just want a way to play a series of lessons.
This can be done with a loop:

def lesson8():
  files = ['python_0800a.flv', 'python_0801.flv', snip, 'python_0806.flv']
  playall(files)

def playall(files):
  for name in files:
play(name)

Since the lesson names follow a regular pattern you might even be able
to generate the names automatically from the lesson number.

Finally, put a loop in your menu function rather than having the
lessons call back to the menu.

Kent
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor