当前位置: 首页 > 知识库问答 >
问题:

使用类时如何停止Tkinter程序

戴高远
2023-03-14

我正在使用python创建一个控制Tkinter窗口的类对象。我的代码如下所示:

class MyGui:
    
    def __init__(self):
        
        self.root = tk.Tk()
        self.root.title("My Gui")
        
        return
    
    def makeButton(self, text, on_click_function, should_pack = True):
        """ Makes a button widget """
        
        button = tk.Button(self.root, text=text, command=on_click_function)
    
        if should_pack:
            button.pack()
    
        return button
    
    def start(self):
        
        self.root.mainloop()
        
    def stop(self):
        
        self.root.destroy()
        

我希望能够启动一个类的实例,然后像这样停止它:

a = MyGui()
a.makeButton('STOP', a.stop)
a.start()
... // OTHER CODE HERE EVENTUALLY // ...

一切正常,窗口在start()上成功创建,单击按钮并执行stop()时窗口消失。问题是主循环继续运行。我必须使用Ctrl C手动杀死程序,它显示它在self被杀死。蒂克。主回路(n)

如果我只是在一个普通的文件中而不是在一个类中执行所有tkinter代码,那么一切都是一样的,但是当我在root上调用destroy时,mainloop也会停止,程序结束。然而,如果我把它放在一个类中,尽管窗口被破坏,mainloop也不会停止。

为什么?我怎样才能让它停止主循环呢?(我可以通过调用sys.exit停止整个程序,但我想在通过按键调用stop后继续执行非Gui内容)。

共有1个答案

广晔
2023-03-14

我想如果我把self放进去,我就能解决这个问题。根退出()。根destroy()stop()函数中一起使用,但如果我单独使用它们,则不能使用(仅使用destroy关闭窗口,但使主循环保持运行;仅使用quit取消主循环,但使窗口保持打开状态,并且在尝试手动关闭时会导致崩溃)。

因此,类函数实际上需要如下所示:

def stop(self):
    
    self.root.quit()
    self.root.destroy()
 类似资料:
  • 我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。

  • 问题内容: 我在停止“供稿”时遇到问题;cancel参数似乎对after方法没有任何影响。尽管“进纸停止”已打印到控制台。 我尝试使用一个按钮将启动供稿,而另一个按钮将停止供稿。 随着输出: 问题答案: 问题是,即使你打电话与停止循环,已经有等待消防挂起的工作。按下停止按钮不会触发新的作业,但是旧的作业仍然存在,并且当它自己调用时,它将传入False,这将导致循环继续。 您需要取消待处理的作业,以

  • 我试图创建一个简单的pythongui(使用Tkinter),其中包含start按钮,在线程中运行while循环,以及停止while循环的stop按钮。 我对停止按钮有问题,它不会停止任何东西,一旦单击开始按钮,就会冻结GUI。 见下面的代码: 知道怎么解决这个问题吗?我肯定这是微不足道的,一定做了成千上万次,但我自己找不到解决办法。 谢谢大卫

  • 我的目标是创建一个简单的计时器程序。它不断更新自己,直到按下停止按钮。然而,我不确定如何停止刻度函数运行,以便定时器在按下停止按钮后保持不变。 这是我目前的代码: 停止函数的可能方法是什么? 任何帮助都将不胜感激!

  • 我通过创建固定数量的线程来使用执行器服务来进行HTTP GET数据检索。 当Tomcat停止时,我们会出现以下错误: 严重:web应用程序[/viewer]似乎已启动名为[ThreadExecutor_51616156]的线程,但未能停止该线程。这很可能会造成内存泄漏。 这是真的吗?在没有这些服务错误的情况下,如何正确停止tomcat。

  • 我用tkinter创建了一个文本框。当按下Ctrl返回时,以下代码将停止创建换行符。 但是,我还想在用户键入Ctrl-Return时调用一个函数。下面调用该函数,但随后创建一个换行: 如果交换第三行和第四行,则没有换行符,但也不会调用该函数。 有没有一种既防止换行符又调用函数的方法?