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