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

标签 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 运行。

谢谢。

最佳答案

就像 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/

相关文章:

java - 列出源依赖项

python - 动态更改斐波那契程序python的递归限制

python - 如何使用 tf.Assign() 分配 LSTMStateTuple()?

python - Tkinter - 输入框 - 日期格式

python - PyInstaller 应用程序无法在 Mac 上打开

python - PySide/PyQt 检测用户是否试图关闭窗口

python - 从一个排序向量中查找也存在于另一个排序向量中的值

python - 这些 Eclipse PyDev 图标在哪里定义的?

python - 我如何使用 Python 字符串以使相同的代码在 2.6、2.7、3.x 中工作

python-3.x - 如何解析此 sklearn 代码中的 "ValueError: not enough values to unpack"?