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 - 手动设置按钮的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章