【问题标题】:Update/refresh Widget in Gtk3 (pygobject) and python3Gtk3(pygobject)和python3中的更新/刷新小部件
【发布时间】:2015-04-17 14:10:58
【问题描述】:

我希望在单击按钮时改变按钮的颜色。
或者更一般地说,我想更新/刷新 Gtk.Button 或 Gtk.Box。整个 Gtk.Window 也可以。 我发现在 Gtk3 中更新小部件的唯一方法是 Gtk.widget.queue_draw() 方法,但它看起来像 仅适用于 Gtk.DrawingArea (Drawin with cairo on Zetcode,它适用于 Gtk2,但我已经阅读过那里 本节没有做太多改动)。我认为它适用于任何小部件,因为它被命名 gtk.widget.queue_draw 而不是 gtk.drawingArea.queue_draw 而且它也没有产生 错误,但似乎被省略了。
我可能对它应该如何工作有一个错误的理解。我以前做过的唯一guis是 前段时间,在 Java 中是简单的事情。
所以这是我的代码示例:

# -*- coding: utf-8 -*-

from gi.repository import Gtk, Gdk
import cairo

a = 0
class ProgWindow(Gtk.Window):
    def __init__(self):
        super(ProgWindow, self).__init__() # don't know what this is doing, works also without
        self.window = Gtk.Window.__init__(self, title="example")
        self.connect("delete-event", Gtk.main_quit)
        box = Gtk.Box()
        self.add(box)

        button = Gtk.Button("Hello")
        if (a==0):
            button.set_name('green_button')
            button.set_tooltip_text("should be green")
        else:
            button.set_name('red_button')
            button.set_tooltip_text("should be red")
        button.connect("clicked", callback_clicked)
        box.add(button)

def callback_clicked(self):
    global a
    print(a)
    a = 1
    self.queue_draw()
    gui()                 # creates a new window with the correct colour and tool tip

def gui():
    win = ProgWindow()
    win.show_all()
    Gtk.main()


style_provider = Gtk.CssProvider()

css_data = """
#green_button{
    background: #009900;
    font-size: 120%;
    font-weight: 600;
}

#red_button{
    background: #FF0000;
    font-size: 120%;
    font-weight: 600;
}
"""

style_provider.load_from_data(css_data.encode())
Gtk.StyleContext.add_provider_for_screen(
Gdk.Screen.get_default(),
style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)

if __name__ == "__main__":
    gui()

我也在某处读到,有可能使一个区域无效。这可能是这样做的方法吗? 我还读到,一旦再次到达 Gtk.main() 循环,事情就会更新。 如果是这样,我该如何唤起这个?正如我所说,我对 gui 编程很陌生,但我的理解是, 这是它在等待用户输入时大部分时间“卡住”的地方。
或者将小部件移除并在同一空间放置一个新小部件来完成这项工作?
任何帮助和解释将不胜感激
谢谢

【问题讨论】:

    标签: python-3.x gtk3 pygobject


    【解决方案1】:

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

    改为使用button.set_name('green-button')red-button 更改颜色。除了从信号处理程序返回之外,不需要进一步的操作。

    使用样式类而不是 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')
    

    反之亦然。

    【讨论】:

    • 非常感谢!这与我的实际程序的代码配合得很好。
    【解决方案2】:

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

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

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多