wxPython,变量未正确更新

时间:2010-01-13 07:37:22

标签: events wxpython reference

Hello 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 个答案:

答案 0 :(得分:1)

我认为在__init__中,Python将comListenPort视为本地变量,而非全局..您应该在使用之前将其声明为全局:

global comListenPort
comListenPort = getComPort.GetValue()

或者,您可以将值存储为ArduinoDemo的实例变量:

self.comListenPort = getComPort.GetValue()