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

tkinter在从打开的python会话“销毁”时冻结

洪博涛
2023-03-14

问题: tkinter的root.destroy()函数冻结,因为我的程序中的最后一行,code.interact(本地=本地())

背景:我正在终端上运行我的程序。它生成一些文本数据,用这些数据创建一个类的实例,然后将我放在一个python会话中,在那里我可以运行方法并测试所有内容。此解释器会话可通过代码实现。交互(local=locals())

在这里,我运行了一个“编辑”方法,允许用户在tkinter文本框中编辑生成的文本,然后按下按钮保存并退出。该按钮调用一个函数,该函数保存一个新的txt文件,然后使用root。销毁()以结束tkinter主循环。但是,这会冻结,实际上不会关闭窗口。删除代码。最后的interact行并从程序本身(即不是从解释器)调用“edit”方法解决了这个问题。

在我的故障排除中,我发现当从python解释器调用tkinter时,tkinter并不总是发挥良好的作用,而python解释器是code。交互

问题:有没有办法从python解释器中保留tkinter功能?这实际上是我的问题,还是更多地与代码有关。互动

更新:问题似乎与tkinter的主循环与代码一起运行有关。交互自己的循环。两个无限循环相互竞争。删除任何一行似乎都可以解决问题。在这种情况下,mainloop对于我的GUI来说是不必要的,因为它不需要以交互方式更新它的外观。

下面的示例代码(然后从下面的python解释器运行project_instance.edit()

import tkinter as tk
import code

class Project():
    def __init__(self, text):
        self.script = text

    def edit(self):
        root = tk.Tk()
        S = tk.Scrollbar(root)
        T = tk.Text(root, height=60, width=60, undo=True, insertbackground="white", wrap=tk.WORD, font=("Courier", 30), background="black", foreground="grey")
        S.pack(side=tk.RIGHT, fill=tk.Y)
        T.pack(side=tk.LEFT, fill=tk.Y)
        S.config(command=T.yview)
        T.config(yscrollcommand=S.set)
        quote = self.script
        T.insert(tk.END, quote)

        def file_save():
            text2save = str(T.get(1.0, tk.END)).strip() # starts from `1.0`, not `0.0`
            with open("script_text.txt", "w") as s:
                s.write(text2save)
                uri = s.name
            root.destroy()
        b = tk.Button(root, height=5, width=10, font=("Courier", 44), text="Save", command=file_save, background="black", foreground="grey").pack()
        root.mainloop()


sample_text = "This is sample text."
project_instance = Project(sample_text)
code.interact(local=locals())

共有1个答案

景国兴
2023-03-14

更新:问题似乎与tkinter的主循环与代码一起运行有关。交互自己的循环。两个无限循环相互竞争。删除任何一行似乎都可以解决问题。在这种情况下,mainloop对于我的GUI来说是不必要的,因为它不需要以交互方式更新它的外观。

另一个修复方法是使用“after”方法销毁根目录<代码>根。在(1,root.destroy())之后,它似乎也能够“逃脱”竞争循环。

我想线程也可以将循环彼此隔离。本文提供了更多有用信息:

https://gordonlesti.com/use-tkinter-without-mainloop/#:~:text=方法mainloop具有,正在等待某些事件。

 类似资料:
  • 问题内容: 我创建了一个基于会话的简单登录页面。 并添加了一个包含此内容的注销页面 现在,当我关闭浏览器/页面并重新打开它时,会话的值仍然存在。 我想知道如何完全销毁页面/浏览器关闭上的会话。 问题答案: 如果您使用: 关闭浏览器时,您的会话cookie将会被破坏…因此,在关闭浏览器之前,您的会话将是良好的。IE浏览器 您登录并登录,然后关闭浏览器,然后重新打开,再次进入该站点,您将不会登录。

  • 我正在使用Tkinter作为GUI用python编程一些驱动器。当我的机器运行时,我想向用户显示一个顶层窗口,其中包含一些信息,这些信息应该在功能完成后自动关闭。这是我最小的例子: 主要问题是,顶层窗口在5秒结束后才出现。有什么建议吗?谢谢!

  • 我是ejbs的新手,我想知道有状态会话bean是否会被销毁。我在servlet中注入了一个有状态会话bean。即使在30分钟后,我看到豆子是活跃的。我使用jboss eap 6.0。我相信Http会话与有状态会话bean无关。我使Http会话无效,以确保Http会话与有状态会话bean无关。那么,如果我的应用程序有许多用户,并且对于每个用户,如果我创建一个新bean,我的服务器的性能就会下降。容器

  • 问题内容: 我正在尝试正确注销管理员用户。这是我的功能: 基本上,一旦我对密码进行了身份验证,就将会话设置为有效(总共只有1个用户)。现在,当管理员点击注销时,我想销毁当前会话,并销毁cookie,以便他们不能只是使用浏览器中存储的会话cookie返回管理页面。但是我的代码不起作用。我点击注销,然后我可以直接导航回到管理页面。但是,如果我删除Cookie,则该功能非常完善。那么这里的cookie删

  • 有没有办法销毁特定类的所有创建的会话范围bean(并在需要时让spring重新创建)? 例如,两个用户访问应用程序,然后每个用户将有一个bean。我想毁掉这两颗豆子。 用例: 管理员正在更新菜单栏。菜单栏列表数据存储在会话范围的bean中。管理员的bean应该被销毁,菜单栏应该被更新。当然,其他人的菜单也应该更新,所以其他bean也应该被销毁。 注1:不同的用户可能会看到不同的菜单,因此bean是

  • 即使在注销后,会话仍保持活动状态。 这是我的登录文件。 公共函数loginAsAdmin($wpUserName,$wpPassword){ } 细节 代码欺骗版本: 2.2.10 PHP版本:操作系统: OS X安装类型:作曲家安装包列表(作曲家显示)我正在使用Lucatume/wp浏览器包进行代码欺骗 这是我的套件配置: class_name:AcceptanceTester模块: 这很好,我