2014-07-27 27 views
0

我想創建一個簡單的文件對話框(最好是系統之一)用於本地服務器。使用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()被調用,我會非常感激

+0

你只是靶向的Mac,或者這是否需要對其他操作系統的工作以及? – MattDMo

+0

我想定位windows和linux。 但是,如果只有OSX解決方案,他們也會受到歡迎。 – dtracers

+1

好吧,我找到了['EasyDialogs'](https://docs.python.org/2/library/easydialogs.html),但出於某種原因,我無法在我的MacPorts版本的Python上工作。它只是在2.X版本中,但如果你能得到它的工作,它看起來相當好,很容易。查看http://pymotw.com/2/EasyDialogs/index.html獲取一些示例。 – MattDMo

回答

0

對於任何人如何解決這個問題...

我結束了使用java。 Python文件對話最終變得非常困難。它有一些非常奇怪的要求,並要求您創建第二個窗口,然後您必須隱藏它,以便它不能滿足我需要以對用戶直觀的方式執行的操作。 (或者對程序員來說甚至是直觀的)

Java有一個更容易使用的內置文件對話框系統。 http://docs.oracle.com/javase/7/docs/api/javax/swing/JFileChooser.html

但不管語言如何,mac出現彈出文件對話框多次的問題。這些問題不會出現在Windows上。

因此,如果您的解決方案是跨平臺的話,這也是需要考慮的問題。

1

下面的python函數將彈出一個MacOS文件保存對話框。該參數提供了默認的位置和文件名

from AppKit import NSSavePanel, NSApp 
from Foundation import NSURL 

def save_dialog(directory, filename): 
    panel = NSSavePanel.savePanel() 
    panel.setTitle_("Save your document") 
    myUrl = NSURL.fileURLWithPath_isDirectory_(directory, True) 
    panel.setDirectoryURL_(myUrl) 
    panel.setNameFieldStringValue_(filename) 
    NSApp.activateIgnoringOtherApps_(True) 
    ret_value = panel.runModal() 
    if ret_value: 
     return panel.filename() 
    else: 
     return '' 

一個開放的對話,看到NSOpenPanel的文檔(這是更簡單。)