簡體   English   中英

Tkinter線程

[英]Tkinter threading

盡管看到有關此主題的許多問題,但我找不到適合自己的難題的答案。 我是Python的初學者,這是我的母語。 我正在嘗試創建一個對話框,該對話框在打開對話框時會自動運行。 測試完成后,我希望打開另一個對話框,指出測試已完成。 該測試可以正常運行。 但是,由於輔助對話框正在調用Tk()的第二個實例,因此它將不會打開。

我的問題:如何更改我的代碼,以便在測試完成時打開第二個對話框?

obj_rcs是正在運行的測試。 obj_config是輔助對話框。

我的代碼:

enter code here
from configcomplete_slice import complete
from slice_setup import SLICE_SETUP
import Tkinter
import threading
import Queue

class GuiPart:

    def __init__(self, master, queue):
        self.queue = queue
        master.geometry("300x100+400+250")
        master.title("RSAM BCT")
        Tkinter.Label(master, text= "REDCOM SLICE", fg="red").pack()
        Tkinter.Label(master, text= "BCT - Basic Configuration Test",    
        fg= "red").pack()
        Tkinter.Label(master, text= "Please wait...", fg= "black").pack()
        Tkinter.Label(master, text= "Estimated time: 3 min 6 sec", 
        fg= "black").pack()


    def processIncoming(self):
        while self.queue.qsize():
            try:
                msg = self.queue.get(0)
                print msg
            except Queue.Empty:
                pass

class ThreadedClient:

    def __init__(self, master):
        self.master = master
        # Create the queue
        self.queue = Queue.Queue()
        # Set up the GUI part
        self.gui = GuiPart(master, self.queue)
        # Set up the thread to do asynchronous I/O
        self.running = 1
        self.thread1 = threading.Thread(target = self.workerThread1)
        self.thread1.start()
        self.periodicCall()

    def periodicCall(self):
        self.gui.processIncoming()
        if not self.running:
            import sys
            sys.exit(1)
        self.master.after(100, self.periodicCall)

    def workerThread1(self):
        while self.running:
            obj_rcs = SLICE_SETUP()
            obj_com = complete()

            obj_rcs.SLICE()
            obj_com.config()

root = Tkinter.Tk()
client = ThreadedClient(root)
root.mainloop()

class complete:

    def config(self):
        Tkinter.geometry("400x300+400+250")
        Tkinter.title("RSAM BCT")
        Tkinter.Label(master, text= "REDCOME SLICE", fg="red").pack()
        Tkinter.Label(master, text= "BCT - Basic Configuration Test", fg= "red").pack()
        Tkinter.Label(master, text= "Configuration Complete!", fg= "dark green").pack()
        Tkinter.Label(master, text= "Trunk 1: Port 1: Phone 1: 760-450-4500", 
        fg= "black").pack()
        Tkinter.Label(master, text= "Trunk 1: Port 2: Phone 2: 760-450-4501", 
        fg= "black").pack()
        Tkinter.Button(master, text = "    Exit    ", 
        command = Tkinter.destroy).pack()

看來問題在於您在調用其他模塊中的函數時正在創建另一個Tk元素,因為您沒有將創建的Tk元素傳遞給complete()函數。 因此,它應該接受一個master參數,然后在另一個模塊中使用它,然后避免使用多個根Tk元素。

此外,您正在使用多個幾何管理器( placepack )。 您應該在同一窗口中僅使用一個,以免發生意外行為。 此外,此方法始終返回None ,因此像plabel = ...這樣的賦值是無用的-不僅因為它存儲None而且還可能引起誤解。


編輯:我添加了您的代碼的修改,以便您可以概述如何與生成線程進行通信。 我沒有測試過,但至少可以作為獲得總體思路的參考。

from slice_setup import SLICE_SETUP
import Tkinter as tk
import threading
import Queue

class GuiPart:
    def __init__(self, master, queue):
        self.queue = queue
        self.master = master
        self.master.geometry("300x100+400+250")
        self.master.title("RSAM BCT")
        tk.Label(master, text="REDCOM SLICE", fg="red").pack()
        tk.Label(master, text="BCT - Basic Configuration Test", fg= "red").pack()
        tk.Label(master, text="Please wait...", fg= "black").pack()
        tk.Label(master, text="Estimated time: 3 min 6 sec", fg= "black").pack()

    def processIncoming(self):
        while self.queue.qsize():
            try:
                text = self.queue.get(0)
                Complete(self.master, text)
            except Queue.Empty:
                pass

class ThreadedClient:
    def __init__(self, master):
        self.master = master
        self.queue = Queue.Queue()
        self.gui = GuiPart(master, self.queue)
        self.running = True
        self.thread = threading.Thread(target=self.workerThread1)
        self.thread.start()
        self.periodicCall()

    def periodicCall(self):
        self.gui.processIncoming()
        if not self.running:
            return
        self.master.after(100, self.periodicCall)

    def workerThread1(self):
        obj_rcs = SLICE_SETUP()
        obj_rcs.SLICE()
        self.queue.put("Configuration Complete!")
        self.running = False

class Complete(tk.Toplevel):
    def __init__(self, master=None, completetext=""):
        tk.Toplevel.__init__(self, master)
        self.geometry("400x300+400+250")
        self.title("RSAM BCT")
        tk.Label(self, text="REDCOME SLICE", fg="red").pack()
        tk.Label(self, text="BCT - Basic Configuration Test", fg="red").pack()
        tk.Label(self, text=completetext, fg="dark green").pack()
        tk.Label(self, text="Trunk 1: Port 1: Phone 1: 760-450-4500", fg="black").pack()
        tk.Label(self, text="Trunk 1: Port 2: Phone 2: 760-450-4501", fg="black").pack()
        tk.Button(self, text="    Exit    ", command=self.destroy).pack()


if __name__ == "__main__":
    root = Tkinter.Tk()
    client = ThreadedClient(root)
    root.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM