python - 我无法将数据从线程传递到 GUI JLabel
问题描述
如果名称== '主要':
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 导入 callSwing
定义填充交换率():
rate = fetchExchangeRate('USD', 'EUR')
callSwing(rateField.setValue, rate)
问题:方法 pollUpdate(self, address)
我找不到 callSwing() 找到我的 GUI JLabel [pollText] 的正确方法我收到以下错误消息。
线程 Thread-1 中的异常:Traceback(最近一次调用最后一次):文件“C:\jython2.7.0\Lib\threading.py”,第 222 行,在 _Thread__bootstrap self.run() 文件“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
解决方案
我找到了一个更好的示例来遵循并重写代码以使用 java 类 SwingWorker。一切都很好!
推荐阅读
- excel - 如何使用 VBA 复制使用 VBA 打开的 Excel 工作簿的文件名,并将其用于当前工作簿的另存为功能?
- html - 在 html 页面中写一个缩进文本
- java - Android 应用在发布到应用商店后对所有设备抛出 UnsatisfiedLinkError
- python - python将元组列表转换为复合键字典
- mysql - 使用 SQL 和多个条件进行数学运算
- python - 如何在具有单值和逗号分隔值的熊猫数据框列中选择具有单值的行?
- c++ - 是否有注册表值来获取 Edge 浏览器的用户数据位置?
- javascript - 如何使用 google recaptcha v2 验证 html 和 node.js 应用程序中的表单提交
- python - 如何记录子类的实例化参数
- sql - 从 sqlplus 输出 json。格式化它,使其出现在一行上