我有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
相关的代码放在那里。 多处理
的入口点仍将受到保护,因为它是在事件之后调用的,该事件是在起始点内定义的。
编辑:
入口点是您的程序的输入位置,通常当您说 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()
(在程序的“底部”,即定义所有函数之后。)
关于python - 当只应该存在一个窗口时,Tkinter 在使用多重处理选择文件时打开多个 GUI 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674498/