Skip to main content
 首页 » 编程设计

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

2024年10月01日30qq号

我有 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 运行。

谢谢。

请您参考如下方法:

就像 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() 

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