2

我有primary.py:Tkinter的是在文件選擇與多重打開多個GUI窗口,當只有一個窗口應該存在

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運行。

謝謝。

+0

使用root .withdraw()消除Tk()窗口(您發送給GUI)。 askopenfilename()打開它自己的窗口,這是你看到的第二個窗口http://effbot.org/tkinterbook/wm.htm請注意,「dummy」將在從askopenfilename返回後運行。 –

回答

1

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

(在你的程序的「底」,即在所有的功能都定義。)

+0

我很欣賞這種迴應,但我在解包時遇到了麻煩。我有以下問題: 1.什麼構成該計劃的「底部」?它是否在root.mainloop()之後? 2.當你提到移動'if __name__ =='__main __「'子句時,你指的是什麼?整個代碼塊還是整個功能?看來至少queue.put(路徑)將需要保持在原來的位置。 3.當你提到將代碼放在「there」的tkinter中,而不是在那裏,什麼是「there」?它在定義之內嗎?我不明白爲什麼'tkinter'代碼會在那裏。 – user1318135

+0

(續)4.當您提到在起點內定義的事件時,您是什麼意思? 5.最後,你提到多次使用'tkinter'的代碼......這是什麼意思?什麼是切入點? – user1318135

+1

@ user1318135看我的編輯。有關入口點的更多信息,請看看這個:https://docs.python.org/2/library/multiprocessing.html#windows – SneakyTurtle

相關問題