wxPython, переменная не обновляется правильно - PullRequest
0 голосов
/ 13 января 2010

Здравствуйте, мои друзья из StackOverflow. Я делал уроки 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 Ответ

1 голос
/ 13 января 2010

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

global comListenPort
comListenPort = getComPort.GetValue()

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

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