Как создать скользящий виджет (GTK +, Быстро)

Недавно я видел этот виджет в Gedit:

enter image description here

Появляется, когда Вы нажимаете Ctrl + F. То, что мне интересно, находится в том, как получить скользящий эффект. Любое предложение будет цениться.

8
задан 6 September 2012 в 14:23

4 ответа

Я достиг эффекта постепенного исчезновения с помощью чистого GTK и CSS.

Это только работает в GTK 3.6, и я не уверен, был ли слайд в / эффект возможен, однако, если Вы хотите, можно посмотреть на источник по launchpad.net/uberwriter

Это работает посредством изменения состояния и затем Переходов GTK... Возможно, с высотой//ширина, которая была бы возможна, также.

Править

Поскольку люди, очевидно, downvote меня, вот другой, более подробное объяснение:

Это - 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

7
ответ дан 21 October 2019 в 11:04

Такая анимация не достижима в чистом GTK +. Нет никаких механизмов, которые обработали бы его.

я дал беглый взгляд на исходном коде gedit, ясно, что они обрабатывают эту анимацию самостоятельно. Я не изучил детали, поскольку код, связанный с анимациями, вполне расширен, но я отметил, что они включают Каирские функции рисунка анимированного поискового виджета. Скорее всего, виджет анимирован путем перемещения его кадра положения кадром и перерисовки его на другом месте в наложении, которое используется на единственной текстовой области дисплея.

, Который, кажется, простое решение. (код gedit, кажется, подготовлен ко многим анимациям, совместно использующим ту же кодовую базу, таким образом это может быть излишество для использования, это - точный подход в простом приложении.)

Для репродуцирования этого эффекта Вы должны будете:

  • Использование пользовательский виджет для части UI, в которой Вы хотите скользить.
  • Делают, это воздействовать тянет , событие и периодические тайм-ауты (для перерисовки каждого кадра анимации)
  • Создают прозрачное наложение по остальной части виджетов (или любая область, которая должна появиться, как будто это было ниже скользящего виджета)
  • , Тянут анимированный виджет вручную на таком наложении.

я не могу предложить более легкое решение. Однако рассматривая то, что gedit разработчики действительно знают, GTK + как, вероятно, очень мало делают, не может быть никакого более простого приема для достижения такого эффекта.

3
ответ дан 21 October 2019 в 11:04

В наше время существует реальный ответ на этот вопрос. Так как это первоначально спросили и ответили, код для раскрытия виджета от libgd - который я предполагаю, то, что GEdit использовал в то время - был upstreamed в GTK + как GtkRevealer:

https://developer.gnome.org/gtk3/stable/GtkRevealer.html

GtkRevealer поддержки различные формы перехода, включая кардинальные направления слайда и исчезновения на непрозрачности.

Так, в эти дни, это столь же просто как добавление виджета, что Вы хотите перейти к GtkRevealer и использование :transition-(type|duration) и :reveal-child свойства.

0
ответ дан 21 October 2019 в 11:04

Можно использовать комбинацию между Gtk.fixed (), GObject.timeout_add и функциональным перемещением, вот пример в Python:

#!/usr/bin/python*
from gi.repository import Gtk, GObject

class 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)
          return True        
        else:
          return False 

     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('Click me to slide image!')
        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()
1
ответ дан 23 November 2019 в 05:34

Другие вопросы по тегам:

Похожие вопросы: