Как создать скользящий виджет (GTK+, Quickly)
Недавно я видел этот виджет в Gedit:
Появляется при нажатии Ctrl + F
, Меня интересует, как получить скользящий эффект. Любое предложение будет оценено.
4 ответа
Я достиг эффекта затухания, используя чистый GTK и CSS.
Он работает только в GTK 3.6, и я не уверен, будет ли возможен эффект слайд-шоу, однако, если вы хотите, вы можете посмотреть на источник по адресу launchpad.net/uberwriter
Он работает через изменение состояния и затем GTK Transitions... Может быть, с высотой // шириной, что было бы возможно.
РЕДАКТИРОВАТЬ
Поскольку люди, очевидно, опровергают меня, вот еще одно, более подробное объяснение:
Это CSS, который я использовал:
GtkLabel:insensitive {
color: rgba(255,255,255,0);
transition: 500ms ease-in-out;
}
Если вы используете это как CSS (я надеюсь, что мне разрешено ссылаться на объяснение от себя, как это сделать: http://wolfvollprecht.de/blog/gtk-python-and-css-are-an-awesome-combo/) тогда вы можете использовать Gtk.StateFlags
исчезнуть ярлык.
например:
label.set_state_flags(Gtk.StateFlags.INSENSITIVE, True)
Тогда вы получите переход к нулевой непрозрачности.
Однако, как я заметил, не так много вариантов повлиять на размещение / ширину с помощью CSS, поэтому я думаю, что это ограничено цветами / непрозрачностью и т. Д.
Наслаждаться.
PS: обратите внимание, что это работает только в Gtk 3.6, так как Ubuntu 12.10
Такая анимация недостижима в чистом GTK+. Нет механизмов, которые бы это обрабатывали.
Я быстро взглянул на исходный код gedit, стало ясно, что они обрабатывают эту анимацию самостоятельно. Я не стал вдаваться в подробности, поскольку код, связанный с анимацией, достаточно расширен, но я заметил, что они включают в себя функции рисования в Каире для виджета анимированного поиска. Скорее всего, виджет анимируется, перемещая его положение кадр за кадром и перерисовывая его в другом месте наложения, которое используется в одной области отображения текста.
Это кажется самым простым решением. (Кажется, код gedit подготовлен для многих анимаций, использующих одну и ту же кодовую базу, поэтому использование точного подхода в простом приложении может оказаться излишним).
Чтобы воспроизвести этот эффект, вам необходимо:
- Используйте пользовательский виджет для части пользовательского интерфейса, которую вы хотите вставить / вывести.
- Сделайте так, чтобы он реагировал на событие рисования и периодические таймауты (чтобы перерисовать каждый кадр анимации)
- Создайте прозрачное наложение поверх остальных виджетов (или любой области, которая должна выглядеть так, как если бы она была ниже скользящего виджета)
- Нарисуйте анимированный виджет вручную на таком оверлее.
Я не могу придумать более простого решения. Однако, учитывая тот факт, что разработчики Gedit знают GTK +, как, вероятно, очень мало, возможно, не существует более простого трюка для достижения такого эффекта.
В настоящее время существует реальный ответ на этот вопрос. Так как он первоначально был задан и получен ответ, код для раскрытия виджета из libgd
- я полагаю, это то, что GEdit использовал в то время - был включен в GTK+ как GtkRevealer
:
https://developer.gnome.org/gtk3/stable/GtkRevealer.html
GtkRevealer
поддерживает различные формы перехода, в том числе основные направления скольжения и затухания непрозрачности.
Итак, в наши дни это так же просто, как добавить виджет, который вы хотите перейти к GtkRevealer
и используя его :transition-(type|duration)
а также :reveal-child
свойства.
Вы можете использовать комбинацию между Gtk.fixed(),GObject.timeout_add и функцией move, вот пример на python:
#! / USR / бен / питон * из gi.repository import Gtk, GObject Класс TestWindow (Gtk.Window): def animateImage (self): GObject.timeout_add (150, self.slideImage) def slideImage (self): self.positionX + = 50; if (self.positionX> 800): self.fixedWidget.move (self.logo, self.positionX, 200) верните True еще: вернуть Ложь def __init __ (self): Gtk.Window.__ init __ (self, title = 'Registration') self.positionX = 500 self.fixedWidget = Gtk.Fixed () self.fixedWidget.set_size_request (1920,1080) self.fixedWidget.show () self.logo = Gtk.Image.new_from_file ('picture.png') self.logo.show () self.fixedWidget.put (self.logo, self.positionX, 200) self.button1 = Gtk.Button ('Нажмите меня, чтобы перейти к изображению!') self.button1.show () self.button1.connect ('clicked', self.animateImage) self.button1.set_size_request (75,30) self.fixedWidget.put (self.button1,750,750) self.add (self.fixedWidget) testWindow = TestWindow () testWindow.set_size_request (1920,1080) testWindow.set_name ('testWindow') testWindow.show () Gtk.main ()