尝试启动单线程窗口,但两个正在启动

时间:2015-05-29 23:20:43

标签: python multithreading tkinter

我试图启动一个线程窗口,因为我有正在运行的后台进程,但是在同一个线程下启动了两个相同的窗口,我不知道为什么。我猜这个代码可以优化! thx任何建议。

6/1:我按照建议进行修改,不在主循环中运行两个窗口,这样可行。第二部分是,一旦点击按钮,窗口就会被破坏" self.root.destroy()",但如果我尝试打开另一个窗口,它将无法打开。我在尝试启动新窗口之前进行检查,并且只有主线程正在运行,因此第一个线程消失了。不知道发生了什么,我无法通过运行的线程进行调试。

from Tkinter import *
import ttk
import threading
import thread
from pdctest.test_lib.hid_util import *

class GUI():
    def __init__(self, root):
        self.root = root # root is a passed Tk object
        self.root.title("GUI--->user instruction window")
        self.frame = Frame(self.root)
        self.frame.pack()
        self.label0 = Label(self.frame, text=" ")
        self.label0.configure(width=50, height=1)
        self.label0.pack()

        self.label = Label(self.frame, text="GUI--->execute a SKP on HS within 3s...")
        self.label.configure(width=50, height=1)
        self.label.pack()

        self.button = Button(self.root, text=" GUI--->then click this button ", command=self.buttonWasPressed, fg = 'black', bg = 'dark orange')
        self.button.configure(width=40, height=5)
        self.button.pack(pady=25)

    def removethis(self):
        print("GUI--->in removethis")
        self.root.destroy()

    def buttonWasPressed(self):
        print( "GUI--->inside buttonWasPressed: the button was pressed! " + '\r')
        self.removethis()
        print("GUI--->leaving buttonWasPressed")

    def guiSKP(self):
        #root = Tk()
        #window = GUI(root)
        #root.mainloop()
        # modified 6/1, fixes multi-window issue
        self.root.mainloop()

class GUI_SKP_Thread(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
    def run(self):
        root = Tk()
        window = GUI(root)
        window.guiSKP()

def launch_SKP_thread():
    print("beginning launch_SKP_thread" + '\r')
    thread_SKP = GUI_SKP_Thread("GUI_SKP_Thread")
    thread_SKP.start()
    print("exiting launch_SKP_thread" + '\r')

def whatsRunning():
    t = threading.enumerate()
   print("--------------->whatsRunning")
   print t

if __name__ == '__main__':
    launch_SKP_thread()
    # trying to launch 2nd window
    whatsRunning()
    time.sleep(4)
    whatsRunning()
    launch_SKP_thread()

1 个答案:

答案 0 :(得分:2)

我不确定你要对这个程序做什么。但我确定一件事,就是你试图在同一个 mainloop 中运行两个。您在不同位置中定义了两次窗口,这意味着有两个框架/窗口。一旦进入GUI中的guiSKP,一旦在GUI_SKP_Thread中运行。

root = Tk()
window = GUI(root)

所以,你应该改变guiSKP中的文字:

root = Tk()
window = GUI(root)
root.mainloop()

简单地说:

self.root.mainloop()

我添加了self以确保它运行自己的root.mainloop()