我一直在尝试停止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()
对于上下文,我希望程序在出现问题后继续,以便可以将变量用于自动剪切器。
谢谢!
答案 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()