Переменные переключатели вкл / выкл? - PullRequest
0 голосов
/ 26 апреля 2018

Итак, я хочу, чтобы в моем маленьком окне Python Gtk было 2 переключателя.Когда один переключатель включен, другой выключен, и наоборот.Я не слишком уверен, как управлять обоими переключателями.Если кто-нибудь может привести меня в правильном направлении, это будет очень цениться.

#!/usr/bin/python3

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

class SwitcherWindow(Gtk.Window):

def __init__(self):
    Gtk.Window.__init__(self, title="Alt Switch Demo")
    self.set_border_width(10)

    hbox = Gtk.Box(spacing=10)
    self.add(hbox)

    switch1 = Gtk.Switch()
    switch1.connect("notify::active", self.on_switch_activated)
    switch1.set_active(True)
    hbox.pack_start(switch1, True, True, 0)

    switch2 = Gtk.Switch()
    switch2.connect("notify::active", self.on_switch_activated)
    switch2.set_active(False)
    hbox.pack_start(switch2, True, True, 0)

    if switch1.get_active():
        switch2.set_active(False)
    else:
        switch2.set_active(True)

def on_switch_activated(self, switch, gparam):
    builder = Gtk.Builder()
    sw1 = builder.get_object("switch1")
    sw2 = builder.get_object("switch2")
    if switch.get_active():
        state = "on"
        sw2.set_active(False)
    else:
        state = "off"
        print("Switch was turned", state)

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

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Я бы связал свойства обоих коммутаторов, инвертированных и синхронизированных при создании:

#!/usr/bin/python3

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

class SwitcherWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Alt Switch Demo")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=10)
        self.add(hbox)

        switch1 = Gtk.Switch()
        switch1.set_active(True)
        hbox.pack_start(switch1, True, True, 0)

        switch2 = Gtk.Switch()
        switch2.set_active(False)
        hbox.pack_start(switch2, True, True, 0)

        switch1.bind_property("active", switch2, "active", GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE |  GObject.BindingFlags.INVERT_BOOLEAN)   


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

Решение находится в этой строке кода:

switch1.bind_property("active", switch2, "active", GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE |  GObject.BindingFlags.INVERT_BOOLEAN) 

Здесь вы можете bind свойство "active" switch1 и switch2 с флагами привязки : двунаправленная , синхронизация при создании и инвертированный логический

0 голосов
/ 27 апреля 2018

Не нужно ничего более сложного, чем предыдущие ответы.У gtk уже есть виджет радио-кнопки, который делает все это за вас.Единственное, что при его инициализации у вас не установлены кнопки, поэтому вы должны выбрать одну для установки.

0 голосов
/ 26 апреля 2018

Вы можете реализовать логику, аналогичную написанной мной:

#!/usr/bin/env python


class Switch:
    _State = False

    def __init__(self, StartingPosition=False):
        self._State = StartingPosition

    def SwitchON(self):
        self._State = True

    def SwitchOFF(self):
        self._State = False

    def Switch(self):
        self._State = not self._State

    def GetInfo(self):
        print(self._State)


class Switcher:
    def __init__(self, switchDependencyList=[]):
        self.SwitchDependencyList = switchDependencyList
        if len(self.SwitchDependencyList) == 0:
            return None
        if not len(self.SwitchDependencyList) % 2:
            return None

    def SwitchByIndex(self, Index):
        for i, switch in enumerate(self.SwitchDependencyList):
            if i == Index:
                switch.SwitchON()
            else:
                switch.SwitchOFF()

    def GetInfo(self):
        for switch in self.SwitchDependencyList:
            switch.GetInfo()


sw1 = Switch()
sw2 = Switch()
SwitcherModule = Switcher([sw1, sw2])
SwitcherModule.SwitchByIndex(1)
SwitcherModule.GetInfo()
...