2012-01-22 50 views
1

私は現在GUIを構築しています。リストボックスを使用しています。ユーザはリストボックス内の項目をダブルクリックし、選択した項目をコードに渡します。 。これはうまくいきますが、問題は、DoubleClickイベントを単一のリストボックスにリンクすることができないということです。識別子を追加しようとするたびにエラーが発生し、プログラムは実行されません。WxPythonは、ダブルクリックイベントを特定のリストボックスにリンクしています。すべて反対です

なし識別子ですとが、動作するコードは次のとおりです。

serverlistbox=wx.ListBox(panel1, -1, (300,80), (180,180), serverfilelist, wx.LB_SINGLE) 
serverlistbox.SetSelection(0) 

self.Bind(wx.EVT_LISTBOX_DCLICK, self.doubleclick) 

とデータを処理する関数:

def doubleclick(self,event): 
    index = event.GetSelection() 
    downloadselect = serverfilelist[index] 
    wx.MessageBox('Starting download of ' +str(serverfilelist[index])) 

だから、EVTは重要なビットです、私はそれをリンクしたいですすべての私のリストボックスに反対して、serverlistボックスに。 Iveは試みました:

self.Bind(wx.EVT_LISTBOX_DCLICK, self.doubleclick, self.serverlistbox) 
self.Bind(wx.EVT_LISTBOX_DCLICK, self.serverlistbox, self.doubleclick) 
self.Bind(wx.EVT_LISTBOX_DCLICK, -1, self.doubleclick) 

上記のすべてが失敗します。助けてください!!!

+0

これを知らずにデバッグすることは困難です。何が「自己」なのかなど、あるいはトレースバックを見ている。 **最小**の実例を投稿できますか? – tom10

答えて

1

あなたの最初のオプションは動作するはずです:

self.Bind(wx.EVT_LISTBOX_DCLICK, self.doubleclick, self.serverlistbox) 

あなたはコードを作る失敗するいくつかの問題を持っている:あなたはdoubleclick方法でserverfilelistをインデックスしています。ただし、メソッド内でそのリストにアクセスすることはできません。

self.serverlistbox = wx.ListBox(panel1, .... 

次にイベントを使用しない方法で直接self.serverlistbox.GetSelectionを呼び出すことができます:あなたはクラスの属性としてserverlistboxをインスタンス化した場合も

self.serverfilelist = serverfilelist 
self.serverlistbox = wx.ListBox(panel1, -1, (300,80), (180,180), self.serverfilelist, wx.LB_SINGLE) 
self.serverlistbox.SetSelection(0) 

self.Bind(wx.EVT_LISTBOX_DCLICK, self.doubleclick, self.serverlistbox) 

def doubleclick(self, event): 
    index = event.GetSelection() 
    downloadselect = self.serverfilelist[index] 
    wx.MessageBox('Starting download of %s' % str(downloadselect) 

:おそらくあなたは次のような何かを行う必要があります。

は私がしかしの使用をお勧めします:次に

downloadselect = self.serverlistbox.GetStringSelection() 

を、あなたの方法は次のように単純化されます。

def doubleclick(self, event): 
    downloadselect = self.serverlistbox.GetStringSelection() 
    wx.MessageBox('Starting download of %s' % downloadselect 
0

リストボックスにバインドできますか(self)ような何か:

self.serverlistbox.Bind(wx.EVT_LISTBOX_DCLICK, self.doubleclick) 

(これはあなたがやりたいしない場合は、より多くの情報が特にまだ実行されますが、エラーが表示されていることをトレースバックし、可能なコードの最小の作品を掲載、参考になる。)

0

以前の記事は、ソリューションにご案内が、その可能性他のいくつかのポイントがあるかもしれません何が問題になるのかを明確にする。

wxイベントは、Pythonオブジェクトの階層によって処理されます。したがって、イベントタイプがバインドされているが、コーダーがイベントの終了場所を認識していない場合、イベントハンドラーにイベントが送られないことがあります。あなたのライン

self.Bind(wx.EVT_LISTBOX_DCLICK, self.doubleclick, self.serverlistbox) 

では、親ウィジェットがself.serverlistboxのが誰であるかを伝えることはできません。上記の1つの例では、親が「panel1」である。 panel1にEVT_LISTBOX_DCLICKのハンドラがありましたか?そのハンドラはイベントを自分の親に渡しましたか?これを行うにはevent.Skip()を使いましたか?

範囲外のPythonオブジェクトを参照する問題だけでなく、有用なトレースバック/例外を生成しますが、ウィジェットがイベントを取得する問題と、イベントがバインドされたオブジェクトに渡されるかどうかという問題もありますイベントハンドラ。これは最初の記事の後ずっと後に、この問題にお越しの方に役立つ

# 
# http://stackoverflow.com/questions/8960808/wxpython-linking-a-double-click-event-to-specific-list-boxs-opposed-to-all 

import sys 
import wx 

__doc__ = """Usage: 
python.exe doubleclic.py 
python.exe doubleclic.py panel 
python.exe doubleclic.py panel frame 
""" 

def OnDoubleClick_ListBox_Widget_Handler(event): 
    textctrl.AppendText('\nListBox: ' + event.GetString() + '\n') 
    if 'panel' in sys.argv: event.Skip() 

def OnDoubleClick_Panel_Widget_Handler(event): 
    game_selected = listbox.GetStringSelection() 
    textctrl.AppendText('Panel: ' + event.GetString() + '\n') 
    if 'panel' in sys.argv and 'frame' in sys.argv: event.Skip() 

def OnDoubleClick_Frame_Widget_Handler(event): 
    game_selected = listbox.GetStringSelection() 
    textctrl.AppendText('Frame: ' + event.GetString() + '\n') 


if __name__ == "__main__": 
    app = wx.App() 
    frame = wx.Frame(None, title="Demo wx.EVT_LISTBOX_DCLICK event binding and propogation") 
    panel = wx.Panel(frame) 

    listbox = wx.ListBox(panel, choices=['rock', 'paper', 'scissor'], name='ListBox') 
    textctrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_DONTWRAP, name='Wrong Widget') 
    textctrl.AppendText(__doc__) 
    textctrl.AppendText("command line given: \n " + ' '.join(sys.argv) + '\n\n') 

    sizer = wx.BoxSizer(wx.HORIZONTAL) 
    sizer.Add(listbox, 0, wx.EXPAND|wx.ALL) 
    sizer.Add(textctrl, 1, wx.EXPAND|wx.ALL) 
    panel.SetSizer(sizer) 

    listbox.Bind(wx.EVT_LISTBOX_DCLICK, OnDoubleClick_ListBox_Widget_Handler) 
    panel.Bind(wx.EVT_LISTBOX_DCLICK, OnDoubleClick_Panel_Widget_Handler) 
    frame.Bind(wx.EVT_LISTBOX_DCLICK, OnDoubleClick_Frame_Widget_Handler) 

    frame.Show() 
    app.MainLoop() 

希望:ここ

は、Pythonのスコープの問題を取り除くプロパゲーション/当然の有界イベントハンドラを表示することができます例です。