Csound Csound-dev Csound-tekno Search About

Re: [Csnd] Python help please

Date2011-08-27 04:00
From"Art Hunkins"
SubjectRe: [Csnd] Python help please
Wonderful, Olivier. That worked perfectly.
 
Thanks so much; you've been a great help.
 
Art Hunkins
----- Original Message -----
Sent: Friday, August 26, 2011 9:55 PM
Subject: Re: [Csnd] Python help please

Hi Art,

Why don't you call the clicked() method on those buttons you want to intialize to 1... Just after their creation:

butt = self.w.button(self.b6, "Filter", "Low-cut Filter?")
butt.clicked()

buttcallback() will be called and
i[2] switched to 1.

Olivier

p.s.: A gtk.Button has no state, it's more like a trigger... It is the third value of self.buttons in the button() method that created a button more like a toggle...

2011/8/26 Art Hunkins <abhunkin@uncg.edu>
Olivier,
 
Thanks so much; it works perfectly. With your suggestions, I was even able to display 25 buttons in a single "for i in" construction!
 
One last question:
Do you have any idea how to initialize a normal gtk.Button to the "on" state, rather than the usual "off"?
My code is:
  self.w.button(self.b6, "Filter", "Low-cut Filter?")
The idea is to have "Filter" initially send a value of 1 to Csound rather than than 0, with the first switch being from "on" to "off."
 
 
Here's the code called from Victor Lazzarini's csndsugui.py:
 
    def button(self,box, title="",label=""):
       """Creates a button (on/off)
           box: parent box
           title: if given, the button name,
             which will also be the bus channel
             name. Otherwise a default name is
             given, BN, where N is button number
             in order of creation.
           label: if given, an alternative button name,
             which will be displayed instead of title
           returns the widget instance"""
       self.butts = self.butts + 1
       if title == "":
         title = "B%d" % self.butts
       if label == "": name = title
       else: name = label
       butt = gtk.Button(" %s " % name)
       self.scale_font(butt.child)
       butt.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0x8000,0x8000,0x8000, 2))
       box.pack_start(butt, False, False, 1)
       self.buttons.append([butt,title,0])
       butt.connect("clicked", self.buttcallback)
       butt.show()
       return butt
 
    def buttcallback(self, widget, data=None):
      for i in self.buttons:
         if i[0] == widget:
          if i[2]:
            i[2] = 0
            i[0].modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0x8000,0x8000,0x8000, 2))
            i[0].modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0x8000,0x8000,0x8000, 2))
          else:
            i[2] = 1
            i[0].modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0,0x7700,0, 1))
            i[0].modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0,0x7700,0, 2))
          self.set_channel(i[1], i[2]) 
Thanks again for all your help.
 
Art Hunkins
----- Original Message -----
Sent: Friday, August 26, 2011 5:32 PM
Subject: Re: [Csnd] Python help please

gtk.Container defined a method child_get_property(child, property_name). You can use it to retrieve the position of the child. Can't try it because I'm on OSX actually, but it will look like this:

index = self.b3box.child_get_property(widget, "position")

I think everything you need is on this page:

http://www.pygtk.org/docs/pygtk/class-gtkcontainer.html

Olivier

2011/8/26 Art Hunkins <abhunkin@uncg.edu>
Olivier,
 
Regarding your suggestion:
def choose(self, widget):
    index = self.b3box.get_position(widget)
 
get_position is not implemented, as you suspected (an error message states so).
 
However, self.b3box is generated by gtk.Hbox which is a child of gtk.Box.
 
One of the child properties of gtk.Box is "position" - which is exactly the value I need.
 
But
  index = self.b3box.position(widget)
and random variants thereof that I've tried have led nowhere.
 
The error message: Attribute Error: "gtk.Hbox" object has no attribute "position"
 
Any suggestion? 
 
Art Hunkins
----- Original Message -----
Sent: Friday, August 26, 2011 3:46 PM
Subject: Re: [Csnd] Python help please

I have not used gtk for a while but I'm sure this line doesn't work:

but6 = win.cbbutton(self.b3box, self.choose(self, 1), " 1")

You execute self.choose inside the definition of the widget, but what you want to do is to pass a callback reference to the widget, something like:

but6 = win.cbbutton(self.b3box, self.choose, " 1")

