Почему точки останова не работают в потоке диспетчеризации событий Swing в PyDev? - PullRequest
0 голосов
/ 31 августа 2011

Я использую Jython, Swing и PyDev (Eclipse).

Точки останова не попадают ни в один код, работающий в EDT (он же AWT Event Queue?).

Сюда входят:

  • Функции, которые вызываются из события Swing (например, щелчок JButton)
  • Функции, которые через декоратор запускаются через SwingUtilities.invokeLater() (см. Последний пример здесь .
  • Функции, которые зарегистрированы как ловушки для пакета 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 Ответ

1 голос
/ 01 сентября 2011

На самом деле это проблема Jython.

Т.е.: в приведенном ниже коде при вызове TestFunc должна вызываться печать из trace_dispatch, но это не так.

Итак, реализация трассировки Jython не вызывает функцию трассировки, как следует в этой ситуации. Вы можете «помочь» отладчику PyDev, вызвав import pydevd;pydevd.settrace(suspend=False), чтобы отладчик узнал об этом кадре (т.е. в начале 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
...