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()
谢谢!这一个与我实际程序的代码配合得很好。非常感谢!这一个与我实际程序的代码配合得很好。