2016-10-13 16 views
1

私はいくつかのリストに基づいてクイックパネルを生成し、ユーザーがアイテムを選択するのを待ってから、その値に基づいてアクションを実行する単純なプラグインを作成しようとしています選択された。基本的に、私は次の操作を行いたいのですが:サブライム3プラグインクイックパネルリターンバルブを格納する

class ExampleCommand(sublime_plugin.TextCommand): 
    def __init__(self): 
     self._return_val = None 
     self._list = ['a', 'b', 'c'] 
    def callback(self, idx) 
     self._return_val = self._list[idx] 
    def run(self): 
     sublime.active_window().show_quick_panel(
      options, self.callback) 
     if self._return_val == 'a' 
      // do something 

しかし、何も前show_quick_panelリターンが選択されているので、self._return_valは、if文の実行後まで、選択したインデックスに割り当てられません。

どうすればこの問題を解決できますか?イベントリスナーとは?私はPythonとSublimeプラグインの開発にはとても新しいです。

答えて

0

クイックパネルを表示すると、明らかにプログラムの実行がブロックされません。私は継続を作成して通過することをお勧めします:それはrun()方法の残りを実行している間に実行が終了されるように

import sublime 
import sublime_plugin 


class ExampleQuickpanelCommand(sublime_plugin.WindowCommand): 
    def run(self): 
     # create your items 
     items = ["a", "b", "c"] 

     def on_select(index): 
      if index == -1: # canceled 
       return 
      item = items[index] 
      # process the selected item... 
      sublime.error_message("You selected '{0}'".format(item)) 

     self.window.show_quick_panel(items, on_select) 
+0

内部関数( 'run()'の中で 'on_select()を定義する)はPythonでは時に便利ですが、この場合コールバックを定義する理由はありません。[このページ](https://realpython.com/blog/python/inner-functions-what-are-they-good-for/)では、内部関数をいつ、そしていつ、なぜ使うべきかについて非常によく説明しています。 Gerard Rocheの答えには、基本的な 'show_quick_panel()'と 'EnableColorSchemeCommand'クラスをリンクするページの' text' *の例があります。 – mattst

+1

@mattstフィードバックとリンクをありがとう。私が同意している間、彼の答えは有用で正しいです(彼が既にそこにいた場合は私の答えを追加しませんでした)。私は、引数を渡す方法が間違っている可能性があることを指摘しなければなりません。 'WindowCommand'または' ApplicationCommand' *と*を使用してフラグ 'sublime.KEEP_OPEN_ON_FOCUS_LOST'を設定すると、同時に2つのクイックパネルを開くことができます。同じウィンドウにある場合は、最初のアイテムを開くと上のアイテムが上書きされます。これはTextCommandや内部関数/クロージャーやフラグなしでは起こりません。 –

+0

この問題は再現できません[コード参照](https://gist.github.com/mattst/1a7a194a76dd8e4f34b86cd3c3ff048c)。私はバグが修正されていると思います。今すぐ 'KEEP_OPEN_ON_FOCUS_LOST'でクイックパネルが作成され、同じビュー(または同じグループ内の別のビュー)で別のクイックパネルを開こうとすると、 'クイックパネルが利用できません'というコンソールメッセージと元のクイックパネルパネルは必要に応じて動作し続けます。別のグループで追加のクイックパネルを開くことができます。その場合はすべて表示され、すべてが正しく動作します。使用方法:ST 3126 – mattst

1

show_quick_panel()は、非同期です。選択後のアクションは、コールバックで実行する必要があります。コールバックは、ユーザがクイックパネルからアイテムを選択するか、またはそのアイテムを閉じると呼び出されます。

まず、あなたがTextCommandそうrun()メソッドのシグネチャがあるrun(edit, <args>)を使用している、それはedit引数が必要です。

また、ユーザーが何も選択しない場合(クイックパネルを閉じるなど)、コールバックには-1というインデックスが付けられます。ユーザーがを押すと、エスケープが表示されます。ここで

show_quick_panel APIです:

show_quick_panel(items, on_done, <flags>, <selected_index>, <on_highlighted>)

は、リスト内の項目を選択するには、迅速なパネルを表示します。 on_doneが選択された項目のインデックスとともに一度呼び出されます。クイックパネルがキャンセルされた場合、on_doneが呼び出され、引数は-1となります。

itemsは、文字列のリストまたは文字列リストのリストです。後者の場合、クイックパネルの各エントリには複数の行が表示されます。

flagsは、ビット単位のOR sublime.MONOSPACE_FONTsublime.KEEP_OPEN_ON_FOCUS_LOST

on_highlightedであり、与えられた場合には、迅速なパネルでハイライト表示された項目が変更されるたびに呼び出されます。

Sublime Text API Reference

それでは、例のコマンドを手直ししましょう。 show_quick_panel()の使用方法のいくつかの例については

class ExampleCommand(sublime_plugin.TextCommand): 

    def on_done(self, index): 
     if index == -1: 
      # noop; nothing was selected 
      # e.g. the user pressed escape 
      return 

     selected_value = self.items[index] 
     # do something with value 

    def run(self, edit): 
     self.items = ['a', 'b', 'c'] 
     sublime.active_window().show_quick_panel(
      self.items, 
      self.on_done 
     ) 

polyfillパッケージを参照してください。

+1

'def on_done()'行の最後にセミコロンがありません。 – mattst

関連する問題