【发布时间】: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