運行我有一個Tkinter
包裝改寫robocopy.exe
,如下面示出的代碼被組織: -過程保持關於關閉主處理
Tkinter的包裝:
- 產生一個新線程並傳遞參數,其中包括源/目的地和其他參數
(注意:Queue
object is al所以傳遞到線程,因爲線程將從robocopy
讀取輸出和將投入queue
,主要Tkinter的線程將繼續輪詢queue
,並且將更新與輸出Tkinter的文本組件)
代碼段
... Code to poll queue and update tk widget ...
q = Queue.Queue()
t1 = threading.Thread(target=CopyFiles,args=(q,src,dst,), kwargs={"ignore":ignore_list})
t1.daemon = True
t1.start()
主題:(在一個單獨的文件)
下面是從線程的代碼片段
def CopyFiles(q,src,dst,ignore=None):
extra_args = ['/MT:15', '/E', '/LOG:./log.txt', '/tee', '/r:2', '/w:2']
if len(ignore) > 0:
extra_args.append('/xf')
extra_args.extend(ignore)
extra_args.append('/xd')
extra_args.extend(ignore)
command_to_pass = ["robocopy",src, dst]
command_to_pass.extend(extra_args)
proc = subprocess.Popen(command_to_pass,stdout=subprocess.PIPE)
while True:
line = proc.stdout.readline()
if line == '':
break
q.put(line.strip())
代碼被稱爲,當Tkinter的應用程序被關閉: -
def onQuit(self):
global t1
if t1.isAlive():
pass
if tkMessageBox.askyesno("Title", "Do you really want to exit?"):
self.destroy()
self.master.destroy()
問題
每當我當robocopy
運行關閉Tkinter的應用程序,Python應用程序關閉,但robocopy.exe
在後臺繼續運行。
我已經嘗試將線程設置爲守護進程,但它沒有效果。如何在onQuit
方法被調用時停止robocopy.exe
?
事實上,我從未有過之前使用過Signals。如果你可以提供一些例子(在這種情況下指針),這將是有幫助的。我需要在Tkinter包裝器中設置signal.signal(signal.SIGTERM,sighandler)嗎?但我的suprocess已經從不同的線程產生,所以我怎麼可以與'proc'對象通信 – sarbjit
我剛剛更新了一些例子的答案。如果您需要定義您的應用程序(Tkitner封裝器)在進程接收到信號時做出反應,您可以使用'signal.signal'。但在這個問題中,你的應用正在發送信號,* robocopy *是需要處理信號的人。所以'signal.signal'沒有幫助。 – farzad
謝謝,實際上onQuit是一個方法(我跳過了很多代碼),實際上問題仍然存在 - 我怎樣才能將'proc'對象從線程傳遞到主應用程序,因爲'proc'是在線程和'onQuit'方法內創建的是在Tkinter包裝 – sarbjit