2

ボタンが押されている間にコードを繰り返し実行する Gtk.Button のイベントはありますか?

Python 3 で記述され、PyGObject を使用する次のコードがあるとします。ユーザーがボタンの上でマウスの左ボタンを押している間 (クリックして押したままにしている間)、「こんにちは」というメッセージを画面に繰り返し表示したいと思います。

クリックやその他の解決策の代わりに使用できる他のイベントはありますか? ありがとう。

from gi.repository import Gtk

class Window(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.button = Gtk.Button("Hi Printer")
        self.button.connect("clicked", self.on_button_clicked)
        self.add(self.button)
        self.connect("delete-event", Gtk.main_quit)
    def on_button_clicked(self, widget):
        print("Hi")

window = Window()
window.show_all()
Gtk.main()
4

2 に答える 2

1
from gi.repository import Gtk, GObject

class Window(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.button = Gtk.Button("Hi Printer")
        self.button.connect("pressed", self.on_button_clicked)
        self.button.connect("released", self.on_button_released)
        self.add(self.button)
        self.connect("delete-event", Gtk.main_quit)

    def on_button_clicked(self, widget):
        # arm repeater
        self._repeat = True
        # trigger printing
        self.print_hi()

    def on_button_released(self, widget):
        # disarm repeater
        self._repeat = False

    def print_hi(self):
        print 'hi'
        # tune timeout for repeat rate
        timeout = 50
        # if should still be repeating
        if self._repeat:
            # arm timer, with call back to this function
            GObject.timeout_add(timeout, self.print_hi)

window = Window()
window.show_all()
Gtk.main()

前の問題は、ボタンの「クリック」が上下、「押された」が下、「離された」が上です。

また、正しいタイマーを使用するように更新されました。

gtk のタイムアウト機能は自動的に再設定できることが判明したため、これはさらに簡単に行うことができます。

from gi.repository import Gtk, GObject


class Window(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.button = Gtk.Button("Hi Printer")
        self.button.connect("pressed", self.on_button_clicked)
        self.button.connect("released", self.on_button_released)
        self.add(self.button)
        self.connect("delete-event", Gtk.main_quit)

    def on_button_clicked(self, widget):
        # arm repeater
        self._repeat = True
        # kick off time out
        timeout = 50
        GObject.timeout_add(timeout, self.print_hi)

    def on_button_released(self, widget):
        # disarm repeater
        self._repeat = False

    def print_hi(self):
        print 'hi'
        # if should still be repeating
        return self._repeat

window = Window()
window.show_all()
Gtk.main()

于 2013-10-17T23:39:05.980 に答える