2011-08-31 37 views
0

我正在使用Jython,Swing和PyDev(Eclipse)。爲什麼PyDev中的Swing Event Dispatch Thread沒有斷點?

在EDT上運行的任何代碼(又名AWT事件隊列?)上都沒有觸發斷點。

這包括:從一個Swing事件(例如JButton的點擊)表示,通過裝飾,通過SwingUtilities.invokeLater()運行

  • 函數調用

    • 功能(參見
    • 最後一個例子here。函數,註冊爲我正在使用的Java包(套接字類)的鉤子

    要重現的Swing事件代碼:

    from javax.swing import JFrame, JButton 
    
    def TestFunc(event): 
        #breakpoints in this function don't work 
        print "Hey" 
    
    if __name__ == '__main__': 
        mainWindow = JFrame('Test', 
             defaultCloseOperation = JFrame.EXIT_ON_CLOSE, 
             size = (1024, 600)) 
        mainWindow.add(JButton("Hey", actionPerformed = TestFunc)) 
        mainWindow.visible = True 
    

    的invokeLater()代碼重現:

    from java.lang import Runnable 
    from javax.swing import SwingUtilities 
    import threading 
    
    class foo(Runnable): 
        def __init__(self, bar): 
         self.bar = bar 
    
        def run(self): 
         #breakpoints in this function don't work 
         print threading.currentThread() 
         print self.bar 
    
    if __name__ == '__main__': 
        myFoo = foo(5) 
        SwingUtilities.invokeLater(myFoo) 
    
  • 回答

    1

    它實際上是一個Jython的問題。

    I.e .:在下面的代碼中,當調用TestFunc時,應該調用trace_dispatch的打印,但事實並非如此。

    因此,Jython跟蹤實現不會像在這種情況下那樣調用跟蹤函數。您可以通過調用import pydevd;pydevd.settrace(suspend=False)來'幫助'PyDev調試器,以便調試器發現該幀(即:在TestFunc的開始部分添加該行代碼)。

    請注意,如果您未通過suspend = False,它將作爲代碼中的斷點並停止該行的執行。

    import sys 
    import threading 
    def trace_dispatch(frame, event, arg): 
        print frame.f_code.co_filename, frame.f_code.co_name 
    sys.settrace(trace_dispatch) 
    threading.settrace(trace_dispatch) 
    
    from javax.swing import JFrame, JButton 
    
    def TestFunc(event): 
        print "Hey" 
    
    if __name__ == '__main__': 
        mainWindow = JFrame('Test', 
             defaultCloseOperation = JFrame.EXIT_ON_CLOSE, 
             size = (1024, 600)) 
        mainWindow.add(JButton("Hey", actionPerformed = TestFunc)) 
        mainWindow.visible = True 
    
    +0

    太棒了,這讓我的生活變得如此簡單!我看到你在2年前提出了這個問題:http://bugs.jython.org/issue1440好東西有一個解決方法! –

    相關問題