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)
再次感谢
答案 0 :(得分:1)
我认为在__init__中,Python将comListenPort视为本地变量,而非全局..您应该在使用之前将其声明为全局:
global comListenPort
comListenPort = getComPort.GetValue()
或者,您可以将值存储为ArduinoDemo的实例变量:
self.comListenPort = getComPort.GetValue()