2010-01-13 7 views
0

Bonjour mes amis StackOverflow. J'ai fait des tutoriels wxPython et lu la documentation, jusqu'à présent je l'aime bien. Je voulais d'abord faire une application simple. Ce que cette application ferait est d'envoyer une commande à un micro-contrôleur pour activer ou désactiver un relais.wxPython, variable ne pas mettre à jour correctement

J'ai une variable globale pour obtenir le port COM à utiliser (Au lieu de hardcoding COM1 par exemple)

Je ne peux pas obtenir cette variable à être mis à jour correctement. Voici le code:

#!/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() 

Maintenant, je suppose que d'avoir une variable globale pour ce serait la meilleure façon de le faire, mais je suis à la recherche tout à fait des suggestions et des pointeurs dans tout. À ce point, comListenPort ne reçoit pas la valeur de ma boîte TextEntryDialog. Je sais que cela doit être la chose la plus stupide que je néglige.

Les deux instructions d'impression de débogage getComPort.GetValue() et comListenPort impriment toutes deux les données correctes. Lorsque je clique sur le bouton relayOpen ou relayClosed, ils disent «n'est pas défini» ou «non défini». J'espère que quelqu'un peut frapper un certain sens en moi, je suis assez abasourdi (l'accent sur DUMB)

Merci encore

Répondre

1

Je pense que l'intérieur __init__ Python voit comListenPort comme une variable locale , pas global .. Vous devriez déclariez mondiale avant de l'utiliser:

global comListenPort 
comListenPort = getComPort.GetValue() 

Sinon, vous pouvez stocker la valeur comme une variable d'instance de ArduinoDemo:

self.comListenPort = getComPort.GetValue() 
+0

Merci, cela a fonctionné. Serait-il préférable de le faire dans __init__ ou dans ArduinoDemo? – Dan

+0

Voulez-vous dire la déclaration "globale"? Vous devriez l'utiliser à l'intérieur de chaque méthode ou fonction qui utilise comListenPort, donc cela se trouverait dans __init__. Voici la référence du langage: http://docs.python.org/reference/simple_stmts.html#the-global-statement – Joril

Questions connexes