The signature of the callback function is defined inside win.cbutton, I don't think it's a good idea to try to modify it.
Every buttons will call the same function with the widget in argument, so you have to grab the index from the widget... maybe the index inside the box self.b3box:

def choose(self, widget):
    index = self.b3box.get_position(widget) # this is only the idea, I don't know if get_position is implemented in the class used to create self.b3box...

Olivier

2011/8/26 Art Hunkins <abhunkin@uncg.edu>
Thanks both to Andres and Olivier.
 
Using both of your suggestions, I modified my Python script segments to the following. However I'm missing something related to "index" (do I need to declare it?), and get various error messages related to the choose function. Can you see what I'm doing wrong?
 
   self.paths = ["0"]*26
   self.jobjects = [None]*26
 def choose(self, index, widget):

   chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO)
   result = chooser.run()
   if result == gtk.RESPONSE_ACCEPT:
     self.jobject[index] = chooser.get_selected_object()
     self.paths[index] = str(self.jobjects[index].get_file_path())
   else:
     self.jobject[index] = None
     self.path[index] = "0"
 
 def send_data(self):

   for i in range(26):
     self.w.set_filechannel("file%d" % i, self.paths[i])
 
Choose is being called by one of 26 cbbuttons (from csndsugui, which is what win. refers to), as in:
     but6 = win.cbbutton(self.b3box, self.choose(self, 1), " 1")
This may well be the source of my problem.
 
Am I perhaps passing the index value 1 to the choose function incorrectly? (I tried: self.choose(self, index=1), "1"
which made no difference.
 
Thanks again for your help.
 
Art Hunkins
----- Original Message -----
Sent: Friday, August 26, 2011 5:53 AM
Subject: Re: [Csnd] Python help please

Hi Art,

Additionally, you could add the index input to the choose function:

def choose (self, index, widget)

Cheers,
Andres

On Wed Aug 24 16:13:31 2011 Olivier Bélanger wrote:

self.path0 -> self.path25 must be a list where you store your paths:
Same thing for self.jobjects... (not sure you really need to keep references to those objects).

self.paths = ["0"]*26
self.jobjects = [None]*26

def choose(self, widget):
    which = something here to grab the order of "widget"
    ....
    self.paths[which] = str(self.jobjects[which].get_file_path())

def send_data(self):
    for i in range(26):
        self.w.set_filechannel("file%d" % i, self.paths[i])

Olivier

2011/8/24 Art Hunkins <abhunkin@uncg.edu>
I've written a Python script for a new XO/Sugar activity for children (SamplePlay).
It includes 26 buttons that allow a user to select (from the Journal) up to 26 audio
samples/loops to play. AFAIK, the "filename" must be sent to Csound as a
discrete variable, on its own channel (see below).

As a result, I've 26 iterations(!) (0-25) of the same basic code. I'd like
to simplify it if possible (the code itself works fine). Any suggestions from
you Python/Csound enthusiasts are very much welcomed. (The code references
Victor's csndsugui.py, but I don't think this is significant her

 self.path0 = "0"
 (up through)
 self.path25 = "0"

 self.jobject0 = None
 (through)
 self.jobject25 = None

def choose0(self, widget):
 chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO)
 result = chooser.run()
 if result == gtk.RESPONSE_ACCEPT:
   self.jobject0 = chooser.get_selected_object()
   self.path0 = str(self.jobject0.get_file_path())
 else:
   self.jobject0 = None
   self.path0 = "0"
 (through)
def choose25(self, widget):
 chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO)
 result = chooser.run()
 if result == gtk.RESPONSE_ACCEPT:
   self.jobject25 = chooser.get_selected_object()
   self.path25 = str(self.jobject25.get_file_path())
 else:
   self.jobject25 = None
   self.path25 = "0"

def send_data(self):
 self.w.set_filechannel("file0", self.path0)
 self.w.set_filechannel("file1", self.path1)
 (through)
 self.w.set_filechannel("file24", self.path24)
 self.w.set_filechannel("file25", self.path25)


Hoping (as a Python novice) to be shown a more efficient way; I'm in the dark -

Art Hunkins



Send bugs reports to the Sourceforge bug tracker
          https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"







Date2011-08-27 04:03
FromOlivier Bélanger
SubjectRe: [Csnd] Python help please
You're welcome!

Olivier

