Python 3.x Gtk3(pygobject)和python3中的更新/刷新小部件

Python 3.x Gtk3(pygobject)和python3中的更新/刷新小部件,python-3.x,gtk3,pygobject,Python 3.x,Gtk3,Pygobject,当我点击按钮时,我想改变它的颜色 或者更一般,我想更新/刷新Gtk.按钮或Gtk.框。整个Gtk.窗口也可以。 我发现在Gtk3中更新小部件的唯一方法是Gtk.widget.queue_draw()方法,但它看起来像 只适用于Gtk.DrawingArea(,是Gtk2的,但我在那里读过 在本节中没有做太多更改)。我假设它可以在任何小部件上工作,因为它被命名为 而不是gtk。绘图区域。。队列\u绘图并且它也不会产生 错误,但似乎忽略了它 不过,我可能对它的工作原理有错误的理解。我以前做过的唯一G

当我点击按钮时,我想改变它的颜色
或者更一般,我想更新/刷新Gtk.按钮或Gtk.框。整个Gtk.窗口也可以。 我发现在Gtk3中更新小部件的唯一方法是Gtk.widget.queue_draw()方法,但它看起来像 只适用于Gtk.DrawingArea(,是Gtk2的,但我在那里读过 在本节中没有做太多更改)。我假设它可以在任何小部件上工作,因为它被命名为 而不是gtk。绘图区域。。队列\u绘图并且它也不会产生 错误,但似乎忽略了它
不过,我可能对它的工作原理有错误的理解。我以前做过的唯一GUI是 不久前,在Java中是很简单的事情
下面是我的代码示例:

#-*-编码:utf-8-*-
从gi.repository导入Gtk、Gdk
进口开罗
a=0
类程序窗口(Gtk.Window):
定义初始化(自):
super(ProgWindow,self)。_init_#不知道这在做什么,也可以在没有
self.window=Gtk.window.\uuuu init\uuuu(self,title=“示例”)
self.connect(“删除事件”,Gtk.main_退出)
box=Gtk.box()
self.add(框)
按钮=Gtk.按钮(“你好”)
如果(a==0):
按钮。设置按钮名称(“绿色按钮”)
按钮。设置工具提示文本(“应为绿色”)
其他:
按钮。设置按钮名称(“红色按钮”)
按钮。设置工具提示文本(“应为红色”)
按钮。连接(“单击”,回拨\u单击)
框。添加(按钮)
已单击def回调(自身):
全球a
印刷品(a)
a=1
self.queue_draw()
gui()#创建具有正确颜色和工具提示的新窗口
def gui():
win=ProgWindow()
赢,全力以赴
Gtk.main()
style_provider=Gtk.CssProvider()
css_data=“”
#绿色按钮{
背景:#009900;
字体大小:120%;
字号:600;
}
#红色按钮{
背景:#FF0000;
字体大小:120%;
字号:600;
}
"""
样式\u提供程序。从\u数据(css\u data.encode())加载\u
Gtk.StyleContext.add_provider_for_屏幕(
Gdk.Screen.get_default(),
样式提供程序,
Gtk.STYLE_提供程序_优先级_应用程序
)
如果名称=“\uuuuu main\uuuuuuuu”:

gui()
您不需要为此运行
队列绘制()。您也不应该每次希望按钮更改颜色时都重新创建GUI。这可能会把事情搞砸,因为在
gui()
中,您创建了一个新窗口,并使用
Gtk.main()
启动了一个新的主循环,导致许多主循环递归运行。这是你不想要的

相反,使用
按钮。设置名称(“绿色按钮”)
红色按钮来更改颜色。除了从信号处理程序返回之外,不需要其他操作

更好的做法是使用样式类而不是ID——您可能希望有多个绿色或红色按钮。在这种情况下,将
.green button
.red button
放在CSS中(而不是
#green button
#red button
),并使用此按钮更改颜色:

button.get_style_context().remove_class('green-button')
button.get_style_context().add_class('red-button')

反之亦然。

您不需要为此运行
queue\u draw()
。您也不应该每次希望按钮更改颜色时都重新创建GUI。这可能会把事情搞砸,因为在
gui()
中,您创建了一个新窗口,并使用
Gtk.main()
启动了一个新的主循环,导致许多主循环递归运行。这是你不想要的

相反,使用
按钮。设置名称(“绿色按钮”)
红色按钮来更改颜色。除了从信号处理程序返回之外,不需要其他操作

更好的做法是使用样式类而不是ID——您可能希望有多个绿色或红色按钮。在这种情况下,将
.green button
.red button
放在CSS中(而不是
#green button
#red button
),并使用此按钮更改颜色:

button.get_style_context().remove_class('green-button')
button.get_style_context().add_class('red-button')

反之亦然。

你把它弄得太复杂了,下面是一个简化版本,点击时按钮会变成绿色

p、 美国。 像这样改变小部件的颜色应该是一个例外而不是规则,打破用户主题通常不是一个好主意

from gi.repository import Gtk

class CSSButtonApp(object):
    def __init__(self):
        self.mycolor = '''
        GtkButton {
            border-image: none;
            background-image: none;
            background-color: green;
            color: white;
        }
        '''
        self.window = Gtk.Window()
        self.window.set_title('CSS Button')
        self.window.set_default_size(200, 100)
        self.window.set_border_width(10)
        self.window.connect('destroy', lambda w: Gtk.main_quit())

        button = Gtk.Button(label="My Button")
        self.window.add(button)

        provider = Gtk.CssProvider()
        provider.load_from_data(self.mycolor)

        button.connect("clicked", self.apply_css, provider)

        self.window.show_all()

    def apply_css(self, widget, provider):
        Gtk.StyleContext.add_provider(widget.get_style_context(),
                                      provider,
                                      Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

    def main(self):
        Gtk.main()

if __name__ == '__main__':
    app = CSSButtonApp()
    app.main()

你把它弄得太复杂了,下面是一个简化的版本,当点击按钮时它会变成绿色

p、 美国。 像这样改变小部件的颜色应该是一个例外而不是规则,打破用户主题通常不是一个好主意

from gi.repository import Gtk

class CSSButtonApp(object):
    def __init__(self):
        self.mycolor = '''
        GtkButton {
            border-image: none;
            background-image: none;
            background-color: green;
            color: white;
        }
        '''
        self.window = Gtk.Window()
        self.window.set_title('CSS Button')
        self.window.set_default_size(200, 100)
        self.window.set_border_width(10)
        self.window.connect('destroy', lambda w: Gtk.main_quit())

        button = Gtk.Button(label="My Button")
        self.window.add(button)

        provider = Gtk.CssProvider()
        provider.load_from_data(self.mycolor)

        button.connect("clicked", self.apply_css, provider)

        self.window.show_all()

    def apply_css(self, widget, provider):
        Gtk.StyleContext.add_provider(widget.get_style_context(),
                                      provider,
                                      Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

    def main(self):
        Gtk.main()

if __name__ == '__main__':
    app = CSSButtonApp()
    app.main()

谢谢!这一个与我实际程序的代码配合得很好。非常感谢!这一个与我实际程序的代码配合得很好。