পাইথনে দ্রুত এবং সহজ ফাইল ডায়লগ?


104

আমার একটি সরল স্ক্রিপ্ট রয়েছে যা একটি ফাইলকে বিশ্লেষণ করে এবং এটির ডেটাবেসের বিষয়বস্তু লোড করে। আমার কোনও ইউআইয়ের দরকার নেই, তবে এই মুহুর্তে আমি ব্যবহারকারীকে ফাইলটি পার্স করার জন্য অনুরোধ করছি raw_inputযা সবচেয়ে বেশি বন্ধুত্বপূর্ণ especially আমি ব্যবহারকারীদের কাছে একটি ফাইল নির্বাচন ডায়ালগ উপস্থাপনের দ্রুত এবং সহজ উপায় চাই, তারা ফাইলটি নির্বাচন করতে পারে এবং তারপরে এটি ডাটাবেসে লোড হয়। (আমার ব্যবহারের ক্ষেত্রে যদি তারা ভুল ফাইলটি বেছে নিয়ে থাকে তবে এটি পার্সিংয়ে ব্যর্থ হবে এবং এটি ডাটাবেজে লোড হলেও সমস্যা হবে না a)

import tkFileDialog
file_path_string = tkFileDialog.askopenfilename()

এই কোডটি আমি যা চাই তার কাছাকাছি, তবে এটি একটি বিরক্তিকর ফাঁকা ফ্রেম খোলা ছেড়ে দেয় (যা বন্ধ হতে সক্ষম নয়, সম্ভবত কারণ আমি কোনও ঘনিষ্ঠ ইভেন্ট হ্যান্ডলার নিবন্ধন করি নি)।

আমাকে tkInter ব্যবহার করতে হবে না, তবে যেহেতু এটি পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে রয়েছে এটি দ্রুত এবং সহজ সমাধানের জন্য ভাল প্রার্থী।

অন্য কোনও ইউআই ছাড়া স্ক্রিপ্টে ফাইল বা ফাইলের নাম জিজ্ঞাসা করার দ্রুত এবং সহজ উপায় কী?


গৌণ সংশোধন: আপনি টার্মিনালে পেস্ট করতে পারেন (এটি আপনি উইন্ডোজে আছেন বলে মনে হচ্ছে) পাঠ্য অঞ্চলে ডান ক্লিক করে এবং প্রসঙ্গ মেনু থেকে "আটকান" নির্বাচন করে।
ডিস্টান

1
পাইথন কাঁচা-ইনপুট প্রম্পটে কোনও ডান ক্লিক মেনু পাওয়া যায় না।
বাটনস 840

2
কাঁচা_পিন্ডটি টার্মিনালে ঘটে, যার ডান ক্লিক মেনু রয়েছে।
ডিস্টান

উত্তর:


200

আপনি যদি অন্য কোনও নির্ভরতা না রাখতে চান তবে টিনকিটার হ'ল সহজতম উপায়। অন্য কোনও জিইউআই উপাদান ছাড়াই ডায়ালগটি দেখানোর জন্য আপনাকে 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
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি সহজ, কার্যকর, এবং যতক্ষণ না আপনি বার বার নতুন নতুন রুট উইন্ডো তৈরি করছেন না, এটি ঠিক আছে (এবং এই থ্রেডটি পেরিয়ে আসার সময় আমি যে উত্তরটি খুঁজছিলাম তার ঠিক এটিই উল্লেখ করা উচিত নয়)।
অ্যান্ড্রু

2
আমি এটি আমার কাজের জন্যও ব্যবহার করেছি। এটি ফেডোরার ক্ষেত্রে দুর্দান্ত কাজ করে তবে উবুন্টুতে এটি কোনও ম্যাটপ্ল্লোলিব চিত্র অনুসরণ করে যা অনুসরণ করে। Pylab.show () এর পরে অনেক সুন্দর hang আমি এখনও টার্মিনালে টাইপ করতে সক্ষম, কিন্তু কিছুই ঘটে না। এছাড়াও সিপিইউ আমার প্রোগ্রামটির জন্য 0% এ যায়। কোন পরামর্শ?
ডায়ানা

17
অজগর tkinter.filedialog.askopenfilename()
jfs

10
Python2 অন: import Tkinter as tkএবং import tkFileDialogএবংfile_path = tkFileDialog.askopenfilename()
SaschaH

8
এটি ম্যাকওএসে ভাল কাজ করে না: ডায়ালগটি খোলে তবে প্রতিক্রিয়াবিহীন হয়ে যায় এবং পুরো স্ক্রিপ্টটি স্তব্ধ হয়ে যায়।
পর্যায়ক্রমিক রক্ষণাবেক্ষণ

