0

私は3つのボタンを持っています。クリックされた各ボタンは、いくつかのジョブを持つポート 58888 にコマンドを送信します。ジョブが完了すると、基本的にその特定のボタンは 5 分後に再度押すことができるようになります。

ボタンをブロックするにはどうすればよいですか?誰かがそのボタンでしばらくフラッディングを生成できないようにするには??

  button = gtk.Button("a")
  button.connect("clicked" , self.on_the_fly("a") , None)
  bbox.add(button)

  button = gtk.Button("v")
  button.connect("clicked" , self.on_the_fly("v") , None)
  bbox.add(button)

  button = gtk.Button("b")
  button.connect("clicked" , self.on_the_fly("b") , None)
  bbox.add(button)

ボタンで使用されるメソッド:

  def on_the_fly(self, input):

    logging.debug(  'Clicked at x={0}, y={0}' )

    try:

      if self.myname.startswith("enduser"):
        logging.debug("reconnect")

      else:

        if input.startswith("a"):

          command = "r0x01"
          client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          client_socket.connect(("localhost", 58888))
          client_socket.send(command)
          client_socket.close()

        elif input.startswith("v"):

          command = "r0x02"
          client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          client_socket.connect(("localhost", 58888))
          client_socket.send(command)
          client_socket.close()

        elif input.startswith("both"):

          command = "r0x03"
          client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          client_socket.connect(("localhost", 58888))
          client_socket.send(command)
          client_socket.close()

        else:

          print "nothing"

        subprocess.Popen(["/var/tmp/runme.sh"], stdout=subprocess.PIPE)

    except Exception, err:
      logging.debug(  err )
      pass
4

1 に答える 1

1

ボタンを「鈍感にする」必要があり (Gtk では、「非アクティブ化」、「無効化」、または「グレーアウト」を意味します)、タイマーを設定して、5 分後にボタンを再感知する必要があります。

これは、文字だけでなく、ボタン自体をコマンド関数に渡す必要があることを意味します。

コマンド関数が既に間違っているため、これを行う方法を示すのは少し難しいです。各呼び出し で呼び出し、ボタンを戻り値 ( ) に接続しています。したがって、プログラムは起動時に 3 回呼び出し、ボタンをクリックするたびに呼び出し可能ではないという例外をログに記録します。あなたが望んでいたのは、次のいずれかです。self.on_the_flyconnectNoneon_the_flyNone

button.connect("clicked", self.on_the_fly, "a")

button.connect("clicked", lambda: self.on_the_fly("a"), None)

したがって、ボタン ウィジェットを渡す方法も次のいずれかです。

button.connect("clicked", self.on_the_fly, ("a", button))

button.connect("clicked", lambda: self.on_the_fly("a", button), None)

次に、on_the_flyメソッドを次のように変更します。

def on_the_fly(self, input, widget):
    logging.debug(  'Clicked at x={0}, y={0}' )
    widget.set_sensitive(False)
    gtk.timeout_add_seconds(5*60, widget.set_sensitive, True)
    # rest of function
于 2013-10-09T22:50:38.723 に答える