从使用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)
答案 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()
给出:
答案 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()
工作!