Должен ли я создать атрибуты класса, чтобы получить ввод TextCtrl, он может быть локальным? - PullRequest
0 голосов
/ 16 декабря 2018

Вот исходный код, где я создал wx.TextCtrl атрибуты self.tc1, событие привязки работает нормально:

import wx


class Example(wx.Frame):

    def __init__(self, title):
        super().__init__(None, title=title)
        self.panel = wx.Panel(self)
        self.tc1 = None
        self.initUI()

    def initUI(self):
        sizer = wx.GridBagSizer(2, 2)
        self.set_name(sizer)
        self.panel.SetSizer(sizer)
        sizer.Fit(self)

    def set_name(self, sizer):
        text1 = wx.StaticText(self.panel, label="Enter your name:")
        sizer.Add(text1, pos=(0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=10)
        self.tc1 = wx.TextCtrl(self.panel, style=wx.TE_CENTER, value="enter_name_here")
        self.tc1.Bind(wx.EVT_TEXT, self.on_get_text)
        sizer.Add(self.tc1, pos=(0, 1), flag=wx.TOP|wx.RIGHT|wx.BOTTOM|wx.EXPAND, border=5)

    def on_get_text(self, e):
        print(self.tc1.GetValue())


if __name__ == '__main__':
    app = wx.App()
    Example("Example").Show()
    app.MainLoop()

Что если я хочу, чтобы текстовый элемент управления self.tc1 быллокальная переменная для метода self.set_name, потому что я не хочу загрязнять класс слишком многими атрибутами.Для ясности, если я изменю метод self.set_name таким образом, сделав tc1 локальной переменной для этого метода:

def set_name(self, sizer):
    text1 = wx.StaticText(self.panel, label="Enter your name:")
    sizer.Add(text1, pos=(0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=10)
    tc1 = wx.TextCtrl(self.panel, style=wx.TE_CENTER, value="enter_name_here")
    # tc1.Bind(wx.EVT_TEXT, self.on_get_text)
    sizer.Add(tc1, pos=(0, 1), flag=wx.TOP|wx.RIGHT|wx.BOTTOM|wx.EXPAND, border=5)

Как я могу изменить метод Bind для достижения того же самогоэффекты? У меня слишком много виджетов в классе, я действительно не хочу превращать каждый из них в атрибуты класса.

1 Ответ

0 голосов
/ 17 декабря 2018

Событие EVT_TEXT, которое передается обработчику, содержит ссылку на объект, с которым он связан.Чтобы получить этот объект, вызовите GetEventObject ()

def on_get_text(self, event):
    tc1 = event.GetEventObject()
    print(tc1.GetValue())
...