Hi --

I'm trying to use a gtk.HScale widget to select integer values, so I use HScale.set_digits(0). However, I also don't want the widget to display its value, because the value is also displayed in an accompanying gtk.Entry. But if I use HScale.set_draw_value(False), the set_digits(0) doesn't work anymore!HScale.get_value() returns non-integers. Am I doing something wrong, or is this a bug?

I'm using pygtk 2.6.2 and python 2.3.5.

Many thanks.

  -- Steve

Here's an example:

import pygtk
pygtk.require('2.0')
import gtk

class SliderTest:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title("Slider")
        self.window.connect("delete_event", self.delete_event)

        self.window.set_border_width(20)
        vbox = gtk.VBox(True, 2)
        self.window.add(vbox)

        self.suppress = False           # avoids infinite callback loops

        self.adjustment = gtk.Adjustment(value=0,
                                         lower=0,
                                         upper=100,
                                         step_incr=1,
                                         page_incr=1);

        self.slider = gtk.HScale(self.adjustment)

## This line should restrict the HScale widget to integer values...
        self.slider.set_digits(0)

        ## ... but it doesn't unless this line is removed.
        self.slider.set_draw_value(False)

        vbox.pack_start(self.slider, expand=0, fill=0)
        self.adjsignal = self.adjustment.connect('value-changed',
                                                 self.text_from_slider)

        self.entry = gtk.Entry()
        vbox.pack_start(self.entry, expand=0, fill=0)
        self.set_value(50)
        self.entry.connect('changed', self.entry_changed)
        self.entry.connect('activate', self.slider_from_text)
        self.entry.connect('focus-out-event', self.entry_lost_focus)

        self.window.show_all()

    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def set_value(self, value):
        if value < self.adjustment.lower:
            self.adjustment.set_value(self.adjustment.lower)
        elif value > self.adjustment.upper:
            self.adjustment.set_value(self.adjustment.upper)
        else:
            self.adjustment.set_value(value)
        self.adjustment.value_changed()

    def text_from_slider(self, *args):
        if not self.suppress:
            self.suppress = True
            val = self.slider.get_value()
            self.entry.set_text("%-8g" % val)
            self.suppress = False
    def entry_changed(self, *args):
        self.slider_from_text()
    def entry_lost_focus(self, *args):
        self.slider_from_text()
    def slider_from_text(self, *args):
        if not self.suppress:
            self.suppress = True
            try:
                v0 = eval(self.entry.get_text())
            except:
                pass
            else:
                self.adjustment.set_value(self.clip(v0))
            self.suppress = False
    def clip(self, val):
        v = max(val, self.adjustment.lower)
        v = min(v, self.adjustment.upper)
        return v



def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    SliderTest()
    main()


--
-- EMail: [EMAIL PROTECTED] Phone: (301) 975-5423 -- -- WWW: http://math.nist.gov/mcsd/Staff/SLanger/ Fax: (301) 990-4127 -- -- Mail: NIST; 100 Bureau Drive -- Stop 8910; Gaithersburg, Md 20899-8910 --

-- "I don't think this will work. That's why it's science." -- -- Naomi Langer, 17 Feb 2003 --

_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to