2017-06-27 84 views
1

我有一个设置了一些窗口小部件的窗口,但我希望这些窗口小部件的信息在用户输入(例如按钮点击)后被更新。另外,我希望事件处理程序能够将新小部件添加到窗口中。 我附上了一个尝试以下简单版本的问题。显然它不起作用。如何更新窗口中的窗口小部件并将新的窗口小部件添加到PyGObject中的窗口中?

import gi 
gi.require_version("Gtk", "3.0") 
from gi.repository import Gdk, Gtk 

class Button(Gtk.Box): 

    def __init__(self, message, label, window_grid): 
     Gtk.Box.__init__(self, spacing=6) 
     self.set_border_width(10) 
     self.label = label 
     self.window_grid = window_grid 

     button = Gtk.Button.new_with_label(message) 
     button.connect("clicked", self.on_click) 
     self.pack_start(button, True, True, 0) 

    def on_click(self, widget): 
     # Change/update a label in the window_grid 
     self.label = LabelBox("Changed the label") 
     self.label.queue_draw() 
     # Add a new label to the window_grid 
     new_label = LabelBox("New label") 
     self.window_grid.attach(new_label, 0, 2, 1, 1) 

class LabelBox(Gtk.Box): 

    def __init__(self, message): 
     Gtk.Box.__init__(self, spacing=6) 
     self.set_border_width(10) 
     label = Gtk.Label(message) 
     self.pack_start(label, True, True, 0) 

win = Gtk.Window() 
window_grid = Gtk.Grid() 

label = LabelBox("This is a label") 
button = Button("Test", label, window_grid) 

window_grid.attach(label, 0, 0, 1, 1) 
window_grid.attach(button, 0, 1, 2, 2) 

win.add(window_grid) 

win.connect("delete-event", Gtk.main_quit) 
win.show_all() 
Gtk.main() 
+1

控件默认为隐藏。 – andlabs

回答

0

您的代码结构格式不正确。此代码对我有用:

import gi 
gi.require_version("Gtk", "3.0") 
from gi.repository import Gtk 
import sys 

class GUI: 
    def __init__(self): 

     self.win = Gtk.Window() 
     self.window_grid = Gtk.Grid() 
     box = Gtk.Box() 

     button = Gtk.Button.new_with_label("Test") 
     button.connect("clicked", self.on_click) 

     self.label = Gtk.Label("This is a label") 

     self.window_grid.attach(self.label, 0, 0, 1, 1) 
     self.window_grid.attach(button, 0, 1, 2, 2) 

     self.win.add(self.window_grid) 

     self.win.connect("delete-event", Gtk.main_quit) 
     self.win.show_all() 

    def on_click(self, widget): 
     # Change/update a label in the window_grid 
     self.label.set_label('Label changed') 
     label = Gtk.Label("Another label") 
     self.window_grid.attach(label, 2, 1, 2, 2) 
     self.win.show_all() 


def main(): 
    app = GUI() 
    Gtk.main() 

if __name__ == "__main__": 
    sys.exit(main()) 

此外,请记住@andlabs注释,小部件默认情况下处于隐藏状态。

+0

这是我们如何在窗口中添加新窗口小部件的方法,但我们如何修改现有窗口小部件(请参阅原始问题)? –

+0

@Billjoe对不起,我误解了你的要求。试试我编辑的代码。 – theGtknerd

+0

在这种情况下,它可以用标签工作,但我希望能有更普遍的情况。假设我有一个包含一些变量的框,然后我改变其中的一个变量。现在我想更新该框。我怎么做? –

0

如前所述,您的代码逻辑不好。您必须尝试了解如何设计您的应用程序。无论如何,我已经设法让您的代码适合您的问题:

import gi 
gi.require_version("Gtk", "3.0") 
from gi.repository import Gtk 

class Button(Gtk.Box): 

    def __init__(self, message, label, window_grid): 
     Gtk.Box.__init__(self, spacing=6) 
     self.set_border_width(10) 
     self.label = label 
     self.window_grid = window_grid 

     button = Gtk.Button.new_with_label(message) 
     button.connect("clicked", self.on_click) 
     self.pack_start(button, True, True, 0) 

    def on_click(self, widget): 
     # Change/update a label in the window_grid 
     self.label.label.set_text("Changed the lable") 
     # Add a new label to the window_grid 
     new_label = LabelBox("New label") 
     self.window_grid.attach(new_label, 0, 2, 1, 1) 
     new_label.show_all() 

class LabelBox(Gtk.Box): 

    def __init__(self, message): 
     Gtk.Box.__init__(self, spacing=6) 
     self.set_border_width(10) 
     self.label = Gtk.Label(message) 
     self.pack_start(self.label, True, True, 0) 

win = Gtk.Window() 
window_grid = Gtk.Grid() 

label = LabelBox("This is a label") 
button = Button("Test", label, window_grid) 

window_grid.attach(label, 0, 0, 1, 1) 
window_grid.attach(button, 0, 1, 1, 1) 

win.add(window_grid) 
win.connect("destroy", Gtk.main_quit) 
win.show_all() 

Gtk.main() 

将它与您的相比,以查看您所犯的错误。没有必要将标签和按钮包裹在GtkBox中。

相关问题