26

আপনি ইজিগুই ব্যবহার করতে পারেন :

import easygui

path = easygui.fileopenbox()

ইনস্টল easyguiকরতে, আপনি ব্যবহার করতে পারেন pip:

pip3 install easygui

এটি একক খাঁটি পাইথন মডিউল ( easygui.py) ব্যবহার করে tkinter


6
easygui প্রকল্পের বন্ধ হয়ে গেছে, আরও বজায় না - এটি বর্তমানে একটি ত্রুটি / ব্যতিক্রম ছোঁড়ার যখন পাইথন 3.5 চালু রাখার জন্য, সম্ভবত অন্যান্য অপশন বিবেচনা
পেপে

2
@ পেপ: আমি প্রকল্পের ভাণ্ডারে কোনও বিজ্ঞপ্তি দেখছি না (সর্বশেষ প্রতিশ্রুতি 15 ই মে)
jfs

ভাল কিছু জানতে চান, ধন্যবাদ, সম্ভবত কেউ এটা বাছাই করা আপ: দেখুন easygui.wordpress.com/2013/03/06/easygui-project-shuts-down-2
পেপে

@ জ্যানাম স্পষ্টতই এটি কাজ করে। তবে বাগ থাকতে পারে ।
jfs

আপনার ছেলেরা যদি টিনেটার + ম্যাটপ্লোটিলিব কম্বো নিয়ে সমস্যা করে তবে এটি আপনার দিনটি বাঁচাতে পারে!
কুওং ট্রুং হুয়

20

ডাব্লুএক্সপিথন দিয়ে চেষ্টা করুন :

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')

5

আপনার যদি ইউআইয়ের প্রয়োজন হয় না বা প্রোগ্রামটি কোনও সিএলআই-তে চালিত হওয়ার আশা না করে আপনি ফাইলপথটি যুক্তি হিসাবে পার্স করতে পারেন। এটি আপনাকে আপনার প্রয়োজনীয় ফাইলটি দ্রুত সন্ধান করতে আপনার সিএলআইয়ের স্বতঃপূরণ বৈশিষ্ট্যটি ব্যবহার করার অনুমতি দেবে।

স্ক্রিপ্টটি ফাইলপথ ইনপুট ব্যতীত ইন্টারেক্টিভ থাকলে সম্ভবত এটি কার্যকর হবে।


এটি একটি বৈধ সমাধান, যদিও আমাকে উইন্ডোজ কমান্ড লাইনটি ব্যবহার করতে হবে প্রতিবারের মধ্যে আমি দুঃখ বোধ করি। আমি একটি উইন্ডোজ পরিবেশে আছি।
বাটনস 840

2
আমি দেখি. উইন্ডোজের সি এল এল ইউনিক্সের তুলনায় খুব খারাপ is আমি দেখছি কেন একটি ফাইল বাছাইকারী ঝরঝরে হবে। আমার ধারণা সম্ভবত স্ক্রিপ্টে ফাইলটি টানুন এবং ছাড়ছেন এবং তারপরে ফাইলনামটি আর্গুমেন্ট হিসাবে পড়বেন? ( মাইন্ডলেসটেকনোলজি.ওয়ার্ডপ্রেস.com / 2008 / 03 / 29/… ) এটি প্রথমে শারীরিকভাবে অনুলিপি করার সাথে জড়িত না থাকলে এটি খুব সহজ করে তুলবে। আমি উইন্ডোজ বাক্স এটিএম তে নেই তাই এটি কীভাবে আচরণ করে তা পরীক্ষা করতে পারি না। আপনার যদি বেশ কয়েকটি মেশিনে ইনস্টল করার প্রয়োজন হয় তবে আপনি রেজিস্ট্রি হ্যাকটি একটি সহজেই একটি .reg ফাইলটিতে স্থাপন করতে পারেন।
SQDK

বিকল্প হিসাবে আপনার কাছে একটি বাট ফাইল থাকতে পারে আর্গুমেন্ট হিসাবে স্ক্রিপ্টের ফাইল নামটি। এটি কোনও রেজিস্ট্রি হ্যাক জড়িত না।
SQDK

2

EasyGUI দেখুন, খুব সহজ মডিউল ব্যবহার করা উচিত যা কাজটি করা উচিত - http://easygui.sourceforge.net/

আপনি এই এপিআই ডকুমেন্টেশন পৃষ্ঠাতে ফাইলপেনবক্স ফাংশনটি ব্যবহার করবেন - https://easygui.readthedocs.io/en/latest/api.html


