首页 > 解决方案 > 我无法将数据从线程传递到 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

标签: pythonmultithreadinguser-interfacejython

解决方案


我找到了一个更好的示例来遵循并重写代码以使用 java 类 SwingWorker。一切都很好!


推荐阅读