2011/8/26 Art Hunkins <abhunkin@uncg.edu>
Wonderful, Olivier. That worked perfectly.
 
Thanks so much; you've been a great help.
 
Art Hunkins
----- Original Message -----
Sent: Friday, August 26, 2011 9:55 PM
Subject: Re: [Csnd] Python help please

Hi Art,

Why don't you call the clicked() method on those buttons you want to intialize to 1... Just after their creation:

butt = self.w.button(self.b6, "Filter", "Low-cut Filter?")
butt.clicked()

buttcallback() will be called and
i[2] switched to 1.

Olivier

p.s.: A gtk.Button has no state, it's more like a trigger... It is the third value of self.buttons in the button() method that created a button more like a toggle...

2011/8/26 Art Hunkins <abhunkin@uncg.edu>
Olivier,
 
Thanks so much; it works perfectly. With your suggestions, I was even able to display 25 buttons in a single "for i in" construction!
 
One last question:
Do you have any idea how to initialize a normal gtk.Button to the "on" state, rather than the usual "off"?
My code is:
  self.w.button(self.b6, "Filter", "Low-cut Filter?")
The idea is to have "Filter" initially send a value of 1 to Csound rather than than 0, with the first switch being from "on" to "off."
 
 
Here's the code called from Victor Lazzarini's csndsugui.py:
 
    def button(self,box, title="",label=""):
       """Creates a button (on/off)
           box: parent box
           title: if given, the button name,
             which will also be the bus channel
             name. Otherwise a default name is
             given, BN, where N is button number
             in order of creation.
           label: if given, an alternative button name,
             which will be displayed instead of title
           returns the widget instance"""
       self.butts = self.butts + 1
       if title == "":
         title = "B%d" % self.butts
       if label == "": name = title
       else: name = label
       butt = gtk.Button(" %s " % name)
       self.scale_font(butt.child)
       butt.modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0x8000,0x8000,0x8000, 2))
       box.pack_start(butt, False, False, 1)
       self.buttons.append([butt,title,0])
       butt.connect("clicked", self.buttcallback)
       butt.show()
       return butt
 
    def buttcallback(self, widget, data=None):
      for i in self.buttons:
         if i[0] == widget:
          if i[2]:
            i[2] = 0
            i[0].modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0x8000,0x8000,0x8000, 2))
            i[0].modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0x8000,0x8000,0x8000, 2))
          else:
            i[2] = 1
            i[0].modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(0,0x7700,0, 1))
            i[0].modify_bg(gtk.STATE_PRELIGHT, gtk.gdk.Color(0,0x7700,0, 2))
          self.set_channel(i[1], i[2]) 
Thanks again for all your help.
 
Art Hunkins
----- Original Message -----
Sent: Friday, August 26, 2011 5:32 PM
Subject: Re: [Csnd] Python help please

gtk.Container defined a method child_get_property(child, property_name). You can use it to retrieve the position of the child. Can't try it because I'm on OSX actually, but it will look like this:

index = self.b3box.child_get_property(widget, "position")

I think everything you need is on this page:

http://www.pygtk.org/docs/pygtk/class-gtkcontainer.html

Olivier

2011/8/26 Art Hunkins <abhunkin@uncg.edu>
Olivier,
 
Regarding your suggestion:
def choose(self, widget):
    index = self.b3box.get_position(widget)
 
get_position is not implemented, as you suspected (an error message states so).
 
However, self.b3box is generated by gtk.Hbox which is a child of gtk.Box.
 
One of the child properties of gtk.Box is "position" - which is exactly the value I need.
 
But
  index = self.b3box.position(widget)
and random variants thereof that I've tried have led nowhere.
 
The error message: Attribute Error: "gtk.Hbox" object has no attribute "position"
 
Any suggestion? 
 
Art Hunkins
----- Original Message -----
Sent: Friday, August 26, 2011 3:46 PM
Subject: Re: [Csnd] Python help please

I have not used gtk for a while but I'm sure this line doesn't work:

but6 = win.cbbutton(self.b3box, self.choose(self, 1), " 1")

You execute self.choose inside the definition of the widget, but what you want to do is to pass a callback reference to the widget, something like:

but6 = win.cbbutton(self.b3box, self.choose, " 1")

The signature of the callback function is defined inside win.cbutton, I don't think it's a good idea to try to modify it.
Every buttons will call the same function with the widget in argument, so you have to grab the index from the widget... maybe the index inside the box self.b3box:

