pygtk - spinbutton: выходной сигнал - PullRequest
1 голос
/ 19 марта 2011

В своем приложении я использую кнопку вращения, чтобы позволить пользователю выбирать число от -1 до 100. В моем приложении -1 означает бесконечность.Поэтому я хочу показать текст «Бесконечность», если пользователь выбирает значение -1.Это мой код:

def spin_output(spin):
    digits = int(spin.props.digits)
    value = spin.props.value
    if value < 0:
        spin.props.text = "Infinity"  # u"\u221E"
    else:
        spin.props.text = '{0:.{1}f}'.format(value, digits)
    return True
self.my_spin.connect('output', spin_output)

Когда выбрано значение «Бесконечность» и пользователь нажимает кнопку «вверх», значение меняется на 100 вместо 0. Когда я заменяю «Бесконечность» на u«\ u221E» и пользователь нажимает кнопку «вверх», пока она выбрана, значение меняется на 1.

Я хочу, чтобы пользователь мог выбирать значения в таком порядке: бесконечность, 0, 1, ... В чем моя ошибка?

Я думал, что только базовая корректировка изменяется, когда пользователь меняет значение, а моя функция используется только для отображения текущего значения.

Ответы [ 2 ]

1 голос
/ 20 марта 2011

Происходит то, что кнопка прокрутки интерпретирует строку «бесконечность» как строку, введенную пользователем, и пытается проанализировать ее как значение. Виджеты gtk.Scale предлагают сигнал с именем format-value, который используется для отображения пользовательских значений точно так же, как вы пытаетесь это сделать, но я не вижу аналогичного сигнала для кнопки прокрутки.

Вот что-то, использующее шкалу, которая может делать то, что вы хотите:

#!/usr/bin/env python

import gtk

def scale_output(scale, value):
    if value < 0:
        return "Infinity"  # u"\u221E"
    return "{0}".format(int(value))

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
adjustment = gtk.Adjustment(-1, -1, 100, 1, 1)
scale = gtk.HScale(adjustment)
window.set_default_size(300, 100)
window.add(scale)
scale.connect('format-value', scale_output)
window.connect('destroy', gtk.main_quit)
window.show_all()
gtk.main()
0 голосов
/ 20 марта 2011

Хорошо, я нашел решение.Я написал аналог для обработчика выходного сигнала ... обработчик входного сигнала: -)

def parallel_spin_input(spin, new_value):
    text = spin.get_text()
    if text == u"\u221E":
        value = -1
    else:
        try:
            value = float(text)
        except ValueError:
            return -1
    p = ctypes.c_double.from_address(hash(new_value))
    p.value = value
    return True
self.parallel_spin.connect('input', parallel_spin_input)

Это, кажется, работает хорошо; -)

...