Есть ли более простой способ создать метку с рамкой в ​​python Gtk3, чем поместить ее в рамку?

Под более простым я подразумеваю - могу ли я определить стиль или что-то в этом роде и применить его ко всем меткам в моей программе? У меня много ярлыков, и я не хочу печатать так много. Я слышал о "Стиле Панго", но могу ли я применить его ко всем виджетам ярлыков одновременно?


person Lord_JABA    schedule 11.07.2012    source источник


Ответы (2)


Понятие «много этикеток» относительно. Мы говорим о 14 или 84? Если он ближе к 84, вам, вероятно, следует использовать Glade для создания интерфейса, а затем установить свойства кадров x-pad и y-pad. С CSS для gtk3 вам придется упаковать любую метку во фрейм для полей, отступов или любых их вариантов (отступы сверху, отступы снизу), чтобы они работали.

GtkFrame является потомком GtkMisc. GtkMisc имеет функцию gtk_misc_set_padding(). Вы можете использовать эту функцию на своих этикетках, не упаковывая их в рамки. Но вам придется установить его для каждой метки.

Я не знаю Python только C и немного C++, но вы можете сделать что-то вроде этого:

1) создайте перечисление для всех ваших меток, начиная с label0. (думаю, namedtuple в python) Причина, по которой я говорю использовать перечисление, заключается в том, что позже будет очень сложно отслеживать все метки без них.

2) создать массив указателей на GtkWidget, по одному на каждую метку.

3) создайте свои метки, используя указатели на GtkWidget с перечислением в качестве индекса. (вот где перечисление действительно необходимо)

4) создайте цикл for с gtk_misc_set_padding(). Используйте массив GtkWidget в качестве параметра в gtk_misc_set_padding(). Прокручивайте каждую метку, устанавливая ее отступы.

Я мог бы привести пример, но, вероятно, это было бы бесполезно, если вы не знаете C. Если вам все еще нравится, дайте мне знать.

person mike    schedule 23.07.2012

Вы можете add_provider_for_screen .

#!/usr/bin/env python

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

def add_provider(widget):
    screen = widget.get_screen()
    style = widget.get_style_context()
    provider = Gtk.CssProvider()
    provider.load_from_data('label {\
    border: 1px solid #000000;\
    margin: 2px;\
    }'.encode('utf-8'))
    style.add_provider_for_screen(screen, provider, Gtk.STYLE_PROVIDER_PRIORITY_USER)

window = Gtk.Window()
label = Gtk.Label()
label2 = Gtk.Label()
box = Gtk.VBox()
box.add(label)
box.add(label2)
window.add(box)

label.set_label("asd1")
label2.set_label("asd2")

window.connect("realize", add_provider)
window.connect("delete-event", Gtk.main_quit)

window.show_all()

Gtk.main()

add_provider нужно запустить только один раз, но после реализации виджета (не имеет значения, к какому виджету вы будете добавлять)

person pan-mroku    schedule 14.03.2017