Остановка цикла wxPython - PullRequest
       9

Остановка цикла wxPython

0 голосов
/ 15 июня 2019

Я пытался остановить цикл в wxPython, и вещи, которые я пробовал, похоже, не работают. Я попытался использовать self.app.ExitMainLoop() и поместить его в функцию __init__, не сработало, попытался вставить его в функцию varGUI, все равно не сработало. Я мог бы сделать это неправильно и просто быть действительно глупым.

Вот проект, над которым я работаю:

class varMenu(wx.Frame) :
    def __init__(self, *args, **kwargs) :
        super(varMenu, self).__init__(*args, **kwargs)

        self.varGUI()

    def varGUI (self) :
        global minVolAns
        global frameRateAns

        minVol = wx.TextEntryDialog(None, "What is the minimum volume of the video?", "Minimum Volume",
                                     "Input Here")
        if minVol.ShowModal()==wx.ID_OK :
            minVolAns=minVol.GetValue()

        frameRate = wx.TextEntryDialog(None, "What framerate would you like?", "Framerate",
                                        "Input Here")
        if frameRate.ShowModal()==wx.ID_OK :
            frameRateAns=frameRate.GetValue()


def main() :
    app = wx.App()
    varMenu(None, title = 'How would you like to edit your video?')
    app.MainLoop()

main()

Для контекста, я хочу, чтобы программа продолжала после вопросов, чтобы я мог использовать переменную для моего автоматического резака.

Спасибо!

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Прочитав ответ Рольфа Саксонского, я понял, что мой собственный ответ покрывает только половину проблемы в вопросе.Итак, вот обновленный ответ.

Обновленный ответ

Я предполагаю фразу в конце вопроса " Я хочупрограмма, продолжаемая после вопросов", относится к тому факту, что приведенный код не показывает никакого окна после того, как два wx.TextEntryDialog показаны и закрыты.

В этом случае программа действительно продолжаетбежать после того, как два wx.TextEntryDialog показаны и закрыты.Даже если после двух wx.TextEntryDialog ничего не отображается, в терминале видно, что подсказка терминала не возвращается, поэтому программа все еще работает.

Причина этого поведения двоякая.

1.- После окончания использования двух wx.TextEntryDialog вы больше ничего не показываете.Таким образом, основной цикл программы продолжает работать, но нечего показывать.Это можно исправить, просто изменив метод main в вашем коде на:

def main() :
    app = wx.App()
    frame = varMenu(None, title = 'How would you like to edit your video?')
    frame.Show()
    app.MainLoop()

Теперь главное окно вашей программы отображается после двух wx.TextEntryDialog, но если вы закроете главное окно, появится окно терминала.не возвращает, что означает, что ваша программа все еще работает.

2.- Проблема здесь в том, что вы создаете экземпляр wx.TextEntryDialog, а затем вы показываете экземпляр с ShowModal(), но не уничтожаетеэкземпляр после окончания его использования.В соответствии с документами wxPython для ShowModal():

эта функция создает временный цикл обработки событий, который имеет приоритет над главным циклом событий приложения (см. Wx.EventLoopBase) и который уничтожается, когда диалоговое окноотклонено

Для некоторых wx.Dialog достаточно закрыть окно или нажать ОК (Да / Нет / Отмена), чтобы разрушить временную петлю событий.Для других вам нужно вызвать метод Destroy(), чтобы добиться этого.Поэтому лучше сделать привычку звонить Destroy() после финиша, используя wx.Dialog.Поэтому ваш код должен быть изменен на:

import wx

class varMenu(wx.Frame) :
    def __init__(self, *args, **kwargs) :
        super(varMenu, self).__init__(*args, **kwargs)

        self.varGUI()

    def varGUI (self) :
        global minVolAns
        global frameRateAns

        minVol = wx.TextEntryDialog(None, "What is the minimum volume of the video?", "Minimum Volume",
                                     "Input Here")
        if minVol.ShowModal()==wx.ID_OK :
            minVolAns=minVol.GetValue()
        minVol.Destroy()

        frameRate = wx.TextEntryDialog(None, "What framerate would you like?", "Framerate",
                                        "Input Here")
        if frameRate.ShowModal()==wx.ID_OK :
            frameRateAns=frameRate.GetValue()
        frameRate.Destroy()


def main() :
    app = wx.App()
    frame = varMenu(None, title = 'How would you like to edit your video?')
    frame.Show()
    app.MainLoop()

main()

Теперь, когда вы закончите использовать два wx.TextEntryDialog и закроете главное окно, не будет свободного временного цикла обработки событий, и программа фактически прекратит работу.

Оригинальный ответ:

Добро пожаловать в StackOverflow

Основной цикл вашей программы продолжается.В терминале видно, что подсказка терминала не возвращается после того, как все диалоговые окна показаны, потому что основной цикл продолжает работать.Проблема в том, что вы не показываете ничего, кроме диалогов.

Просто измените метод main на:

def main() :
    app = wx.App()
    frame = varMenu(None, title = 'How would you like to edit your video?')
    frame.Show()
    app.MainLoop()

, и вы увидите главное окно после диалогов.

0 голосов
/ 15 июня 2019

Вам не удалось Destroy оба ваших диалога, поэтому программа не закрывается.
Попробуйте это:

import wx

class varMenu(wx.Frame) :
    def __init__(self, *args, **kwargs) :
        super(varMenu, self).__init__(*args, **kwargs)

        self.panel = wx.Panel(self)
        self.textCtrl = wx.TextCtrl(self.panel, -1, value="Your Main Screen")
        self.minVolAns = wx.TextCtrl(self.panel, -1, value="")
        self.frameRateAns = wx.TextCtrl(self.panel, -1, value="")
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.textCtrl,0,wx.EXPAND)
        sizer.Add(self.minVolAns)
        sizer.Add(self.frameRateAns)
        self.panel.SetSizer(sizer)
        self.varGUI()
        self.Show()

    def varGUI(self):
        minVol = wx.TextEntryDialog(None, "What is the minimum volume of the video?", "Minimum Volume","")
        if minVol.ShowModal() == wx.ID_OK :
            self.minVolAns.SetValue(minVol.GetValue())
        minVol.Destroy()

        frameRate = wx.TextEntryDialog(None, "What framerate would you like?", "Framerate","")
        if frameRate.ShowModal() == wx.ID_OK :
            self.frameRateAns.SetValue(frameRate.GetValue())
        frameRate.Destroy()

if __name__ == "__main__":
    app = wx.App()
    frame = varMenu(None, title = 'How would you like to edit your video?')
    app.MainLoop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...