首页 > 解决方案 > 防止在 PyGTK SpinButton 中手动输入文本

问题描述

使用 Python 3.8、GTK 3.0,我想防止用户在 a 中手动输入文本Gtk.SpinButton(),同时保留 SpinButton 的+/-/up/down部分功能。这可能吗?

我试过set_editable(False)了,但这会禁用整个小部件,包括向上/向下箭头。

我想也许有一种方法可以访问Gtk.Entry()SpinButton 的部分,并且set_editable(False)只调用那个孩子,但还没有找到它。

编辑:这是一些演示代码

目标是禁用 spin1 的文本输入字段(理想情况下是不敏感的,因此单击时光标不会出现),而 +/- 按钮仍然有效,并且仍然更新值。spin2 & spin3 走得太远,因为即使是 +/- 按钮也不起作用。

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class SpinButtonWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="SpinButton Demo")
        self.set_border_width(10)

        grid = Gtk.Grid()
        grid.set_column_spacing(6)
        grid.set_row_spacing(4)
        self.add(grid)

        adj1 = Gtk.Adjustment()
        adj1.configure(0, 0, 100, 10, 10, 0)
        spin1 = Gtk.SpinButton()
        spin1.set_adjustment(adj1)
        grid.attach(spin1, 0, 0, 1, 1)

        adj2 = Gtk.Adjustment()
        adj2.configure(0, 0, 100, 10, 10, 0)
        spin2 = Gtk.SpinButton()
        spin2.set_adjustment(adj2)
        spin2.set_editable(False)
        grid.attach(spin2, 1, 0, 1, 1)

        adj3 = Gtk.Adjustment()
        adj3.configure(0, 0, 100, 10, 10, 0)
        spin3 = Gtk.SpinButton()
        spin3.set_adjustment(adj3)
        spin3.set_sensitive(False)
        grid.attach(spin3, 2, 0, 1, 1)

        label1 = Gtk.Label(label='Basic Spin')
        label1.set_halign(Gtk.Align.CENTER)
        grid.attach(label1, 0, 1, 1, 1)

        label2 = Gtk.Label(label='Editable=False')
        label2.set_halign(Gtk.Align.CENTER)
        grid.attach(label2, 1, 1, 1, 1)

        label3 = Gtk.Label(label='Sensitive=False')
        label3.set_halign(Gtk.Align.CENTER)
        grid.attach(label3, 2, 1, 1, 1)


win = SpinButtonWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

标签: python-3.xpygtk

解决方案


您可以配置spin1为忽略大多数按键。

更改导入:

from gi.repository import Gtk, Gdk

将以下方法添加到SpinButtonWindow类:

def key_handler(self, widget, event):
    key = Gdk.keyval_name(event.keyval)
    if key in ['Up', 'Down', 'Page_Up', 'Page_Down']:
        return widget.im_context_filter_keypress(event)
    # Ignore other keys.
    return True

将此方法连接到微调框:

spin1 = Gtk.SpinButton()
spin1.connect("key-press-event", self.key_handler)

推荐阅读