Tkinter多线程队列等待

2024-10-02 16:33:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我的tkinter应用程序有两个线程(我需要它们),我在stackoverflow上发现了一个很棒的函数tkloop(),它只为tkinter创建了一个主线程;它使用队列。当我这样做时,它会显示tkMessagebox:

self.q.put((tkMessageBox.askyesno,("Cannot download it", "Download \"" + tag +"\" via internet site"),{}, self.q1 ))

但是当我做了我自己的函数时,它却不执行这个函数

self.q.put((self.topleveldo,(resultlist),{},None))

只有一个类应用程序:

self.q=Queue()
def tkloop(self):
    try:
        while True:
            f, a, k, qr = self.q.get_nowait()
            print f
            r = f(*a,**k)

            if qr: qr.put(r)
    except:
        pass
    self.okno.after(100, self.tkloop)
def topleveldo(resultlist):
    print ("executed - actually this never prints")
    self.choice=Toplevel()
    self.choices=Listbox(self.choice)
    for result in resultlist:
        self.choices.insert(END,str(result))
    choosebutton=Button(text="Vybrat",command=self.readchoice)
def readchoice(self):
    choice=int(self.choices.curselection())
    self.choice.destroy()
    self.q1.put(choice)

类App中方法中的另一个代码,由第二个线程运行:

def method(self):
    self.q1=Queue()
    self.q.put((self.topleveldo,(resultlist),{},None))
    print ("it still prints this, but then it waits forever for q1.get, because self.topleveldo is never executed")
    choice=self.q1.get()

Tags: 函数selfgetputtkinterdefitchoices
1条回答
网友
1楼 · 发布于 2024-10-02 16:33:38

在tkloop异常处理程序中记录错误-现在您不知道调用topleveldo是否失败(可能失败了)。问题是(1)(resultlist)只是resultlist,而不是像topleveldo所期望的那样具有1个参数的元组。并且(2)tkloop仅在消息中的第4个参数是队列时才放置响应。您可以通过以下方式进行修复:

self.q.put((self.topleveldo,(resultlist,),{},self.q1))

添加:

tkloop应该始终返回一条消息,即使它捕获到异常,这样调用方就可以可靠地调用q.get()来获得响应。一种方法是返回被调用程序引发的异常:

def tkloop(self):
    while True:
        try:
            f, a, k, qr = self.q.get_nowait()
            print f
            r = f(*a,**k)
            if qr: 
                qr.put(r)
            del f,a,k,qr
    except Exception, e:
        if qr:
            try:
                qr.put(e)
            except:
                # log it
                pass
    self.okno.after(100, self.tkloop)

相关问题 更多 >