Python и GTK3 - лучший способ установить кнопку, нажимаемую вручную? - PullRequest
0 голосов
/ 24 октября 2019

Я искал, но не могу найти хорошее объяснение того, как это сделать.

Я создал физическое MIDI (последовательное) консоль, чтобы управлять графическим интерфейсом, который я пишу на python2.7 (2.7из-за библиотеки ..) и Gtk3. Я могу управлять масштабами и кнопками переключения, но я не знаю, как установить нажатую кнопку и выдать соответствующий сигнал.

Я понимаю, что должен создать свою собственную «копию» сигнала и затем выдать ее, но я не понимаю, как это написать.

1 Ответ

0 голосов
/ 27 октября 2019

Извините, вы действительно должны конвертировать в Python3. Если я не ошибаюсь, в конце этого года поддержка 2.x прекращается.

Чтобы «активировать» тумблер, используйте метод set_active:

tbtn = Gtk.ToggleButton("I'm toggleable")
tbtn.set_active(True)

Об изменениях, он активирует сигнал toggled для кнопки. Выполните tbtn.get_active() вызов, чтобы узнать его состояние.

Кстати, если вы хотите убедиться, что toggled запущен, вы можете сначала проверить его состояние (до .set_active).

(Измените заглавные буквы Gtk на те, которые соответствуют тому, какой Python вы используете. Я использую интроспекцию и Gtk3)

EDIT:

Приведенный ниже код принимает ToggleButton и превращает его вобычная кнопка (более или менее), путем подкласса ее и удаления оригинальной обработки. Как таковой, он не испускает переключенный сигнал, но это не будет слишком сложно добавить.

Верхняя кнопка (btn1) - обычная кнопка, активирующая нижнюю.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#  test_button_press.py
#
#  Copyright 2019 John Coppens <john@jcoppens.com>
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#  MA 02110-1301, USA.
#
#


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

class My_button(Gtk.ToggleButton):
    def __init__(self, **kwargs):
        super(My_button, self).__init__(**kwargs)

        self.connect("button_press_event", self.on_btn2_press)
        self.connect("button_release_event", self.on_btn2_released)

    def on_btn2_press(self, btn, event):
        self.pressed2_at = event.time
        btn.set_active(True)
        return True

    def on_btn2_released(self, btn, event):
        print("Release2 after", event.time - self.pressed2_at)
        btn.set_active(False)
        return True


class MainWindow(Gtk.Window):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.connect("destroy", lambda x: Gtk.main_quit())

        self.btn1 = Gtk.Button("Button1")
        self.btn1.connect("clicked", self.on_btn1_clicked)

        self.btn2 = My_button(label = "Victim")

        self.vbox = Gtk.VBox(spacing = 4)
        self.vbox.pack_start(self.btn1, False, False, 0)
        self.vbox.pack_start(self.btn2, False, False, 0)

        self.add(self.vbox)
        self.show_all()


    def on_btn1_clicked(self, btn):
        self.btn2.set_active(True)


    def run(self):
        Gtk.main()


def main(args):
    mainwdw = MainWindow()
    mainwdw.run()

    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))
...