1
দুঃখিত - আমার ফোনে তাই আমি উদাহরণ দিতে পারি না। আপনি ফাইলোফোনবক্সটি ব্যবহার করতে চান - ferg.org/easygui/easygui.html#-fileopenbox
টাইমক

দ্বিতীয় লিঙ্কটি নষ্ট হয়ে গেছে।
থমাস অ্যান্ড্রুজ

1

pywin32GetOpenFileNamewin32 ফাংশনে অ্যাক্সেস সরবরাহ করে। উদাহরণ থেকে

import win32gui, win32con, os

filter='Python Scripts\0*.py;*.pyw;*.pys\0Text files\0*.txt\0'
customfilter='Other file types\0*.*\0'
fname, customfilter, flags=win32gui.GetOpenFileNameW(
    InitialDir=os.environ['temp'],
    Flags=win32con.OFN_ALLOWMULTISELECT|win32con.OFN_EXPLORER,
    File='somefilename', DefExt='py',
    Title='GetOpenFileNameW',
    Filter=filter,
    CustomFilter=customfilter,
    FilterIndex=0)

print 'open file names:', repr(fname)
print 'filter used:', repr(customfilter)
print 'Flags:', flags
for k,v in win32con.__dict__.items():
    if k.startswith('OFN_') and flags & v:
        print '\t'+k

1

টিনকিটার (পাইথন 2) বা টিন্টার (পাইথন 3) ব্যবহার করে ফাইল খোলা ডায়ালগ প্রদর্শিত সম্ভব (অন্য উত্তরগুলি এখানে দেখুন)। তবে দয়া করে লক্ষ্য করুন যে সেই ডায়ালগটির ব্যবহারকারীর ইন্টারফেসটি পুরানো এবং উইন্ডোজ 10 এ উপলব্ধ নতুন ফাইল ওপেন ডায়ালগগুলির সাথে মিলে না।

তদ্ব্যতীত - আপনি যদি নিজের অ্যাপ্লিকেশনটিতে অজগর সমর্থন এম্বেড করার পথে খুঁজছেন - আপনি শীঘ্রই খুঁজে পাবেন যে টিন্টেটার লাইব্রেরি ওপেন সোর্স কোড নয় এবং আরও বেশি - এটি বাণিজ্যিক গ্রন্থাগার।

(উদাহরণস্বরূপ "অ্যাক্টিভেটল মূল্য নির্ধারণের জন্য অনুসন্ধান" আপনাকে এই ওয়েব পৃষ্ঠায় নিয়ে যাবে: https://reviews.financeonline.com/p/activetcl/ )

সুতরাং টিন্টার লাইব্রেরিতে অজস্রটি এম্বেড করতে ইচ্ছুক যে কোনও অ্যাপ্লিকেশনটির জন্য অর্থ ব্যয় হবে।

আমি নিজেই পাইথোননেট লাইব্রেরিটি সন্ধান করতে পেরেছি:

(এমআইটি লাইসেন্স)

নিম্নলিখিত কমান্ড ব্যবহার করে পাইথোননেট ইনস্টল করা সম্ভব:

pip3 install pythonnet

এবং এখানে আপনি ওপেন ফাইল ডায়ালগ ব্যবহারের জন্য কাজের উদাহরণ খুঁজে পেতে পারেন:

https://stackoverflow.com/a/50446803/2338477

আমি এখানে একটি উদাহরণও অনুলিপি করি:

import sys
import ctypes
co_initialize = ctypes.windll.ole32.CoInitialize
#   Force STA mode
co_initialize(None)

import clr 

clr.AddReference('System.Windows.Forms')

from System.Windows.Forms import OpenFileDialog

file_dialog = OpenFileDialog()
ret = file_dialog.ShowDialog()
if ret != 1:
    print("Cancelled")
    sys.exit()

print(file_dialog.FileName)

আপনি যদি আরও জটিল ইউজার ইন্টারফেসও মিস করেন - পাইথোননেট গিমে ডেমো ফোল্ডারটি দেখুন ।

আমি অন্যান্য ওএসের বহনযোগ্যতা সম্পর্কে নিশ্চিত নই, চেষ্টা করে দেখিনি, তবে। নেট 5 টি একাধিক ওএসের অনুসন্ধানে অনুসন্ধান করার পরিকল্পনা করা হয়েছে (অনুসন্ধান "। নেট 5 প্ল্যাটফর্ম", https://devblogs.microsoft.com/dotnet/introducing -net-5 / ) - সুতরাং এই প্রযুক্তিটি ভবিষ্যতের প্রমাণও।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.