2012-02-16 22 views
57

मेरे पास एक साधारण स्क्रिप्ट है जो एक फ़ाइल को पार करती है और डेटाबेस में इसकी सामग्री लोड करती है। मुझे यूआई की आवश्यकता नहीं है, लेकिन अभी मैं उपयोगकर्ता को फ़ाइल के लिए raw_input का उपयोग करके पार्स करने के लिए प्रेरित कर रहा हूं जो कि सबसे असभ्य है, खासकर क्योंकि उपयोगकर्ता पथ की प्रतिलिपि/पेस्ट नहीं कर सकता है। मैं उपयोगकर्ता को फ़ाइल चयन संवाद प्रस्तुत करने का एक तेज़ और आसान तरीका चाहता हूं, वे फ़ाइल का चयन कर सकते हैं, और फिर यह डेटाबेस में लोड हो जाता है। (अपने प्रयोग के मामले में, यदि वे गलत फ़ाइल चुना हुआ है, यह पार्स विफल हो जाएगा, और एक समस्या भले ही यह डेटाबेस के लिए लोड किया गया था नहीं होगा।)पायथन में त्वरित और आसान फ़ाइल संवाद?

import tkFileDialog 
file_path_string = tkFileDialog.askopenfilename() 

इस कोड के करीब है क्या मैं चाहता हूं, लेकिन यह एक कष्टप्रद खाली फ्रेम खुला छोड़ देता है (जो बंद होने में सक्षम नहीं है, शायद इसलिए कि मैंने एक करीबी घटना हैंडलर पंजीकृत नहीं किया है)।

मुझे टीकेइंटर का उपयोग करने की आवश्यकता नहीं है, लेकिन चूंकि यह पायथन मानक पुस्तकालय में है, यह सबसे तेज़ और आसान समाधान के लिए एक अच्छा उम्मीदवार है।

किसी अन्य यूआई के बिना किसी स्क्रिप्ट में फ़ाइल या फ़ाइल नाम के लिए संकेत देने का त्वरित और आसान तरीका क्या है?

+0

माइनर सुधार: आप एक में चिपका सकते हैं टर्मिनल (ऐसा लगता है कि आप विंडोज़ पर हैं) टेक्स्ट क्षेत्र में राइट-क्लिक करके और संदर्भ मेनू से "पेस्ट" का चयन करके। – Deestan

+1

कोई पाइथन raw_input प्रॉम्प्ट में कोई राइट क्लिक मेनू उपलब्ध नहीं है। – Buttons840

+2

raw_input टर्मिनल में होता है, जिसमें राइट क्लिक मेनू होता है। – Deestan

उत्तर

108

Tkinter सबसे आसान तरीका है यदि आप किसी अन्य निर्भरता के लिए नहीं करना चाहती है। किसी अन्य जीयूआई तत्वों के बिना केवल संवाद दिखाने के लिए, आप withdraw विधि का उपयोग कर जड़ खिड़की को छिपाने के लिए है:

import tkinter as tk 
from tkinter import filedialog 

root = tk.Tk() 
root.withdraw() 

file_path = filedialog.askopenfilename() 

अजगर 2 संस्करण:

import Tkinter, tkFileDialog 

root = Tkinter.Tk() 
root.withdraw() 

file_path = tkFileDialog.askopenfilename() 
+3

यह स्वीकार्य उत्तर होना चाहिए। यह सरल, प्रभावी है, और जब तक आप नई ताकत वाली खिड़कियां नहीं बना रहे हैं, तब तक यह ठीक है (और उल्लेख नहीं है कि यह वही जवाब है जब मैं इस धागे में आया था)। – Andrew

+2

मैंने अभी भी अपने काम के लिए इसका इस्तेमाल किया था। यह फेडोरा पर ठीक काम करता है, लेकिन उबंटू पर यह किसी भी matplotlib आंकड़े को गड़बड़ कर देता है जो पालन करता है। Pylab.show() के बाद बहुत कुछ लटकता है। मैं अभी भी टर्मिनल में टाइप करने में सक्षम हूं, लेकिन कुछ भी नहीं होता है। मेरे प्रोग्राम के लिए सीपीयू 0% तक चला जाता है। कोई सलाह? – Diana

+15

python3 पर: 'tkinter.filedialog.askopenfilename()' – jfs

4

