使用多交叉的python tkinter打开4个新gui时该怎么办';s

使用多交叉的python tkinter打开4个新gui时该怎么办';s,python,tkinter,multiprocessing,Python,Tkinter,Multiprocessing,我试图做一个安全失败按钮(“q”),如果我的代码破坏了一切等等。 所以当我在键盘上点击“q”时,我所有的显示器都会启动,以防一切都变暗。我让它工作,但它是缓慢的,所以我尝试与多交叉,但当我点击q的代码启动gui 4次以上,但它的工作,所以所有的屏幕再次打开 那么,如何阻止它制作更多的gui窗口呢 import tkinter as tk # import keyboard import time from multiprocessing import Process def setupWor

我试图做一个安全失败按钮(“q”),如果我的代码破坏了一切等等。 所以当我在键盘上点击“q”时,我所有的显示器都会启动,以防一切都变暗。我让它工作,但它是缓慢的,所以我尝试与多交叉,但当我点击q的代码启动gui 4次以上,但它的工作,所以所有的屏幕再次打开

那么,如何阻止它制作更多的gui窗口呢

import tkinter as tk
# import keyboard
import time
from multiprocessing import Process


def setupWork():
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /disable 4")
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 3 ")
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 2 ")
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 1 ")

def setupMovie():
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 4")
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 3")
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /disable 2")
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /disable 1")

def onlyMain():
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 3")
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /disable 4")
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /disable 2")
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /disable 1")

# def enableAll():
#     os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 4")
#     print("1")
#     time.sleep(1)
#     os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 3")
#     print("2")
#     time.sleep(1)
#     os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 2")
#     print("3")
#     time.sleep(1)
#     os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 1")
#     print("4")
#     time.sleep(1)

# def testkey(event):
#     enableAll()



def D1():
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 4")
    print("1")
def D2():
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 3")
    print("2")
def D3():
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 2")
    print("3")
def D4():
    os.system("C:\multimonitortool-x64\MultiMonitorTool.exe /enable 1")
    print("4")    


root = tk.Tk()

# fail safe if rip
# root.bind("q", testkey)
root.bind("q", D1)
root.bind("q", D2)
root.bind("q", D3)
root.bind("q", D4)




background_image = tk.PhotoImage(file= "C:/Users/ERD/Documents/codes/MultiMonitorScrips/background.png")
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)

# background_logo = tk.PhotoImage(file=)q

root.title('MMTS')
root.minsize(width=250, height=100)


button_A = tk.Button(root, text='Work', command=setupWork, bg='gray80')
button_A.place(relx=0.1, rely=0.3 ,relheight=0.35, relwidth=0.35)

button_B = tk.Button(root, text='Movie', command=setupMovie, bg='gray80')
button_B.place(relx=0.55, rely=0.3 ,relheight=0.35, relwidth=0.35)

Button_C = tk.Button(root, text='Main', command=onlyMain, bg='gray80')
Button_C.place(relx=0.35, rely=0.88, relheight=0.1, relwidth=0.3)

root.mainloop()


if __name__ == '__main__':
    d1 = Process(target=D1)
    d2 = Process(target=D2)
    d3 = Process(target=D3)
    d4 = Process(target=D4)
    d1.start()
    d2.start()
    d3.start()
    d4.start()
    d1.join()
    d2.join()
    d3.join()
    d4.join()```

根据函数中的路径,您正在windows上运行

您所看到的是
多处理
在ms windows上工作方式的副作用。在ms windows上,多处理必须在所有工作进程中导入文件。该导入应在没有诸如创建窗口等副作用的情况下运行

因此,您应该将除函数定义之外的所有内容移动到
中,如果uuuu name\uuuuuu是“\uuuu main\uuuuu”
块。特别是创建窗口和运行主循环

编辑:

此外,我不知道您为什么在这里使用
多处理
?我假设
multi-monitortool.exe
很快完成

mainloop
之后,只需调用

for n in range(4, 0, -1):
    os.system(
      "C:\multimonitortool-x64\MultiMonitorTool.exe /enable " + str(n)
    )

这将重新打开所有监视器。

好的,所以我想我知道awnser,但不知道如何编码。我需要d1,start()等。。。等待按键“q”嗨,我有点明白你的意思,但是你能把代码编得让我100%理解吗?:)如果uuu name是“uuu main uuuuu”则将
移动到
root=tk.tk()
之前,并更正缩进。我制作了缩进,这样它会打印显示谁被禁用或启用的内容,看起来它会首先运行多交叉,而不是在调用时。我不认为这是windows独有的。在所有平台上,模块都必须导入到新进程中。@BryanOakley类UNIX操作系统通常只使用
fork
,而不需要这样做。ms windows上使用的
spawn
方法存在,因为该操作系统没有
fork
。因此,“主模块的安全导入”是对启动新进程的“spawn”和“forkserver”方法的特殊限制,根据多处理文档。我无法快速确定默认情况下哪个操作系统使用forkserver(如果有的话)。