Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Вам нужно позвонить 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

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