سؤال

وأواجه قليلا من المتاعب مع الفريق الذي فقد اثنين من TextCtrls كسبيثون في ذلك. أريد إما EVT_CHAR أو EVT_KEY_UP معالج ملزمة لكلا الضوابط، وأريد أن أكون قادرة على معرفة أي ولدت TextCtrl الحدث. أعتقد أن event.Id أن تقول لي هذا، ولكن في نموذج التعليمات البرمجية التالي انها دائما 0. أي أفكار؟ لقد اختبرت هذا فقط على OS X.

وهذا الرمز ببساطة يتحقق أن كلا TextCtrls ديك بعض النصوص في نفوسهم قبل تمكين الزر تم

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, ID, title):
        wx.Frame.__init__(self, parent, ID, title,
                         wx.DefaultPosition, wx.Size(200, 150))
        self.panel = BaseNameEntryPanel(self)

class BaseNameEntryPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        self.entry = wx.TextCtrl(self, wx.NewId())
        self.entry2 = wx.TextCtrl(self, wx.NewId())

        self.donebtn = wx.Button(self, wx.NewId(), "Done")
        self.donebtn.Disable()

        vsizer = wx.BoxSizer(wx.VERTICAL)

        vsizer.Add(self.entry, 1, wx.EXPAND|wx.GROW)
        vsizer.Add(self.entry2, 1, wx.EXPAND|wx.GROW)
        vsizer.Add(self.donebtn, 1, wx.EXPAND|wx.GROW)
        self.SetSizer(vsizer)
        self.Fit()
        self.entry.Bind(wx.EVT_KEY_UP, self.Handle)
        self.entry2.Bind(wx.EVT_KEY_UP, self.Handle)


    def Handle(self, event):
        keycode = event.GetKeyCode()
        print keycode, event.Id # <- event.Id is always 0!

        def checker(entry):
            return bool(entry.GetValue().strip())

        self.donebtn.Enable(checker(self.entry) and checker(self.entry2))



class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, "Hello from wxPython")
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = MyApp(0)
app.MainLoop()
هل كانت مفيدة؟

المحلول

هل يمكن أن تحاول event.GetId() أو event.GetEventObject() ومعرفة ما إذا كان أي من هذه الأعمال.

وثمة نهج آخر لهذه المشكلة هو استخدام امدا أو functools.partial لتمرير فعال معلمة إلى المعالج. لذلك، على سبيل المثال، ودون في السطور أدناه في البرنامج:

        self.entry.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry))
        self.entry2.Bind(wx.EVT_KEY_UP, functools.partial(self.Handle, ob=self.entry2))

    def Handle(self, event, ob=None):
            print ob

وبعد ذلك اوب سيتم إما entry أو entry2 تبعا التي يتم النقر وحة. ولكن، بطبيعة الحال، هذا لا ينبغي أن يكون من الضروري، وGetId وGetEventObject () يجب العمل على حد سواء - على الرغم من أنني لا (حتى الآن) لديها ماك لمحاولة هذه على

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top