Python 2.7 Python和GTK3-设置手动按下按钮的最佳方法?

Python 2.7 Python和GTK3-设置手动按下按钮的最佳方法?,python-2.7,signals,gtk3,emit,Python 2.7,Signals,Gtk3,Emit,我已经找过了,但找不到一个很好的解释 我已经构建了一个物理MIDI(串行)控制台,以控制我在python2.7(2.7版由于库的原因)和Gtk3中编写的gui 我可以控制比例和切换按钮,但我不知道如何将按钮设置为按下并发出相对信号 我知道我必须创建自己的信号“副本”,然后发射它,但我不知道如何写入它。对不起,你真的应该转换为Python3。如果我没记错的话,今年年底,对2.x的支持停止了 要“激活”切换按钮,请使用set\u active方法: tbtn = Gtk.ToggleButton("

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

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

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

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

对不起,你真的应该转换为Python3。如果我没记错的话,今年年底,对2.x的支持停止了

要“激活”切换按钮,请使用
set\u active
方法:

tbtn = Gtk.ToggleButton("I'm toggleable")
tbtn.set_active(True)
更改时,它将激活按钮的
切换信号。
执行
tbtn.get_active()
调用以获取其状态

顺便说一下,如果要确保触发了
切换
,您可以 可能要先检查其状态(在
之前。将\u设置为活动状态

(将Gtk大小写更改为与哪个Python对应的大小写。) 您正在使用。我使用内省和Gtk3)

编辑:

下面的代码采用了一个ToggleButton,并使其成为一个普通按钮 (或多或少),将其子类化并删除原始处理。 事实上,它不会发出切换信号,但事实并非如此 太难添加了

顶部按钮(btn1)是一个普通按钮,它激活底部按钮 一个

#/usr/bin/env python
#-*-编码:utf-8-*-
#
#测试按钮按下按钮
#
#约翰·科彭斯版权所有
#
#这个程序是自由软件;您可以重新分发和/或修改它
#它是根据GNU通用公共许可证的条款发布的
自由软件基金会;许可证的第2版,或
#(由您选择)任何更高版本。
#
#这个节目的发布是希望它会有用,
#但无任何保证;甚至没有任何关于
#适销性或适合某一特定目的。见
#有关更多详细信息,请参阅GNU通用公共许可证。
#
#您应该已经收到GNU通用公共许可证的副本
#与此同时,;如果没有,请写信给自由软件
波士顿基金会51楼富兰克林街第五楼
#MA 02110-1301,美国。
#
#
导入gi
gi.require_版本('Gtk','3.0')
gi.require_版本('GooCanvas','2.0')
从gi.repository导入Gtk,GooCanvas
类My_按钮(Gtk.ToggleButton):
定义初始(自我,**kwargs):
超级(我的按钮,自我)。\uuuuu初始化(**kwargs)
自动连接(“按钮按下事件”,自动开启按钮按下)
self.connect(“按钮释放事件”,self.on\u btn2\u释放)
按下按钮时的def(自身、btn、事件):
自按2_at=event.time
btn.set_激活(真)
返回真值
def on_btn2_已释放(自身、btn、事件):
打印(“发布2后”,event.time-self.pressed 2_at)
btn.set\U激活(错误)
返回真值
类主窗口(Gtk.Window):
定义初始化(自):
超级(主窗口,自我)。\uuuu初始化
self.connect(“销毁”,lambda x:Gtk.main_quit())
self.btn1=Gtk.按钮(“按钮n1”)
self.btn1.connect(“单击”,self.on_btn1_单击)
self.btn2=My_按钮(label=“受害者”)
self.vbox=Gtk.vbox(间距=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()
已单击(自身,btn)上的def:
self.btn2.set\u激活(真)
def运行(自):
Gtk.main()
def主(args):
mainwdw=MainWindow()
mainwdw.run()
返回0
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
系统出口(主(系统argv))

如果我的解释不清楚,很抱歉。我对切换按钮没有问题,但是我必须触发一个简单按钮(不是切换…)的“按钮按下”状态,它没有.set_active()方法。关于python2.7,不幸的是,它不依赖于我,而是依赖于HAL python库(LinuxCNC),该库在Python3上不起作用。我想感谢您给我的示例,以及使用set_active()方法将切换按钮转换为按钮的提示。它完全满足了我的需要。关于您的示例的一个问题:在创建my_Button的实例后,我需要重用Button_press_事件和Button_release_事件,但事件在类中读取后不会传播。有没有办法让信号再次被读取?这应该是可能的-毕竟,按钮仍然会对按下和释放做出响应。您可能需要自己定义一个
connect
方法。我今天几乎没有时间——也许明天我可以测试一下这个想法。
#!/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))