停止wxPython循环

时间:2019-06-15 02:46:36

标签: python wxpython

我一直在尝试停止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 个答案:

答案 0 :(得分:1)

阅读萨克森州罗尔夫(Rolf of Saxony)的答案后,我意识到我自己的答案仅涵盖了该问题的一半。所以这是更新的答案。

更新的答案

我猜在问题末尾的短语“ 我希望程序在问题之后继续”,是指以下事实:给出的代码在两个{之后没有显示任何窗口{1}}显示并关闭。

在这种情况下,在显示并关闭两个wx.TextEntryDialog之后,程序确实确实继续运行。即使两个wx.TextEntryDialog之后都没有显示任何内容,您也可以在终端中看到终端提示不返回,因此程序仍在运行。

此行为的原因有两个。

1.-使用完两个wx.TextEntryDialog之后,您什么都没有显示了。因此,该程序的主循环保持运行状态,但没有任何显示。只需将代码中的main方法更改为:

wx.TextEntryDialog

现在,程序的主窗口显示在两个def main() : app = wx.App() frame = varMenu(None, title = 'How would you like to edit your video?') frame.Show() app.MainLoop() 之后,但是如果您关闭主窗口,则终端提示符不会返回,表示您的程序仍在运行。

2.-此处的问题是,您正在创建wx.TextEntryDialog的实例,然后使用wx.TextEntryDialog显示该实例,但是在使用完该实例后并没有销毁该实例。根据wxPython的ShowModal()文档:

  

此函数创建一个优先级高的临时事件循环   在应用程序的主事件循环中(请参阅wx.EventLoopBase),   取消对话框后会销毁

对于某些ShowModal(),关闭窗口或按OK(是/否/取消)足以破坏临时事件循环。对于其他用户,您需要调用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() 的使用并关闭主窗口时,没有松散的临时事件循环,该程序实际上停止运行。

原始答案:

欢迎使用StackOverflow

程序的主循环继续。您可以在终端中看到在显示所有对话框之后终端提示不返回,因为主循环一直在运行。问题在于您除了对话框外没有显示其他任何内容。

只需将wx.TextEntryDialog方法更改为:

main

,您将在对话框后看到主窗口。

答案 1 :(得分:0)

您都没有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()