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

如何创建非阻塞Python tkinter窗口[重复]

督冠玉
2023-03-14

我想用Tkinter创建一个非阻塞消息窗口。这是为了在另一个函数正在等待答复时显示等待消息。收到回复后,窗口可自动关闭。我设法在网上找到了一些信息,我做了以下工作:

import tkinter as tk
import threading
import time

class Show_Azure_Message(threading.Thread):
    def __init__(self, message):
        self.thread = threading.Thread.__init__(self)
        self.message = message
        self.start()

    @staticmethod
    def callback():
        return

    def destroy(self):
        self.root.quit()

    #run will be called from self.start()
    def run(self):
        self.root = tk.Tk()
        self.root.protocol("WM_DELETE_WINDOW", self.callback)
        self.t2 = tk.Text(self.root, height=10, borderwidth=0, wrap=tk.WORD)
        self.t2.insert(1.0, self.message)
        self.t2.grid(padx=5,row=2)
        self.t2.config(state=tk.DISABLED)
        self.root.mainloop()

App = Show_Azure_Message('Hello')
for i in range(0,2):
    print(i)
    time.sleep(1)

App.destroy()

当我将其作为主脚本执行时,这运行良好,但是当我在得到以下错误RuntimeError之后想要使用Tkinter运行另一个gui应用程序时:主线程不在主循环中

另外,当我在App.destroy()之后运行另一段代码时。然后应用程序窗口不关闭结束应用程序继续运行。

root = tk.Tk()
label = tk.Label(root, text='Hello2')
label.pack()
root.mainloop()

所以我可能做错了什么,但我无法找出问题所在。除此之外,我对Python线程没有太多经验,因此我可能遗漏了一些琐碎的东西。

你好,海尔特

共有1个答案

柳奇思
2023-03-14

我认为,如果你真的想这样做(看看你文章的评论部分),你应该使用一个顶级窗口,因为他们不需要一个主循环,在我看来,这让事情变得更容易。

如果我不得不这样做,我会这样做:

from tkinter import *
import threading
import time

class Show_Azure_Message(Toplevel):
    def __init__(self,master,message):
        Toplevel.__init__(self,master) #master have to be Toplevel, Tk or subclass of Tk/Toplevel
        self.title('')
        self.attributes('WM_DELETE_WINDOW',self.callback)
        self.resizable(False,False)
        Label(self,text=message,font='-size 25').pack(fill=BOTH,expand=True)
        self.geometry('250x50+%i+%i'%((self.winfo_screenwidth()-250)//2,(self.winfo_screenheight()-50)//2))

    def callback(self): pass

BasicApp=Tk()
App = Show_Azure_Message(BasicApp,'Hello')
for i in range(0,2):
    print(i)
    time.sleep(1)

App.destroy()
 类似资料:
  • 问题内容: 我正在努力使自己在nodejs中创建非阻塞的繁重计算。请看以下示例(从其他内容中删除): 可以想象,如果我同时打开2个浏览器窗口,第一个将等待10秒,另一个将等待20秒,这与预期的一样。因此,在知道回调以某种方式是异步的情况下,我删除了睡眠并改为放置: 具有简单定义的功能: 那当然是行不通的…我也曾尝试定义一个EventEmitter并向其注册,但是例如,发射器的主要功能在发出“完成”

  • 问题内容: 基本上,我有一个URL,当发布新消息时,该URL在聊天室中流xml更新。我想将URL转换为InputStream并继续读取它,只要保持连接并且没有发送Thread.interrupt()。我遇到的问题是,当有内容要从流中读取时,BufferedReader.ready()似乎不正确。 我正在使用以下代码: 当我运行代码并将某些内容发布到聊天室时,buf.ready()永远不会变为tru

  • 我发现这是超过2岁的线。我想问一个新问题这样我就能得到更多的关注 非阻塞子流程。呼叫 我的问题: 我和@DavidJB有着相同的情况,正如他在之前的帖子中所描述的 谢谢,这似乎可以工作,但是当我在slave.py中包括一个虽然循环时,它似乎卡住了,没有在循环中执行任何东西(即使有一个timer.sleep()函数...?-DavidJB Apr 17'13 at 23:59 有人对此有什么最新消息

  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser

  • Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S

  • 译注 注意,由于作者对教程做出了更新,之前本节使用的是GLEW库,但现在改为了使用GLAD库,关于GLEW配置的部分现在已经被修改,但我仍决定将这部分教程保留起来,放到一个历史存档中,如果有需要的话可以到这里来查看。 在我们画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL有目的地从这些操作抽象(