Gtk.CssProvider.load_from_data TypeError: Елемент 0: Трябва да е число, а не str

Получавах тази грешка, когато изпълнявах моя gtk проект от терминал с python3 myapp.py, но не и когато стартирах приложението си чрез системата за изграждане на Python на Sublime-Text-3! Колко странно.

TypeError: Item 0: Must be number, not str

Грешният код беше по същество:

color_scheme = {'fg_color':'#ffffff', 'bg_color': '#000000',}
css = """
    GtkLabel {
        color: %(fg_color)s;
        background: %(bg_color)s;
    }
"""

# ...

cssprovider = Gtk.CssProvider()
css_data = css % color_scheme
cssprovider.load_from_data(css_data)

person ThorSummoner    schedule 27.12.2014    source източник


Отговори (3)


Както бе споменато в други отговори (включително вашия), style_provider.load_from_data() очаква байтове, а не низ.

Вместо да кодирате своя Unicode низ, можете директно да дефинирате своя CSS като байтов поток:

css = b"""
        #MyWindow {
            background-color: red;
        ...
    """

(Забележете b)

person Alberto Caso    schedule 18.01.2017

Успях да изровя това от Google: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=698459

Josselin Mouette [2013-01-19 11:55 +0100]:

Продадено на 18 януари 2013 г. в 21:10 +0000, Тони Хютън написа:

TypeError: Елемент 0: Трябва да е число или еднобайтов низ, а не str

Е, ако Python иска байтов низ, изпратете му байтов низ, а не уникод. Тоест б"""бла бла бла""".

Наистина, затваряне. Като алтернатива, ако имате (unicode) низ, можете също да извикате .encode() върху него, за да го превърнете в байтов масив.

Мартин

Първият опит за използване на bytes(css_data) не проработи, но

css_data.encode()

работи!

person ThorSummoner    schedule 27.12.2014

Само в случай, че някой иска пълен пример, който работи и където можете да видите нещо.

ПРЕДУПРЕЖДЕНИЕ: Пакетът gi от PyPI (който може да се инсталира с pip) е грешен!

#!/usr/bin/env python3
from gi.repository import Gtk, Gio, Gdk


# See also:
# http://wolfvollprecht.de/blog/gtk-python-and-css-are-an-awesome-combo/
class HeaderBarWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self,
                            title="Stack Demo",
                            decorated=True,
                            name="MyWindow")

        style_provider = Gtk.CssProvider()

        css = """
        #MyWindow {
            background-color: red;
            border-radius: 10px;
            outline:none;
        }

        #header {
            background-color: blue;
        }
        """
        style_provider.load_from_data(bytes(css.encode()))
        Gtk.StyleContext.add_provider_for_screen(
            Gdk.Screen.get_default(), style_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )

        self.set_border_width(10)
        self.set_default_size(400, 200)

        hb = Gtk.HeaderBar(name="header")
        hb.set_show_close_button(True)
        hb.props.title = "HeaderBar example"
        self.set_titlebar(hb)

        button = Gtk.Button()
        icon = Gio.ThemedIcon(name="mail-send-receive-symbolic")
        image = Gtk.Image.new_from_gicon(icon, Gtk.IconSize.BUTTON)
        button.add(image)
        hb.pack_end(button)

        box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
        Gtk.StyleContext.add_class(box.get_style_context(), "linked")

        button = Gtk.Button()
        button.add(Gtk.Arrow(Gtk.ArrowType.LEFT, Gtk.ShadowType.NONE))
        box.add(button)

        button = Gtk.Button()
        button.add(Gtk.Arrow(Gtk.ArrowType.RIGHT, Gtk.ShadowType.NONE))
        box.add(button)

        hb.pack_start(box)

        self.add(Gtk.TextView())

win = HeaderBarWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

дава:

въведете описание на изображението тук

person Martin Thoma    schedule 21.02.2015