我想創建一個簡單的文件對話框(最好是系統之一)用於本地服務器。使用python打開一個目錄對話框
我不能使用Tkinter,因爲它必須在子進程中運行,並且對話框不會在子進程中的Mac上保持打開狀態。我無法使用線程,因爲它最終會鎖定。
有沒有辦法打開系統文件對話框而無需使用Tkinter。
這第一個文件是我想(在最後忽略沒有錯誤類型)
import Tkinter as tk
import threading
from tkFileDialog import askdirectory
def createDialog(communicationQueue):
dia = Dialog(communicationQueue)
dia.show()
class Dialog():
def __init__(self, communicationQueue):
self.communicationQueue = communicationQueue
self.root = tk.Tk()
self.root.overrideredirect(True)
self.root.geometry("0x0+%d+%d" % (0, 0))
self.root.withdraw()
print 'creating root'
print 'Root Created'
self.root.update()
self.root.deiconify()
print 'asking directory'
t = threading.Thread(target = self.show)
t.daemon = True
t.start()
self.root.mainloop()
print 'Directory found!'
def show(self):
print "show dialog"
self.root.lift()
name = askdirectory()
print name
self.communicationQueue.put(name)
if __name__ == '__main__':
createDialog(None)
print "Blocking!"
此文件與第一文件相結合試圖在子過程中使用Tkinter的行爲的自給自足的工作版本
import time
from multiprocessing import Process, Queue
def _createDialog(communicationQueue):
from src.utilities import fileDialog
fileDialog.createDialog(communicationQueue)
print 'method!'
def showDirectoryDialog():
"""A blocking method that returns the directory path to a selected directory"""
communicationQueue = Queue()
p = Process(target = _createDialog, args = (communicationQueue,))
p.start()
count = 0
while (communicationQueue.empty() and count <= 5):
print "waiting"
time.sleep(5)
count = count + 1
print 'Process should start'
time.sleep(1)
print 'Thread should have slept for 1 second'
return name
if __name__ == '__main__':
name = showDirectoryDialog()
print name
如果有人能得到這個工作在Mac或至少找出原因根窗口保持打開狀態,直到askDirectory()被調用,我會非常感激
你只是靶向的Mac,或者這是否需要對其他操作系統的工作以及? – MattDMo
我想定位windows和linux。 但是,如果只有OSX解決方案,他們也會受到歡迎。 – dtracers
好吧,我找到了['EasyDialogs'](https://docs.python.org/2/library/easydialogs.html),但出於某種原因,我無法在我的MacPorts版本的Python上工作。它只是在2.X版本中,但如果你能得到它的工作,它看起來相當好,很容易。查看http://pymotw.com/2/EasyDialogs/index.html獲取一些示例。 – MattDMo