Как объявить глобальную переменную в классе? - PullRequest
1 голос
/ 04 октября 2019

Я новичок в python и пытаюсь написать программу, которая подключается к Arduino через выбранный COM-порт и постоянно обновляет статус (подключен или отключен)

Я использую таймерэто обновление каждую 1 секунду. Проблема здесь в том, что каждый раз, когда я запускаю код, он говорит, что Ser в Ontimer не определено, хотя я объявил это ранее в on_press. Как я могу это исправить?

class GuiFrame(wx.Frame):
    def __init__(self,parent,title):
        super().__init__(parent, title = title, size =(950,550))
        self.InitUI()

    def InitUI(self):
        panel = wx.Panel(self)

        self.timer = wx.Timer(self, 1)
        self.timer.Start(100)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)

        st1 = wx.StaticText(panel, label='COM port: ', pos=(5, 5))

        self.text_ctrl = wx.TextCtrl(panel, pos=(5, 30))

        my_btn = wx.Button(panel, label='Enter', pos=(5, 65))
        my_btn.Bind(wx.EVT_BUTTON, self.on_press)

        self.sb = self.CreateStatusBar()

    def on_press(self,event):
        global Ser
        com = self.text_ctrl.GetValue()
        if not com:
            print("Please enter port!")
        else:
            Ser = SerialCom(com,115200)
            self.sb.SetStatusText(Ser.connect())
            time.sleep(1)

    def OnTimer(self, event):
        global Ser
        self.sb.SetStatusText(Ser.status())

1 Ответ

0 голосов
/ 04 октября 2019

[...] как я могу убедиться, что Ser всегда определен?

Инициировать переменную Ser в глобальном пространстве имен с помощью None:

Ser = None

Проверьте значение Ser != None до того, как оно будет прочитано:

class GuiFrame(wx.Frame):

    def on_press(self,event):
        global Ser
        com = self.text_ctrl.GetValue()
        if not com:
            print("Please enter port!")
        else:
            Ser = SerialCom(com,115200)
            self.sb.SetStatusText(Ser.connect())
            time.sleep(1)

    def OnTimer(self, event):
        if Set != None:
            self.sb.SetStatusText(Ser.status())

Обратите внимание, что если переменную только пытаются прочитать, то оператор global не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...