2010-08-04 7 views
6

मेरे पास एक पैनल है जिसमें कई छवियां हैं, जिनमें से प्रत्येक एक ही ईवेंट हैंडलर से जुड़ी है। मैं कैसे निर्धारित कर सकता हूं कि इवेंट हैंडलर से कौन सी छवि क्लिक की जा रही है? मैंने Event.GetEventObject() का उपयोग करने का प्रयास किया लेकिन यह उस छवि के बजाय मूल पैनल लौटाता है जिसे क्लिक किया गया था।wxPython: किसी ईवेंट के स्रोत को निर्धारित करने के लिए कैसे करें

यहां कुछ नमूना कोड है:

import math 
import wx 

class MyFrame(wx.Frame): 

    def __init__(self, parent, id=-1,title="",pos=wx.DefaultPosition, 
     size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, 
     name="frame"): 

     wx.Frame.__init__(self,parent,id,title,pos,size,style,name) 

     self.panel = wx.ScrolledWindow(self,wx.ID_ANY) 
     self.panel.SetScrollbars(1,1,1,1) 

     num = 4 
     cols = 3 
     rows = int(math.ceil(num/3.0)) 
     sizer = wx.GridSizer(rows=rows,cols=cols) 

     filenames = [] 
     for i in range(num): 
      filenames.append("img"+str(i)+".png") 
     for fn in filenames: 
      img = wx.Image(fn,wx.BITMAP_TYPE_ANY) 
      img2 = wx.BitmapFromImage(img) 
      img3 = wx.StaticBitmap(self.panel,wx.ID_ANY,img2) 
      sizer.Add(img3) 
      img3.Bind(wx.EVT_LEFT_DCLICK,self.OnDClick) 

     self.panel.SetSizer(sizer) 
     self.Fit() 

    def OnDClick(self, event): 

     print event.GetEventObject() 

if __name__ == "__main__": 

    app = wx.PySimpleApp() 
    frame = MyFrame(None) 
    frame.Show() 
    app.MainLoop() 

उत्तर

1

कॉल GetId() हैंडलर में आपके ईवेंट पर और आईडी यह आपके staticBitmaps की आईडी रिटर्न की तुलना करें। अगर आपको एक उदाहरण की ज़रूरत है तो मुझे बताएं और बीमार मेरा उत्तर

+0

मैंने स्टैटिक बिटमैप कन्स्ट्रक्टर (0 से एन -1) के लिए आईडी तर्क के रूप में काउंटर पास करके ऊपर पोस्ट किए गए कोड पर यह कोशिश की। हालांकि, ईवेंट पर GetId() को कॉल करना हमेशा -202 देता है, किसी कारण से ... – Johnny

+0

अच्छी तरह से आप इसे दो तरीकों से कर सकते हैं, यह आपकी छवियों के लिए पहले से आईडी की एक सूची बनाते हैं (और अपने स्थिर बिटमैप्स को तत्काल करते समय उनका उपयोग करें) बस उनकी तुलना करें ... या अपनी छवि वस्तुओं को एक सूची में रखें, फिर वहां आईडी की तुलना करने के लिए आप उन पर GetId() को कॉल कर सकते हैं, फिर भी यदि आप एक उदाहरण चाहते हैं तो इसे जोड़ें ... इसे अनुसरण करना आसान हो सकता है .. – volting

+0

क्षमा करें मैंने अभी देखा है कि मैं आपकी टिप्पणी को याद करता हूं। यदि आपका हो रहा है -202 इसका मतलब है कि आप कुछ गलत कर रहे हैं .. यदि आप वास्तव में काउंटर का उपयोग कर रहे हैं .. तो आपको उन्हें GetId() के साथ नंबर वापस प्राप्त करना चाहिए -202 की एक आईडी से पता चलता है कि आपका यादृच्छिक आईडी – volting

4

अपने लूप में, प्रत्येक स्टेटिक बिटमैप विजेट को एक अद्वितीय नाम दें। ऐसा करने का एक तरीका ऐसा कुछ होगा:

wx.StaticBitmap(self, wx.ID_ANY, 
       wx.BitmapFromImage(img), 
       name="bitmap%s" % counter) 

और फिर अंत में काउंटर को बढ़ाएं। फिर घटना हैंडलर में, ऐसा कुछ करें:

widget = event.GetEventObject() 
print widget.GetName() 

यह हमेशा मेरे लिए काम करता है।

0

आप GetId() का उपयोग कर सकते हैं, लेकिन यह सुनिश्चित कर लें कि आप इसे अपने कार्यक्रम में अद्वितीय रखें। मैं यह दिखाने के लिए संशोधित कोड पोस्ट कर रहा हूं कि आप इसे कैसे कर सकते हैं। सूची के रूप में फ़ाइल नामों का उपयोग करने के बावजूद।

def __init__(self, parent, id=-1,title="",pos=wx.DefaultPosition, 
    size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, 
    name="frame"): 

    wx.Frame.__init__(self,parent,id,title,pos,size,style,name) 

    self.panel = wx.ScrolledWindow(self,wx.ID_ANY) 
    self.panel.SetScrollbars(1,1,1,1) 

    num = 4 
    cols = 3 
    rows = int(math.ceil(num/3.0)) 
    sizer = wx.GridSizer(rows=rows,cols=cols) 

    #you should use dict and map all id's to image files 
    filenames = [] 

    for i in range(num): 
     filenames.append("img"+str(i)+".png") 
    for imgid,fn in enumerate(filenames): 
     img = wx.Image(fn,wx.BITMAP_TYPE_ANY) 
     img2 = wx.BitmapFromImage(img) 

     #pass the imgid here 

     img3 = wx.StaticBitmap(self.panel,imgid,img2) 
     sizer.Add(img3) 
     img3.Bind(wx.EVT_LEFT_DCLICK,self.OnDClick) 

    self.panel.SetSizer(sizer) 
    self.Fit() 

def OnDClick(self, event): 

    print 'you clicked img%s'%(event.GetId()) 

आप dict का उपयोग करें और आईडी के लिए हर फ़ाइल नाम के नक्शे, इस तरह से आप अपने programe के माध्यम से यह सब पर नज़र रखेंगे द्वारा कर सकते हैं।

संबंधित मुद्दे