def choose(self, widget):
    index = self.b3box.get_position(widget) # this is only the idea, I don't know if get_position is implemented in the class used to create self.b3box...

Olivier

2011/8/26 Art Hunkins <abhunkin@uncg.edu>
Thanks both to Andres and Olivier.
 
Using both of your suggestions, I modified my Python script segments to the following. However I'm missing something related to "index" (do I need to declare it?), and get various error messages related to the choose function. Can you see what I'm doing wrong?
 
   self.paths = ["0"]*26
   self.jobjects = [None]*26
 def choose(self, index, widget):

   chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO)
   result = chooser.run()
   if result == gtk.RESPONSE_ACCEPT:
     self.jobject[index] = chooser.get_selected_object()
     self.paths[index] = str(self.jobjects[index].get_file_path())
   else:
     self.jobject[index] = None
     self.path[index] = "0"
 
 def send_data(self):

   for i in range(26):
     self.w.set_filechannel("file%d" % i, self.paths[i])
 
Choose is being called by one of 26 cbbuttons (from csndsugui, which is what win. refers to), as in:
     but6 = win.cbbutton(self.b3box, self.choose(self, 1), " 1")
This may well be the source of my problem.
 
Am I perhaps passing the index value 1 to the choose function incorrectly? (I tried: self.choose(self, index=1), "1"
which made no difference.
 
Thanks again for your help.
 
Art Hunkins
----- Original Message -----
Sent: Friday, August 26, 2011 5:53 AM
Subject: Re: [Csnd] Python help please

Hi Art,

Additionally, you could add the index input to the choose function:

def choose (self, index, widget)

Cheers,
Andres

On Wed Aug 24 16:13:31 2011 Olivier Bélanger wrote:

self.path0 -> self.path25 must be a list where you store your paths:
Same thing for self.jobjects... (not sure you really need to keep references to those objects).

self.paths = ["0"]*26
self.jobjects = [None]*26

def choose(self, widget):
    which = something here to grab the order of "widget"
    ....
    self.paths[which] = str(self.jobjects[which].get_file_path())

def send_data(self):
    for i in range(26):
        self.w.set_filechannel("file%d" % i, self.paths[i])

Olivier

2011/8/24 Art Hunkins <abhunkin@uncg.edu>
I've written a Python script for a new XO/Sugar activity for children (SamplePlay).
It includes 26 buttons that allow a user to select (from the Journal) up to 26 audio
samples/loops to play. AFAIK, the "filename" must be sent to Csound as a
discrete variable, on its own channel (see below).

As a result, I've 26 iterations(!) (0-25) of the same basic code. I'd like
to simplify it if possible (the code itself works fine). Any suggestions from
you Python/Csound enthusiasts are very much welcomed. (The code references
Victor's csndsugui.py, but I don't think this is significant her

 self.path0 = "0"
 (up through)
 self.path25 = "0"

 self.jobject0 = None
 (through)
 self.jobject25 = None

def choose0(self, widget):
 chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO)
 result = chooser.run()
 if result == gtk.RESPONSE_ACCEPT:
   self.jobject0 = chooser.get_selected_object()
   self.path0 = str(self.jobject0.get_file_path())
 else:
   self.jobject0 = None
   self.path0 = "0"
 (through)
def choose25(self, widget):
 chooser = ObjectChooser(parent=self, what_filter=mime.GENERIC_TYPE_AUDIO)
 result = chooser.run()
 if result == gtk.RESPONSE_ACCEPT:
   self.jobject25 = chooser.get_selected_object()
   self.path25 = str(self.jobject25.get_file_path())
 else:
   self.jobject25 = None
   self.path25 = "0"

def send_data(self):
 self.w.set_filechannel("file0", self.path0)
 self.w.set_filechannel("file1", self.path1)
 (through)
 self.w.set_filechannel("file24", self.path24)
 self.w.set_filechannel("file25", self.path25)


Hoping (as a Python novice) to be shown a more efficient way; I'm in the dark -

Art Hunkins



Send bugs reports to the Sourceforge bug tracker
          https://sourceforge.net/tracker/?group_id=81968&atid=564599
Discussions of bugs and features can be posted here
To unsubscribe, send email sympa@lists.bath.ac.uk with body "unsubscribe csound"