Виджет SpinButton используется для того чтобы выбрать значение из определённого диапазона чисел. Он содержит поле ввода текста и кнопки вверх и вниз. Выбор одной из кнопок прокручивает значение вверх или вниз. Поэтому этот составной виджет можно называть “кнопка-счётчик”. Поле ввода также может быть отредактировано напрямую, вводом нужного значения.
Виджет SpinButton позволяет значению иметь 0 или больше десятичных позиций, и увеличиваться/уменьшаться с определённым настроенным шагом. Зажатие одной из кнопок может приводить к ускорению изменений значения, в зависимости от времени зажатия.
Виджет SpinButton использует регулятор (см. Глава 7, Регуляторы), для хранения информации о диапазоне значений который может принимать. Это делает виджет SpinButton мощным.
Напоминаем, что виджет Adjustment создаётся с помощью следующей функции:
adjustment = gtk.Adjustment(value=0, lower=0, upper=0, step_incr=0, page_incr=0, page_size=0) |
Эти параметры регулятора используются виджетом SpinButton следующим путём:
value | Начальное значение SpinButton |
lower | Минимальное значение |
upper | Максимальное значение |
step_increment | Значение увеличения/уменьшения при клике левой кнопкой. |
page_increment | Значение увеличения/уменьшения при клике правой кнопкой. |
page_size | Не используется |
Дополнительно, третья кнопка мыши может быть использована для прыжка напрямую к минимальному или максимальному значению. Давайте посмотрим как создать SpinButton::
spin_button = gtk.SpinButton(adjustment=None, climb_rate=0.0, digits=0) |
Аргумент climb_rate принимает значение между 0.0 и 1.0, и показывает величину ускорения. Аргумент digits указывает количество отображаемых десятичных позиций.
SpinButton может быть перенастроена с помощью следующего метода:
spin_button.configure(adjustment, climb_rate, digits) |
Аргумент spin_button указывает какой из виджетов SpinButton должен быть перенастроен. Другие аргументы объяснены выше.
Регулятор может быть указан или получен с помощью следующих методов:
spin_button.set_adjustment(adjustment) adjustment = spin_button.get_adjustment() |
Количество десятичных позиций может быть изменено с помощью:
spin_button.set_digits(digits) |
Значение отображаемое в SpinButton может быть изменено с помощью метода:
spin_button.set_value(value) |
Текущее значение SpinButton может быть получено как дробное или целое значение с помощью следующих методов:
float_value = spin_button.get_value() int_value = spin_button.get_value_as_int() |
Если вы хотите изменить значение SpinButton относительно текущего значения, используйте следующий метод:
spin_button.spin(direction, increment) |
Параметр direction может принимать одно из следующих значений:
SPIN_STEP_FORWARD SPIN_STEP_BACKWARD SPIN_PAGE_FORWARD SPIN_PAGE_BACKWARD SPIN_HOME SPIN_END SPIN_USER_DEFINED |
Этот метод содержит совсем немного функционала, который мы постараемся ясно объяснить. Большинство этих настроек использует регулятор, связанный со SpinButton.
SPIN_STEP_FORWARD и SPIN_STEP_BACKWARD изменяют значение SpinButton в размере указанном в increment, за исключением того что если increment равен 0, то в таком случае значение изменяется на step_increment в регляторе.
SPIN_PAGE_FORWARD и SPIN_PAGE_BACKWARD просто меняют значение SpinButton на increment.
SPIN_HOME устанавливает минимальное значение из диапазона регулятора.
SPIN_END устанавливает максимально значение из диапазона регулятора.
SPIN_USER_DEFINED просто меняет значение SpinButton на указанную величину.
Мы уходим от методов для настройки и получения значения или диапазона, и переходим к методам, отвечающим за внешний вид и поведение виджета SpinButton.
Первый из этих методов используется для ограничения поля ввода, которое может содержать только числа. Это защищает от ввода отличных от цифр символов в поле ввода SpinButton:
spin_button.set_numeric(numeric) |
numeric содержащий TRUE контролирует ввод в поле, и позволяет любой ввод при значении FALSE.
Вы можете выбрать будет ли SpinButton перескакивать между максимальным и минимальным значением, достигая предела, с помощью следующего метода:
spin_button.set_wrap(wrap) |
SpinButton будет перескакивать если wrap равен TRUE.
Вы можете приказать SpinButton округлять значения до ближайшего step_increment, указанного в регуляторе. Это происходит, если передать аргументу snap_to_ticks в следующем методе TRUE:
spin_button.set_snap_to_ticks(snap_to_ticks) |
Политика обновления SpinButton может быть изменена следующим методом:
spin_button.set_update_policy(policy) |
Возможные значения:
UPDATE_ALWAYS UPDATE_IF_VALID |
Эти значения определяют поведение SpinButton при просмотре введённого текста и синхронизации его значения с регулятором.
В случае UPDATE_IF_VALID значение изменяется только если введённое значение является числом входящим в диапазон значений регулятора. Изменит текст на текущее значение.
В случае UPDATE_ALWAYS мы игнорируем ошибки конвертации текста в числовое значение.
Наконец, вы можете явно запросить обновление для SpinButton.
spin_button.update() |
Пример spinbutton.py показывает использование виджетов SpinButton, включая настройку характеристик. Рисунок 9.11, “Пример виджетов Spin Button” показывает результат запуска программы:
Исходный код spinbutton.py:
#!/usr/bin/env python # -*- coding:utf-8 -*- # example spinbutton.py import pygtk pygtk.require('2.0') import gtk class SpinButtonExample: def toggle_snap(self, widget, spin): spin.set_snap_to_ticks(widget.get_active()) def toggle_numeric(self, widget, spin): spin.set_numeric(widget.get_active()) def change_digits(self, widget, spin, spin1): spin1.set_digits(spin.get_value_as_int()) def get_value(self, widget, data, spin, spin2, label): if data == 1: buf = "%d" % spin.get_value_as_int() else: buf = "%0.*f" % (spin2.get_value_as_int(), spin.get_value()) label.set_text(buf) def __init__(self): window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.connect("destroy", lambda w: gtk.main_quit()) window.set_title("Кнопки-счётчики") main_vbox = gtk.VBox(False, 5) main_vbox.set_border_width(10) window.add(main_vbox) frame = gtk.Frame("Не ускоряемые") main_vbox.pack_start(frame, True, True, 0) vbox = gtk.VBox(False, 0) vbox.set_border_width(5) frame.add(vbox) # День, месяц, год. hbox = gtk.HBox(False, 0) vbox.pack_start(hbox, True, True, 5) vbox2 = gtk.VBox(False, 0) hbox.pack_start(vbox2, True, True, 5) label = gtk.Label("День :") label.set_alignment(0, 0.5) vbox2.pack_start(label, False, True, 0) adj = gtk.Adjustment(1.0, 1.0, 31.0, 1.0, 5.0, 0.0) spinner = gtk.SpinButton(adj, 0, 0) spinner.set_wrap(True) vbox2.pack_start(spinner, False, True, 0) vbox2 = gtk.VBox(False, 0) hbox.pack_start(vbox2, True, True, 5) label = gtk.Label("Месяц :") label.set_alignment(0, 0.5) vbox2.pack_start(label, False, True, 0) adj = gtk.Adjustment(1.0, 1.0, 12.0, 1.0, 5.0, 0.0) spinner = gtk.SpinButton(adj, 0, 0) spinner.set_wrap(True) vbox2.pack_start(spinner, False, True, 0) vbox2 = gtk.VBox(False, 0) hbox.pack_start(vbox2, True, True, 5) label = gtk.Label("Год :") label.set_alignment(0, 0.5) vbox2.pack_start(label, False, True, 0) adj = gtk.Adjustment(2011.0, 0.0, 2100.0, 1.0, 100.0, 0.0) spinner = gtk.SpinButton(adj, 0, 0) spinner.set_wrap(False) spinner.set_size_request(55, -1) vbox2.pack_start(spinner, False, True, 0) frame = gtk.Frame("Ускоряемые") main_vbox.pack_start(frame, True, True, 0) vbox = gtk.VBox(False, 0) vbox.set_border_width(5) frame.add(vbox) hbox = gtk.HBox(False, 0) vbox.pack_start(hbox, False, True, 5) vbox2 = gtk.VBox(False, 0) hbox.pack_start(vbox2, True, True, 5) label = gtk.Label("Значение :") label.set_alignment(0, 0.5) vbox2.pack_start(label, False, True, 0) adj = gtk.Adjustment(0.0, -10000.0, 10000.0, 0.5, 100.0, 0.0) spinner1 = gtk.SpinButton(adj, 1.0, 2) spinner1.set_wrap(True) spinner1.set_size_request(100, -1) vbox2.pack_start(spinner1, False, True, 0) vbox2 = gtk.VBox(False, 0) hbox.pack_start(vbox2, True, True, 5) label = gtk.Label("Разрядов :") label.set_alignment(0, 0.5) vbox2.pack_start(label, False, True, 0) adj = gtk.Adjustment(2, 1, 5, 1, 1, 0) spinner2 = gtk.SpinButton(adj, 0.0, 0) spinner2.set_wrap(True) adj.connect("value_changed", self.change_digits, spinner2, spinner1) vbox2.pack_start(spinner2, False, True, 0) hbox = gtk.HBox(False, 0) vbox.pack_start(hbox, False, True, 5) button = gtk.CheckButton("Округлять до 0.5") button.connect("clicked", self.toggle_snap, spinner1) vbox.pack_start(button, True, True, 0) button.set_active(True) button = gtk.CheckButton("Только числовой ввод") button.connect("clicked", self.toggle_numeric, spinner1) vbox.pack_start(button, True, True, 0) button.set_active(True) val_label = gtk.Label("") hbox = gtk.HBox(False, 0) vbox.pack_start(hbox, False, True, 5) button = gtk.Button("Значение как Int") button.connect("clicked", self.get_value, 1, spinner1, spinner2, val_label) hbox.pack_start(button, True, True, 5) button = gtk.Button("Значение как Float") button.connect("clicked", self.get_value, 2, spinner1, spinner2, val_label) hbox.pack_start(button, True, True, 5) vbox.pack_start(val_label, True, True, 0) val_label.set_text("0") hbox = gtk.HBox(False, 0) main_vbox.pack_start(hbox, False, True, 0) button = gtk.Button(gtk.STOCK_CLOSE, gtk.STOCK_CLOSE) button.connect("clicked", lambda w: gtk.main_quit()) hbox.pack_start(button, True, True, 5) window.show_all() def main(): gtk.main() return 0 if __name__ == "__main__": SpinButtonExample() main()
Предыдущая страница | На уровень выше | Следующая страница |
9.9. Поле ввода текста (gtk.Entry) | К оглавлению | 9.11. Комбинированный список (gtk.Combo) |