当只有一个窗口存在时,Tkinter在选择文件时使用多处理打开多个GUI窗口

时间:2017-10-10 19:29:25

标签: python python-3.x tkinter multiprocessing python-multiprocessing

我有primary.py:

from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter import ttk
import multiprocessing as mp
import other_script

class GUI:
    def __init__(self, master):
        self.master = master

def file_select():

    path = askopenfilename()

    if __name__ == '__main__':
        queue = mp.Queue()
        queue.put(path)
        import_ds_proc = mp.Process(target=other_script.dummy, args=(queue,))
        import_ds_proc.daemon = True
        import_ds_proc.start()

# GUI
root = Tk()

my_gui = GUI(root)

# Display

frame = Frame(width=206, height=236)
frame.pack()

ttk.Button(frame, text="Select", command=file_select).pack(anchor='nw')

# Listener

root.mainloop()

和other_script.py:

def dummy(parameter):
    pass

运行此选项时,会出现第二个GUI窗口。为什么?这是不受欢迎的行为,我希望dummy能够运行。

感谢。

1 个答案:

答案 0 :(得分:1)

multiprocessing一样,您需要将代码与tkinter放在一起,并使您的窗口位于程序的入口点(这样它就不会在另一个进程中运行多次) )。

这意味着将if __name__ == "__main__"子句移动到程序的“底部”,并将代码放在tkinter处。 multiprocessing的入口点仍将受到保护,因为它是在事件之后调用的,该事件是在起点内定义的。

修改 输入点是您输入程序的地方,通常是您说if __name__ == "__main__"

通过将tkinter代码移动到入口点,我的意思是这样的:

if __name__ == "__main__":
    root = Tk()
    my_gui = GUI(root)
    frame = Frame(width=206, height=236)
    frame.pack()
    ttk.Button(frame, text="Select", command=file_select).pack(anchor='nw')
    root.mainloop()

(在程序的“底部”,即在定义了所有函数之后。)