Chọn một tệp trong Python với Hộp thoại đơn giản


127

Tôi muốn lấy đường dẫn tệp làm đầu vào trong ứng dụng bảng điều khiển Python của mình.

Hiện tại tôi chỉ có thể yêu cầu đường dẫn đầy đủ làm đầu vào trong bảng điều khiển.

Có cách nào để kích hoạt giao diện người dùng đơn giản nơi người dùng có thể chọn tệp thay vì nhập đường dẫn đầy đủ không?

Câu trả lời:


211

Làm thế nào về việc sử dụng tkinter?

from Tkinter import Tk
from tkinter.filedialog import askopenfilename

Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
print(filename)

Làm xong!


Tôi đã nhận được đối tượng TypeError: 'module' không thể gọi được trên Tk (). Rút () - có ý tưởng nào không?
dùng391339

1
Tôi đã phải làm root = Tk.Tk () rồi root.withdraw (). Bây giờ cửa sổ hộp thoại mở không đóng.
dùng391339

20
Sử dụng Python 3.x và tôi tin rằng "Tkinter" thực sự được coi là chữ thường, "tkinter".
WestAce

1
@WestAce vâng, nó đã được đổi từ "Tkinter" thành "tkinter" cho Python3
Ben

1
Có cách nào chỉ cho phép một số loại tệp nhất định không? ví dụ Tôi muốn người dùng chỉ chọn các tệp hình ảnh
Chaianu Shinde

85

Phiên bản Python 3.x của câu trả lời của Etaoin về tính đầy đủ:

from tkinter.filedialog import askopenfilename
filename = askopenfilename()

7
Đối với tổng song song, có lẽ cũng nên có import tkinter+ tkinter.Tk().withdraw().
imallett

3
cái này không hoạt động với tôi (trên Mac, Python 3.6.6) Cửa sổ GUI mở nhưng bạn không thể đóng nó và bạn nhận được quả bóng tử thần
Ben Vincent

1
tương tự ở đây hộp thoại tập tin sẽ không đóng
Cabara

1
mã này giống hệt như câu trả lời được chấp nhận nhưng không đầy đủ.
eric

Trên Mac 10.14.6, điều này đã mở Trình tìm tệp, sau đó nó bị sập toàn bộ hệ thống :(
gaya

29

Với EasyGui (tài liệu được tạo bởi pydocepydoc cho phiên bản 0.96):

import easygui
print(easygui.fileopenbox())

Để cài đặt:

pip install easygui

Bản giới thiệu:

import easygui
easygui.egdemo()

4
Đây là giải pháp tốt nhất cho đến nay. Lý do chính là easygui là một gói pip và dễ cài đặt
Yonatan Naor

2
Trên Mac OSX 10.14.5, python 3.6.7, easygui 0.98.1 Tôi gặp một sự cố khủng khiếp khi thử điều này. Không được khuyến khích.
Christopher Barber

Tại sao tôi nhận được invalid syntaxlỗi print easygui.diropenbox()?
Bricktop


1
@ChristopherBarber tương tự với 10.14.6. Python cứ bỏ việc.
gaya

11

Trong Python 2 sử dụng tkFileDialogmô-đun.

import tkFileDialog

tkFileDialog.askopenfilename()

Trong Python 3 sử dụng tkinter.filedialogmô-đun.

import tkinter.filedialog

tkinter.filedialog.askopenfilename()

Nó không phải là một phần của cài đặt tiêu chuẩn trong Python 3.
Miguelmorin

3

Một lựa chọn khác để xem xét là Zenity: http://freecode.com/projects/zenity .

Tôi đã gặp tình huống phát triển ứng dụng máy chủ Python (không có thành phần GUI) và do đó tôi không muốn đưa ra sự phụ thuộc vào bất kỳ bộ công cụ GUI python nào, nhưng tôi muốn một số tập lệnh gỡ lỗi của mình được tham số hóa bởi các tệp đầu vào và muốn Trực quan nhắc người dùng cho một tệp nếu họ không chỉ định một tệp trên dòng lệnh. Zenity là một sự phù hợp hoàn hảo. Để đạt được điều này, hãy gọi "zenity --file-select" bằng cách sử dụng mô đun quy trình con và nắm bắt thiết bị xuất chuẩn. Tất nhiên giải pháp này không dành riêng cho Python.

Zenity hỗ trợ nhiều nền tảng và tình cờ đã được cài đặt trên các máy chủ dev của chúng tôi để nó tạo điều kiện cho việc gỡ lỗi / phát triển của chúng tôi mà không gây ra sự phụ thuộc không mong muốn.


0

Tôi đã thu được kết quả tốt hơn với wxPython so với tkinter, như được đề xuất trong câu trả lời này cho câu hỏi trùng lặp sau:

https://stackoverflow.com/a/9319832

Phiên bản wxPython đã tạo ra hộp thoại tệp trông giống như hộp thoại tệp mở từ bất kỳ ứng dụng nào khác trên bản cài đặt OpenSUSE Tumbleweed của tôi với máy tính để bàn xfce, trong khi tkinter tạo ra thứ gì đó chật chội và khó đọc với giao diện cuộn bên lạ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.