【发布时间】:2021-03-26 09:22:54
【问题描述】:
如果 name == 'main':
demo = DesktopFrame()
demo.setLocation(30, 30)
demo.show()
comm = "COM4"
global comPort
comPort = MyCommPort()
comPort.set_port(comm)
poll = Polling(comPort)
poll.start()
poll.join()
此代码运行(作为 def),我的 GUI 出现并允许我在线程 POLL 从我的串行端口发送和接收数据时从菜单更改帧内容(现在固定测试循环 20 次)
**目标:
我的目标是让线程在通过轮询序列时更新 JLabel(使其更改节点地址)。**
我一直在关注 jthon-swingutils2.1.1 文档
https://pythonhosted.org/jython-swingutils/threads.html -- 从后台线程运行 GUI 代码。
从 swingutils.threads.swing 导入调用Swing
def fillInExchangeRate():
rate = fetchExchangeRate('USD', 'EUR')
callSwing(rateField.setValue, rate)
问题: 方法 pollUpdate(self, address)
我找不到 callSwing() 找到我的 GUI JLabel [pollText] 的正确方法,我收到以下错误消息。
线程 Thread-1 中的异常:Traceback(最近一次调用最后一次): _Thread__bootstrap self.run() 中的文件“C:\jython2.7.0\Lib\threading.py”,第 222 行 文件“C:\Users\jwkel\Documents\NetBeansProjects\JythonProject\src\mycommport.py”,第 95 行,运行 self.xmit_data(self.toOutput)
文件“C:\Users\jwkel\Documents\NetBeansProjects\JythonProject\src\mycommport.py”,第 71 行,在 xmit_data self.pollUpdate("Polling A")
文件“C:\Users\jwkel\Documents\NetBeansProjects\JythonProject\src\mycommport.py”,第 66 行,在 pollUpdate callSwing(pollText.setValue, address) 中
NameError:未定义全局名称“pollText”
现在了解一些关于我的 GUI 的一般信息
演示 = JFrame
self.menubar = JMenuBar() + 5 JMenu() + 15 JMenuItem() // 一切正常
self.add(self.mainPanel, BorderLayout.EAST)
contains:
self.mainPanel = JPanel()
self.mainText = JTextArea()
self.mainScroll = JScrollPane(self.mainText) +
self.mainScroll.getViewport().setView((self.mainText))
self.mainPanel = JPanel() self.mainPanel.add(self.mainScroll)
self.add(self.modePanel, BorderLayout.NORTH)
contains:
self.modePanel = JPanel()
self.modeText = JLabel("Current Mode Setting : Stand Alone")
self.pollText = JLabel("Polling Reader - ?") ******* MY TARGET ********
self.add(self.panel, BorderLayout.WEST)
contains:
self.panel = JPanel()
self.panel.add(JLabel(ImageIcon(self.showImage)))
问题代码
from swingutils.threads.swing import callSwing
class Polling(Thread):
def __init__(self, pollPort):
Thread.__init__(self)
self._pollPort= pollPort
def pollUpdate(self, address):
callSwing(pollText.setValue, address)
def xmit_data(self,sendThis):
'''commands and data sent to readers'''
print 'send this ',sendThis
self.pollUpdate("Polling A")
self._pollPort.outStream.write(sendThis)
time.sleep(0.3)
self._pollPort.outStream.flush()
def recv_data(self):
'''relies and requests from readers'''
print 'recev data'
self.pollUpdate("Polling @")
self.s =''
self.text = ''
for num in range(100):
self.s = self._pollPort.inStream.read()
if self.s == 10:
break
else:
self.text = self.text + chr(self.s)
print 'text = ', self.text
return self.text
def run(self):
for i in range(20):
time.sleep(.100)
self.toOutput="*ATest\n"
self.xmit_data(self.toOutput)
time.sleep(.300)
self.myText = self.recv_data()
print self.myText
【问题讨论】:
-
请修正代码格式 (stackoverflow.com/help/formatting) 并确保提供正确的 minimal reproducible example。
标签: python multithreading user-interface jython