Gtk.CssProvider.load_from_data TypeError:Item 0:必须是数字,而不是str

时间:2014-12-27 06:21:37

标签: python-3.x pygtk gtk3

从使用python3 myapp.py的终端运行我的gtk项目时遇到此错误,但是在通过Sublime-Text-3&#39的python构建系统启动我的应用程序时却没有!多奇怪。

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)

3 个答案:

答案 0 :(得分:4)

正如其他答案(包括你的答案)中所提到的,style_provider.load_from_data()需要字节,而不是字符串。

您可以直接将CSS定义为字节流,而不是对您的unicode字符串进行编码:

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

(注意b)

答案 1 :(得分:3)

以防万一有人想要一个有效的完整例子以及你可以看到的东西。

警告:PyPI的gi包(可以用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()

给出:

enter image description here

答案 2 :(得分:2)

我能够从谷歌中挖掘出来:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=698459

  

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

     
    

Le vendredi 18 janvier2013à21:10 +0000,Tony Houghtonaécrit:

         
      

TypeError:项目0:必须是数字或单字节字符串,而不是str

    
         

好吧,如果Python需要一个字节字符串,请发送一个字节字符串,而不是     unicode one。     也就是说,b“”“blah blah blah”“”。

  
     

确实,结束了。或者,如果你有一个(unicode)字符串   也可以在其上调用.encode()将其转换为字节数组。

     

马丁

首次尝试使用bytes(css_data) 无效,但

css_data.encode()

工作!