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
Merci, cela a fonctionné. Serait-il préférable de le faire dans __init__ ou dans ArduinoDemo? – Dan
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