Отлаживать приложение pyQT4? - PullRequest
38 голосов
/ 15 ноября 2009

У меня довольно простое приложение, созданное с помощью 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, и я не могу ничего ввести. Есть ли лучший способ сделать это?

Ответы [ 2 ]

77 голосов
/ 17 ноября 2009

Вам нужно позвонить 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, а затем после того, как вы нажмете Enter, и консольный спам происходит, продолжайте нажимать 'c' (для продолжения) до приложение возобновляется правильно. (Мне пришлось по какой-то причине несколько раз нажать «c», он продолжал возвращаться в pdb, но после нескольких нажатий он возобновлялся нормально)

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

2 голосов
/ 18 марта 2014

Мне пришлось использовать команду «next» в точке трассировки, чтобы сначала выйти из этой функции. Для этого я сделал модификацию кода из 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) - Очередь команд для выполнения

...