在Python中按下按钮期间的操作

时间:2015-05-10 16:54:50

标签: python events button pygtk

我是初学者,当它使用Python进行GUI编程时,我猜我的问题有一个简单的解决方案,即使我没有找到使用谷歌,维基,文档,示例搜索的解决方案......

我想要实现的是,只要按下按钮,条目小部件中的值就应该不断增加到最大值。 我已经尝试使用回调来执行“按钮 - 按下事件”事件,但获得与“点击”信号的回调相同的响应。 当连接到“点击”时,应用程序按预期工作,例如,每次点击都会增加值,但是当我使用事件“button-press-event”的连接时,我仍然只能获得每次点击的增量(按下并释放)

我在Python3.2中使用它(在Raspberry Pi 2上)

以下是每次点击的工作代码:

#!/usr/bin/python
from gi.repository import Gtk, Gdk
from time import sleep

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="ST")

        MAX_SPD = 3000

        self.set_default_size(100,100)
        self.set_size_request(100,100)
        self.set_resizable(False)

        spdEntry = Gtk.Entry()
        spdEntry.set_has_frame(True)
        spdEntry.set_text("0")
        spdEntry.connect("activate", self.inputSpd, MAX_SPD)

        start  = Gtk.Button("Start")
        start.connect("clicked", self.clicked_start)
        stop   = Gtk.Button("Stop")
        stop.connect("clicked", self.clicked_stop)
        inc = Gtk.Button("inc")
        inc.connect("clicked", self.pressed_inc, spdEntry, MAX_SPD)

        fixed  = Gtk.Fixed()

        fixed.put(start,    0, 0)
        fixed.put(spdEntry, 0, 40)
        fixed.put(stop,     0, 70)
        fixed.put(inc, 120, 0)

        self.add(fixed)

    def clicked_start(self, widget):
        self.set_title("GO")

    def clicked_stop(self, widget):
        self.set_title("ST")

    def pressed_inc(self, widget, entry, maxSpd):
        speed = int(entry.get_text())
        speed = speed+1
        if speed > maxSpd:
            speed = maxSpd
        entry.set_text(str(speed))

    def inputSpd(self, entry, maxSpd):
        speed = int(entry.get_text())
        if speed > maxSpd:
            speed = maxSpd
        entry.set_text(str(speed))

win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

这是非工作代码,应该在按下长按钮时递增:

#!/usr/bin/python
from gi.repository import Gtk, Gdk
from time import sleep

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="ST")

        MAX_SPD = 3000

        self.set_default_size(100,100)
        self.set_size_request(100,100)
        self.set_resizable(False)

        spdEntry = Gtk.Entry()
        spdEntry.set_has_frame(True)
        spdEntry.set_text("0")
        spdEntry.connect("activate", self.inputSpd, MAX_SPD)

        start  = Gtk.Button("Start")
        start.connect("clicked", self.clicked_start)
        stop   = Gtk.Button("Stop")
        stop.connect("clicked", self.clicked_stop)
        inc = Gtk.Button("inc")
        inc.connect("button-press-event", self.pressed_inc, spdEntry, MAX_SPD)
        inc.connect("button-release-event", self.left_inc)

        fixed  = Gtk.Fixed()

        fixed.put(start,    0, 0)
        fixed.put(spdEntry, 0, 40)
        fixed.put(stop,     0, 70)
        fixed.put(inc, 120, 0)

        self.add(fixed)

    def clicked_start(self, widget):
        self.set_title("GO")

    def clicked_stop(self, widget):
        self.set_title("ST")

    def pressed_inc(self, widget, event, entry, maxSpd):
        if event.type == Gdk.EventType.BUTTON_PRESS:
            speed = int(entry.get_text())
            speed = speed+1
            if speed > maxSpd:
                speed = maxSpd
            entry.set_text(str(speed))
            return True

    def left_inc(self, widget, event):
        if event.type == Gdk.EventType.BUTTON_RELEASE:
            return True


    def inputSpd(self, entry, maxSpd):
        speed = int(entry.get_text())
        if speed > maxSpd:
            speed = maxSpd
        entry.set_text(str(speed))

win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

1 个答案:

答案 0 :(得分:1)

您可以使用GLib.timeout_add()执行此操作。但是,我同意gianmt认为最好只使用Gtk.SpinButton

#!/usr/bin/python
from gi.repository import Gtk, Gdk, GLib

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="ST")

        self.MAXSPEED = 3000

        self.set_default_size(100,100)
        self.set_resizable(False)

        self.entry = Gtk.Entry()
        self.entry.set_text("0")

        start = Gtk.Button(label="Start")
        start.connect("clicked", self.clicked_start)
        stop = Gtk.Button(label="Stop")
        stop.connect("clicked", self.clicked_stop)
        inc = Gtk.Button(label="inc")
        inc.connect("button-press-event", self.pressed_inc)
        inc.connect("button-release-event", self.left_inc)

        fixed  = Gtk.Fixed()

        fixed.put(start,      0,   0)
        fixed.put(self.entry, 0,   40)
        fixed.put(stop,       0,   70)
        fixed.put(inc,        120, 0)

        self.add(fixed)

    def clicked_start(self, widget):
        self.set_title("GO")

    def clicked_stop(self, widget):
        self.set_title("ST")

    def pressed_inc(self, widget, event):
        self.inc_id = GLib.timeout_add(100, self.increase)

    def left_inc(self, widget, event,):
        GLib.source_remove(self.inc_id)

    def increase(self):
        speed = int(self.entry.get_text()) + 1
        if speed > self.MAXSPEED:
            self.entry.set_text(str(self.MAXSPEED))
        else:
            self.entry.set_text(str(speed))
        return True


win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

在您的代码之上还有from time import sleep作为导入。它没有被使用,我不知道您的应用程序的其余部分,但使用time.sleep(),而您不在一个线程中,将阻止Gtk.main()循环并使您的应用程序无响应。