2013-02-20 5 views
4

Прошу прощения за мой английский.Почему стиль css не работает на GtkButton?

Я пытаюсь изменить цвет фона GtkButton с помощью файла css, но я не могу. Я попробовал несколько примеров, которые я нашел в Интернете, но никто не работает. Я пишу два примера. Один в Python 3.2.3, а другой в C Я использую Gtk + 3.6 и Kubuntu 12.10.

Это код одного из них:

from gi.repository import Gtk, Gdk 

class MainWindow(Gtk.Window): 
    def __init__(self): 
     super().__init__() 
     vbox = Gtk.Box(spacing=10,orientation=Gtk.Orientation.VERTICAL) 
     self.add(vbox) 

     self.entries = [ Gtk.Entry() for i in range(3) ] 
     for e in self.entries: 
      vbox.pack_start(e, True, True, 0) 
      e.connect("changed", self.on_entry_changed) 
      e.set_text('123') 

     button=Gtk.Button(label='ok') 
     vbox.pack_end(button,True,True,0) 

    def on_entry_changed(self,entry): 
     ctx = entry.get_style_context() 
     if not entry.get_text().isnumeric(): 
      ctx.add_class('invalid') 
     else: 
      ctx.remove_class('invalid') 
cssProvider = Gtk.CssProvider() 
cssProvider.load_from_path('style.css') 
screen = Gdk.Screen.get_default() 
styleContext = Gtk.StyleContext() 
styleContext.add_provider_for_screen(screen, cssProvider, 
Gtk.STYLE_PROVIDER_PRIORITY_USER) # With the others GTK_STYLE_PROVIDER_PRIORITY values get the same result. 

window = MainWindow() 
window.connect("delete-event", Gtk.main_quit) 
window.show_all() 
Gtk.main() 

и style.css

GtkEntry.invalid { 
    background-color: #ffaaaa; 
    background: #ffaaaa; 
} 

GtkButton { 
    engine: oxygen-gtk; /*tried also with 'none' and without setting engine*/ 
    background-color: green; 
    background: green; 
} 

Записи хорошо работает ... изменение Б.Г. цвета. Но кнопка «Нет», и нет сообщений об ошибках.

EDIT3: (Удалены превью редактирует и изменить некоторые теги) ... Подводя итог я пытался изменить цвет кнопки со всеми кодами Python, C и C++, которые я нашел в Интернете безуспешно. Я прочитал все учебники, которые я нашел, и справочное руководство GTK + 3. Все, что я знаю после этого, заключается в том, что проблема связана с темами Kubuntu: если я изменю тему GTK от 'oxygen-gtk' до 'default' (в конфигурации GTK), это единственный способ, код работает хорошо, но это не идея, и кнопка выглядит ужасно.

Итак, вопросы:

  1. Почему я не могу изменить цвет фона кнопки?
  2. Почему у меня эта проблема только с кнопками? (Хорошо работает с другими виджетами)
  3. Я получаю ответы здесь и на форумах GTK, говорящих, что это не очень хорошая практика для изменения цветов кнопок, но ... Что делать, если мне нужно меню, подобное изображению на этом изображении (link) (см. кнопки красных кнопок)? Для вас это лучший практик?

Спасибо и приветствую!

ответ

1

Это сложно, но я не думаю, что это можно сделать напрямую.

Я считаю, что основной причиной является то, что кнопка не отображает фон. Все, что он делает, - это рамдерская рамка вокруг своей области, а затем отрисовка любых детей внутри. Помните, что GtkButton является контейнером, он обычно содержит GtkLabel для текстовой метки, но может содержать любые виджеты.

Мне удалось изменить цвет фона текстовых меток, но на него влияет только гораздо более тихий ящик вокруг самого текста, чего вы не хотите.

Косвенное решение заключается в подклассе GtkButton, чтобы создать вариант, который фактически отображает его фон. Это, конечно, довольно грубо по темам, и их следует избегать.

+0

Спасибо за помощь! Итак, если это довольно грубая идея, как разработчики делают, когда хотят создать персонализированный графический интерфейс? Лучше всего использовать GTK3, чтобы создать меню, подобное этому [link] (http://c.fsdn.com/con/app/proj/scrmopenerp/screenshots/ProjetatyScrmOpenerp_2.png)? (см. кнопки в красном поле) –

2

Это должно работать (я имею в виду, что это работает для меня!):

GtkButton { 
    border-image: none; 
    background-image: none; 
    background-color: green; 
} 
+0

, пожалуйста, объясните это для лучшего понимания пользователей. – Shivaay

+0

Работает для меня тоже. –

+0

Не работает для меня, мне пришлось использовать «кнопку» вместо «GtkButton». Тем не менее, он также нарисовал кнопку «X», которая закрывает окно, поэтому мне пришлось использовать 'button.get_style_context(). Add_class (" foo ") и селектор' button.foo' в style.css. – Slazer

5

Я знаю, что это довольно старый, но появившийся в первых нескольких результатах Google, поэтому я решил поделиться своим опытом.

Gtk.Button имеет встроенный Gtk.Label для текста кнопки, который не наследует от кнопки по умолчанию, так что вы должны явно указать его (или просто указать цвет в нем):

GtkButton GtkLabel { 
    color: #fff; /* This changes the text color in the button */ 
} 

Что касается ответа от @sciamp, тема GTK устанавливает изображение для фона и границ, так что вам нужно вручную удалить это с помощью background-image: none; border-image: none; Надейтесь, что это спасет кого-то.

Смежные вопросы