Gtk_widget.set_sensitive () не работает должным образом - PullRequest
0 голосов
/ 19 марта 2020

Ниже приведен мой код, где я использую две радиокнопки, чтобы активировать и деактивировать область типа Gtk.Box. Проблема, с которой я сталкиваюсь, заключается в том, что она работает только один раз, т. Е. Как только я активировал Gtk.Box, теперь я не могу снова деактивировать.

def on_toggling_hash_tab_radio_button_1(self, widget):
    self.hash_tab_hbox.set_sensitive(False)        

def on_toggling_hash_tab_radio_button_2(self, widget):
    self.hash_tab_hbox.set_sensitive(True)

Я немного поискал и узнал о Gtk.main () l oop, и я не знаю об этом должным образом. Как я могу достичь этого, и будет полезно получить немного знаний о главном цикле.

Спасибо

~ Шантану Кумар

1 Ответ

1 голос
/ 21 марта 2020

При нажатии невыбранной кнопки в группе нажатая кнопка получает сигнал «переключено», как и ранее выбранная кнопка. Внутри «переключенного» обработчика, gtk_toggle_button_get_active () может быть использован для определения, была ли кнопка выбрана или отменена.

Простой пример:

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

class MyWindow(Gtk.Window):

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

        self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.box_area = Gtk.Box(margin=18)
        self.label = Gtk.Label(label="Gtk.Box area")
        self.box_area.add(self.label)
        self.box_area.set_sensitive(False)
        self.radio_button_1 = Gtk.RadioButton.new_with_label(None, "Deactive")
        self.radio_button_2 = Gtk.RadioButton.new_with_label_from_widget(self.radio_button_1, "Active")
        self.radio_button_1.connect("toggled", self.on_radio_button_1_toggled)
        self.main_box.add(self.box_area)
        self.main_box.add(self.radio_button_1)
        self.main_box.add(self.radio_button_2)
        self.add(self.main_box)

    def on_radio_button_1_toggled(self, widget):
        if self.radio_button_1.get_active() == True:
            self.box_area.set_sensitive(False)
        else:
            self.box_area.set_sensitive(True)

win = MyWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

Тот же эффект может быть получается проще, связывая свойства объектов:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject

class MyWindow(Gtk.Window):

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

        self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.box_area = Gtk.Box(margin=18)
        self.label = Gtk.Label(label="Gtk.Box area")
        self.box_area.add(self.label)
        self.box_area.set_sensitive(False)
        self.radio_button_1 = Gtk.RadioButton.new_with_label(None, "Deactive")
        self.radio_button_2 = Gtk.RadioButton.new_with_label_from_widget(self.radio_button_1, "Active")
        self.radio_button_1.bind_property("active", self.box_area, "sensitive", GObject.BindingFlags.INVERT_BOOLEAN)
        self.main_box.add(self.box_area)
        self.main_box.add(self.radio_button_1)
        self.main_box.add(self.radio_button_2)
        self.add(self.main_box)

win = MyWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
...