尝试失败后,会在运行时弹出多个Tkinter窗口

时间:2017-11-03 03:16:13

标签: python-2.7 tkinter

首先,我在Python,Stackoverflow和一般编程方面都很陌生,所以请原谅我可能做出的任何正式错误,因为我仍在努力掌握许多必需的概念编程协议。

问题在于: 我试图解决我在使用Tkinter时遇到的一个特定的,看似简单的问题:每当我摆弄一些令我困惑的代码时,通常需要多次尝试才能找到一个工作方案。所以我写了一些代码,运行它,得到一个错误,做了一些更改,再次运行它,得到另一个错误,再次更改......等等,直到达到工作结果。

当代码终于工作时,我很遗憾地还会为我执行的每次失败的运行都弹出额外的Tkinter主窗口。因此,如果我在最终实现工作代码之前做了20次更改,则会弹出20个额外的Tkinter窗口。烦人...

现在,我在考虑使用try / except处理异常可能会避免这种情况,但我不确定如何正确地完成此操作。

我一直在寻找解决方案,但似乎无法找到解决此问题的帖子。我其实并不确定如何正确地表达问题......有人对此有一些建议吗?

以下显示了一个简单但却失败的尝试,我试图绕过这个。代码按原样运行,但是如果你在代码中输入一些错误,运行它几次,然后撤消拼写错误并再次运行代码,你将获得多个Tkinter窗口,这就是我所做的。我试图避免。

当然,任何帮助都表示赞赏...... (顺便说一下,我使用Python 2.7.13。)

import Tkinter as tk

class App(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self)
        self.root = parent
        self.canvas = tk.Canvas(self)
        self.canvas.pack(expand=1,fill='both')
        self.bindings()

    def click(self,e):
        print 'clicked'

    def bindings(self):
        self.root.bind('<1>',self.click)

def main():
    root = tk.Tk()
    app = App(root)
    app.pack()
    root.mainloop()

if __name__ == '__main__':
    try:
        main()
    except:
        print 'Run failed...'

1 个答案:

答案 0 :(得分:1)

好的,太好了。问题确实与Tkinter或Python无关,而是与IDE本身无关。谢谢Ethan指出这一点。

PyScripter有几种模式或引擎。我一直在运行带有内部引擎的脚本,这种脚本速度更快但不会在每次运行时重新初始化。我相信这会导致问题。另一方面,远程引擎会在每次运行时重新初始化。这可以避免运行弹出窗口失败。

下面的PyScripter手册中有一个更深入的解释:

  

Python引擎:

     
      
  • 内部
  •   
     

如果出现问题,它比其他选项更快   您正在运行或调试的脚本可能会影响   PyScripter的可靠性并可能导致崩溃。另一个限制   这个引擎是它无法运行或调试GUI脚本也是如此   重新初始化。

     
      
  • 远程
  •   
     

这是PyScripter的默认引擎,是推荐的引擎   对于大多数Python开发任务。它运行在子进程中   使用rpyc与PyScripter通信。它可以用来运行和   调试任何类型的脚本。但是,如果您运行或调试GUI脚本   可能必须在每次运行后重新初始化引擎。

     
      
  • Remote Tk
  •   
     

这个远程Python引擎专门用于运行和调试   Tkinter应用程序包括使用Tkagg后端的pylab。它也是   支持以交互模式运行pylab。引擎激活了一个   Tkinter mainloop并用虚函数替换mainloop   您正在运行或调试的Tkinter脚本不会阻止   发动机。您甚至可以使用。开发和测试Tkinter小部件   交互式控制台。

     
      
  • 远程Wx
  •   
     

这个远程Python引擎专门用于运行和调试   wxPython应用程序包括使用WX和WXAgg后端的pylab。   它还支持在交互模式下运行pylab。引擎   激活wx MainLoop并用假人替换MainLoop   函数,以便您正在运行或调试的wxPython脚本   不阻挡发动机。你甚至可以开发和测试wxPython Frames   和使用交互式控制台的应用程序请注意这个引擎   防止wxPython输出的重定向,因为这会阻止   与Pyscripter的沟通。

     

使用Tk和Wx远程引擎时,您当然可以运行或调试   任何其他非GUI Python脚本。但请记住这些   因此,引擎可能比标准远程引擎稍慢   它们还包含GUI主循环。还要注意这两个引擎   使用虚拟过程覆盖sys.exit函数。