2009-11-14 4 views
34

У меня довольно простое приложение, построенное с pyqt4. Я хотел отлаживать одну из функций, связанных с одной из кнопок в моем приложении. Тем не менее, когда я делаю следующиеОтладка приложения pyQT4?

python -m pdb app.pyw 
> break app.pyw:55 # This is where the signal handling function starts. 

все работает не так, как я надеюсь. Вместо того, чтобы ломать функцию, где я установил точку останова и позволил мне пройти через нее, отладчик вводит бесконечный цикл печати QCoreApplication::exec: The event loop is already running, и я не могу ничего ввести. Есть лучший способ сделать это?

+0

Просто чтобы узнать, что находится в строке 55? Где вы регистрируете сигнал или это функция, которая его обрабатывает? –

+0

В этом случае это функция, которая обрабатывает сигнал. –

+1

Я думаю, что это не полный ответ, но вы можете попробовать ERIC как GUI-Debugger для Python и PyQt: http://eric-ide.python-projects.org/ – Berschi

ответ

69

Вам необходимо позвонить по телефону QtCore.pyqtRemoveInputHook. Я обернуть его в своей собственной версии set_trace:

def debug_trace(): 
    '''Set a tracepoint in the Python debugger that works with Qt''' 
    from PyQt4.QtCore import pyqtRemoveInputHook 

    # Or for Qt5 
    #from PyQt5.QtCore import pyqtRemoveInputHook 

    from pdb import set_trace 
    pyqtRemoveInputHook() 
    set_trace() 

И когда вы закончите отладку, вы можете вызвать QtCore.pyqtRestoreInputHook(), вероятно, лучше всего, когда вы все еще в PDB, а затем после того, как вы нажмете ввести, и консоль спам , продолжайте нажимать «c» (для продолжения), пока приложение не возобновится правильно. (По какой-то причине мне пришлось ударить «c» несколько раз, он продолжал возвращаться в pdb, но после удара несколько раз он возобновлялся нормально)

Для получения дополнительной информации Google «pyqtRemoveInputHook pdb». (Действительно очевидно, не так ли?; P)

+3

Полезный ответ, только для справки Я обнаружил, что это работал с PyQt4, но не с PySide. –

1

Мне пришлось использовать «следующую» команду в точке трассы, чтобы сначала выйти за пределы этой функции. Для этого я внесли изменения в код из mgrandi:

def pyqt_set_trace(): 
    '''Set a tracepoint in the Python debugger that works with Qt''' 
    from PyQt4.QtCore import pyqtRemoveInputHook 
    import pdb 
    import sys 
    pyqtRemoveInputHook() 
    # set up the debugger 
    debugger = pdb.Pdb() 
    debugger.reset() 
    # custom next to get outside of function scope 
    debugger.do_next(None) # run the next command 
    users_frame = sys._getframe().f_back # frame where the user invoked `pyqt_set_trace()` 
    debugger.interaction(users_frame, None) 

Это сработало для меня. Я нашел решение отсюда: Python (pdb) - Queueing up commands to execute

Смежные вопросы