使用multiprossessing的python tkinter打开4个新GUI时该怎么办

时间:2019-08-20 12:13:39

标签: python tkinter multiprocessing

如果我的代码破坏了所有内容,我试图创建一个安全失败按钮(“ 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()```

1 个答案:

答案 0 :(得分:1)

基于函数中的路径,您正在Windows上运行。

您看到的是multiprocessing在ms-windows上工作的方式的副作用。在ms-windows上,多处理必须在所有辅助进程中import进行文件处理。该导入应该运行时没有副作用,例如创建窗口。

因此,您应将函数定义中的所有 除外移至if __name__ is "__main__"块中。特别是创建窗口并运行mainloop。

编辑:

此外,我不确定您为什么在这里甚至使用multiprocessing?我假设MultiMonitorTool.exe快速完成。

mainloop之后,只需致电

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

那应该重新打开所有显示器。