Добавление виджета в обратный вызов в GTK - PullRequest
0 голосов
/ 16 октября 2018

Как я могу добавить новый виджет из функции обратного вызова в классе?Например, у меня есть Gtk.Box и Gtk.Button, и я хочу добавить Gtk.Label в Gtk.Box из функции обратного вызова, связанной с нажатием кнопки.(этот код не работает)

import gi
import os
gi.require_version("Gtk", "3.0")
from gi.repository import GLib, Gtk, GObject, Gio

class MainWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Delete Screenshots")

        self.main_grid = Gtk.Grid()
        self.main_grid.set_row_homogeneous(True)
        self.add(self.main_grid)

        self.screen_label = Gtk.Label()
        self.screen_label.set_text("Test Label")
        self.screen_label2 = Gtk.Label()
        self.screen_label2.set_text("Test Label2")

        self.label_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.label_box.homogeneous = True

        self.button_search = Gtk.Button(label="Search")
        self.button_search.connect("clicked", self.on_button_search_clicked)

        self.button_delete = Gtk.Button(label="Delete")
        self.button_delete.connect("clicked", self.on_button_delete_clicked)

        self.main_grid.add(self.button_search);
        self.main_grid.attach(self.button_delete, 1, 0, 1, 1);
        self.main_grid.attach(self.label_box, 0, 1, 1, 1)

    def on_button_search_clicked(self, widget):
        self.label_box.pack_start(self.screen_label, True, True, 0)

    def on_button_delete_clicked(self, widget):
        print("Delete")

win = MainWindow()
win.set_default_size(50, 30)
win.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

Как добавить что-то в label_box из on_button_search_clicked?

1 Ответ

0 голосов
/ 17 октября 2018

Ваш код в основном правильный.Однако все виджеты должны отображаться либо с помощью вызова show() для них, либо show_all() для родительского виджета.В вашем коде show_all() вызывается для экземпляра MainWindow.В то время виджет, который вы добавляете в обратном вызове, не прикреплен к окну или его дочерним элементам.Таким образом, он не будет включен в вызов show_all().

Чтобы это исправить, просто вызовите show() на вашем ярлыке в обратном вызове:

...

def on_button_search_clicked(self, widget):
    self.label_box.pack_start(self.screen_label, True, True, 0)
    self.screen_label.show()

...
...