Python和GTK3 - 手动设置按钮的最佳方式?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 方法。我今天没有时间 - 也许我明天就可以测试这个想法。

以上是关于Python和GTK3 - 手动设置按钮的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

Python Gtk3从textview获取文本

Python gtk3 窗口监听输入事件

在 Windows 下使用 GTK3 链接按钮

GTK3 在按钮标签中换行

如何在 GTK3 中禁用按钮

根据子类中的 UIButton 大小设置cornerRadius 的最佳位置?