2010-01-13 4 views
0

Привет, мои друзья StackOverflow. Я делаю учебники wxPython и читаю документацию, пока мне это нравится. Сначала я хотел сделать простое приложение. То, что это приложение будет делать, это отправить команду на микроконтроллер, чтобы включить или выключить реле.wxPython, переменная не обновляется правильно

У меня есть глобальный переменный, чтобы получить COM порта, который будет использоваться (вместо жесткого кодирования COM1 в, например)

Я не могу получить, что переменный будут правильно обновляться. Вот код:

#!/usr/bin/env python 

import wx 
from firmata import * 

# Arduino(port, baudrate=115200) 
#arduino = Arduino(comListenPort) 
#arduino.pin_mode(7, firmata.OUTPUT) 
comListenPort = 'Is not set' 
getComPort = 'Not Set' 

class ArduinoDemo(wx.Frame): 
    def __init__(self, parent, id): 
     # Main window creation 
     wx.Frame.__init__(self, parent, id, 'Demonstration of Firmata', \ 
          size = (300, 200)) 

     # Content 
     mainPanel = wx.Panel(self) 

     # Open Contact button creation 
     relayOpen = wx.Button(mainPanel, label = 'Open Contact', \ 
           pos = (25, 25), size = (120, 60)) 

     # Close Contact button creation 
     relayClosed = wx.Button(mainPanel, label = 'Close Contact', \ 
           pos = (150, 25), size = (120, 60)) 

     # Binds click event from relayOpen to openRelay 
     self.Bind(wx.EVT_BUTTON, self.closeRelay, relayClosed) 
     # Binds click event from relayClose to closeRelay 
     self.Bind(wx.EVT_BUTTON, self.openRelay, relayOpen) 

     # Get correct COM port 
     getComPort = wx.TextEntryDialog(None, 'Enter COM Port', 'COM Port', '') 
     if getComPort.ShowModal() == wx.ID_OK: 
      comListenPort = getComPort.GetValue() 
      # # Debug 
      print getComPort.GetValue() 
      print comListenPort 
      # # /Debug 


    def openRelay(self, event): 
     #arduino.digital_write(7, firmata.HIGH) 
     # # Debug 
     print comListenPort # does not print correctly 
     # # /Debug 

    def closeRelay(self, event): 
     #arduino.digital_write(7, firmata.LOW) 
     # # Debug 
     print getComPort # does not print correctly 
     # # /Debug 


if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    frame = ArduinoDemo(parent = None, id = -1) 
    frame.Show() 
    app.MainLoop() 

Теперь я полагаю, что, имея глобальную переменную для этого будет лучший способ сделать это, но я полностью ищет предложения и указатели во всем. В общем, comListenPort не получает значение моего поля TextEntryDialog. Я знаю, что это самая тупая вещь, которую я пропускаю.

Два отладочных оператора печати getComPort.GetValue() и comListenPort оба печатают правильные данные. Когда я нажимаю кнопку relayOpen или relayClosed, они говорят «не установлено» или «не задано». Я надеюсь, что кто-то может хлопнуть некоторый смысл в меня, я довольно ошеломлен (акцент на DUMB)

Еще раз спасибо

ответ

1

Я думаю, что внутри __init__ Python видит comListenPort как локальной переменной, а не глобальный .. Вы должны объявить его глобальным, прежде чем использовать его:

global comListenPort 
comListenPort = getComPort.GetValue() 

в качестве альтернативы, вы можете сохранить значение в качестве переменной экземпляра ArduinoDemo:

self.comListenPort = getComPort.GetValue() 
+0

Спасибо, это сработало. Так было бы лучше сделать это в __init__ или в ArduinoDemo? – Dan

+0

Вы имеете в виду «глобальное» заявление? Вы должны использовать его внутри каждого метода или функции, которая использует comListenPort, так что это будет внутри __init__. Вот ссылка на язык: http://docs.python.org/reference/simple_stmts.html#the-global-statement – Joril

Смежные вопросы