यदि आपको यूआई की आवश्यकता नहीं है या प्रोग्राम को सीएलआई में चलाने की उम्मीद है, तो आप फ़ाइलपैथ को तर्क के रूप में पार्स कर सकते हैं। यह आपको आवश्यक फ़ाइल को तुरंत ढूंढने के लिए आपके सीएलआई की स्वत: पूर्ण सुविधा का उपयोग करने की अनुमति देगा।

यह संभवतः केवल आसान होगा यदि स्क्रिप्ट फ़ाइलपैथ इनपुट के अलावा गैर-इंटरैक्टिव है।

import easygui 

path = easygui.fileopenbox() 

करने के लिए: आप easygui उपयोग कर सकते हैं http://www.ferg.org/easygui/easygui.html#-fileopenbox

+0

यह एक वैध समाधान है, हालांकि मुझे विंडोज कमांड लाइन का उपयोग करने के लिए हर बार दुखी महसूस होता है। मैं एक विंडोज वातावरण में हूँ। – Buttons840

+2

मैं देखता हूं। विंडोज़ में सीएलआई यूनिक्स की तुलना में बहुत खराब है। मैं देखता हूं कि एक फ़ाइल पिकर साफ क्यों होगा। मुझे लगता है कि फाइल को स्क्रिप्ट पर ड्रैग-एंड-ड्रॉप करना और फिर फाइलनाम को तर्क के रूप में पढ़ना है? (http://mindlesstechnology.wordpress.com/2008/03/29/make-python-scripts-droppable-in-windows/) इससे पहले यह फ़ाइल को भौतिक रूप से प्रतिलिपि बनाने में शामिल नहीं होता है। मैं एक विंडोज़ बॉक्स एटीएम पर नहीं हूं इसलिए मैं परीक्षण नहीं कर सकता कि यह कैसे व्यवहार करता है। यदि आप इसे कई मशीनों पर स्थापित करने की आवश्यकता है तो आप आसानी से रजिस्ट्री हैक को .reg फ़ाइल में तैनात कर सकते हैं। – SQDK

+0

वैकल्पिक रूप से आप एक .bat फ़ाइल को फ़ाइल नाम को स्क्रिप्ट के रूप में एक तर्क के रूप में पास कर सकते हैं। इसमें कोई रजिस्ट्री हैक्स शामिल नहीं है। – SQDK

2

बाहर चेक EasyGUI, एक बहुत ही आसान मॉड्यूल है कि काम करना चाहिए उपयोग करने के लिए easygui इंस्टॉल करें, आप pip का उपयोग कर सकते हैं:

pip3 install easygui 

यह एक शुद्ध पायथन मॉड्यूल (easygui.py) है जो tkinter का उपयोग करता है।

+1

मुझे क्यों चाहिए? कुछ उदाहरण देने की देखभाल? – Buttons840

+1

क्षमा करें - मेरे फोन पर तो मैं एक उदाहरण नहीं दे सकता। आप fileopenbox का उपयोग करना चाहते हैं - http://www.ferg.org/easygui/easygui.html#-fileopenbox – timc

+1

मुझे easygui के लिए एक डाउनलोड लिंक नहीं मिला। मैंने easygui को easy_install करने की कोशिश की, लेकिन यह असफल रहा (pypi 404'ed पेज से डाउनलोड करने के लिए कहता है)। कुल मिलाकर, यह बहुत आसान नहीं था। – Buttons840

17

-http://easygui.sourceforge.net/

आप fileopenbox समारोह का प्रयोग करेंगे -

+3

easygui प्रोजेक्ट बंद हो गया है, आगे नहीं रखा गया है - यह वर्तमान में पाइथन 3.5 पर चलते समय एक त्रुटि/अपवाद फेंकता है, शायद अन्य विकल्पों पर विचार करें – pepe

+2

@pepe: मुझे [प्रोजेक्ट रिपोजिटरी] में कोई नोटिस नहीं दिखाई देता है (https://github.com/robertlugg/easygui) (नवीनतम प्रतिबद्धता 15 मई है) – jfs

+0

जानना अच्छा है, thx, शायद किसी ने इसे उठाया है: https://easygui.wordpress.com/2013/03/06/easygui-project देखें -शूट-डाउन -2/ – pepe

14

wxPython साथ प्रयास करें:

import wx 

def get_path(wildcard): 
    app = wx.App(None) 
    style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST 
    dialog = wx.FileDialog(None, 'Open', wildcard=wildcard, style=style) 
    if dialog.ShowModal() == wx.ID_OK: 
     path = dialog.GetPath() 
    else: 
     path = None 
    dialog.Destroy() 
    return path 

print get_path('*.txt') 
संबंधित मुद्दे