【问题标题】:Python and GTK3 - best way to set a button pressed manually?Python和GTK3 - 手动设置按钮的最佳方式?
【发布时间】:2019-10-24 08:46:01
【问题描述】:

我已经搜索过,但找不到一个很好的解释。

我已经构建了一个物理 MIDI(串行)控制台,以控制我在 python2.7(2.7 由于库..)和 Gtk3 中编写的 gui。

我可以控制刻度和切换按钮,但我不知道如何将按钮设置为按下并发出相关信号。

我知道我必须创建自己的信号“副本”然后发出它,但我不明白如何编写它。

【问题讨论】:

    标签: python-2.7 signals gtk3 emit


    【解决方案1】:

    抱歉,您真的应该转换为 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)

    编辑:

    下面的代码采用一个 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))
    

    【讨论】:

    • 对不起,如果我的解释不清楚。我对切换按钮没有问题,但我必须触发一个简单按钮(不是切换..)的“按钮按下”状态,它没有 .set_active() 方法。关于python2.7,不幸的是它不依赖于我,而是依赖于在python 3上不起作用的HAL python库(LinuxCNC)。
    • 我要感谢您提供的示例,以及使用 set_active() 方法将 Toggle 按钮转换为 Push 按钮的提示。它完全符合我的需求。
    • 关于您的示例的一个问题:创建 My_Button 的实例后,我需要重用 button_press_event 和 button_release_event,但事件在类中读取后不会传播。有没有办法让信号被再次读取?
    • 这应该是可能的 - 毕竟,按钮仍然响应按下和释放。您可能必须自己定义一个connect 方法。我今天没有时间 - 也许我明天就可以测试这个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2014-03-25
    • 2014-04-06
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多