mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Tkinter, step 4: merge simple- and filedialog modules.
This commit is contained in:
parent
ac6060cc5c
commit
2e08136b3c
4 changed files with 516 additions and 535 deletions
|
@ -6,10 +6,15 @@ Classes:
|
|||
- LoadFileDialog
|
||||
- SaveFileDialog
|
||||
|
||||
This module also presents tk common file dialogues, it provides interfaces
|
||||
to the native file dialogues available in Tk 4.2 and newer, and the
|
||||
directory dialogue available in Tk 8.3 and newer.
|
||||
These interfaces were written by Fredrik Lundh, May 1997.
|
||||
"""
|
||||
|
||||
from tkinter import *
|
||||
from tkinter.dialog import Dialog
|
||||
from tkinter import commondialog
|
||||
|
||||
import os
|
||||
import fnmatch
|
||||
|
@ -259,6 +264,176 @@ class SaveFileDialog(FileDialog):
|
|||
self.quit(file)
|
||||
|
||||
|
||||
|
||||
# For the following classes and modules:
|
||||
#
|
||||
# options (all have default values):
|
||||
#
|
||||
# - defaultextension: added to filename if not explicitly given
|
||||
#
|
||||
# - filetypes: sequence of (label, pattern) tuples. the same pattern
|
||||
# may occur with several patterns. use "*" as pattern to indicate
|
||||
# all files.
|
||||
#
|
||||
# - initialdir: initial directory. preserved by dialog instance.
|
||||
#
|
||||
# - initialfile: initial file (ignored by the open dialog). preserved
|
||||
# by dialog instance.
|
||||
#
|
||||
# - parent: which window to place the dialog on top of
|
||||
#
|
||||
# - title: dialog title
|
||||
#
|
||||
# - multiple: if true user may select more than one file
|
||||
#
|
||||
# options for the directory chooser:
|
||||
#
|
||||
# - initialdir, parent, title: see above
|
||||
#
|
||||
# - mustexist: if true, user must pick an existing directory
|
||||
#
|
||||
|
||||
|
||||
class _Dialog(commondialog.Dialog):
|
||||
|
||||
def _fixoptions(self):
|
||||
try:
|
||||
# make sure "filetypes" is a tuple
|
||||
self.options["filetypes"] = tuple(self.options["filetypes"])
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
def _fixresult(self, widget, result):
|
||||
if result:
|
||||
# keep directory and filename until next time
|
||||
import os
|
||||
# convert Tcl path objects to strings
|
||||
try:
|
||||
result = result.string
|
||||
except AttributeError:
|
||||
# it already is a string
|
||||
pass
|
||||
path, file = os.path.split(result)
|
||||
self.options["initialdir"] = path
|
||||
self.options["initialfile"] = file
|
||||
self.filename = result # compatibility
|
||||
return result
|
||||
|
||||
|
||||
#
|
||||
# file dialogs
|
||||
|
||||
class Open(_Dialog):
|
||||
"Ask for a filename to open"
|
||||
|
||||
command = "tk_getOpenFile"
|
||||
|
||||
def _fixresult(self, widget, result):
|
||||
if isinstance(result, tuple):
|
||||
# multiple results:
|
||||
result = tuple([getattr(r, "string", r) for r in result])
|
||||
if result:
|
||||
import os
|
||||
path, file = os.path.split(result[0])
|
||||
self.options["initialdir"] = path
|
||||
# don't set initialfile or filename, as we have multiple of these
|
||||
return result
|
||||
if not widget.tk.wantobjects() and "multiple" in self.options:
|
||||
# Need to split result explicitly
|
||||
return self._fixresult(widget, widget.tk.splitlist(result))
|
||||
return _Dialog._fixresult(self, widget, result)
|
||||
|
||||
class SaveAs(_Dialog):
|
||||
"Ask for a filename to save as"
|
||||
|
||||
command = "tk_getSaveFile"
|
||||
|
||||
|
||||
# the directory dialog has its own _fix routines.
|
||||
class Directory(Dialog):
|
||||
"Ask for a directory"
|
||||
|
||||
command = "tk_chooseDirectory"
|
||||
|
||||
def _fixresult(self, widget, result):
|
||||
if result:
|
||||
# convert Tcl path objects to strings
|
||||
try:
|
||||
result = result.string
|
||||
except AttributeError:
|
||||
# it already is a string
|
||||
pass
|
||||
# keep directory until next time
|
||||
self.options["initialdir"] = result
|
||||
self.directory = result # compatibility
|
||||
return result
|
||||
|
||||
#
|
||||
# convenience stuff
|
||||
|
||||
def askopenfilename(**options):
|
||||
"Ask for a filename to open"
|
||||
|
||||
return Open(**options).show()
|
||||
|
||||
def asksaveasfilename(**options):
|
||||
"Ask for a filename to save as"
|
||||
|
||||
return SaveAs(**options).show()
|
||||
|
||||
def askopenfilenames(**options):
|
||||
"""Ask for multiple filenames to open
|
||||
|
||||
Returns a list of filenames or empty list if
|
||||
cancel button selected
|
||||
"""
|
||||
options["multiple"]=1
|
||||
return Open(**options).show()
|
||||
|
||||
# FIXME: are the following perhaps a bit too convenient?
|
||||
|
||||
def askopenfile(mode = "r", **options):
|
||||
"Ask for a filename to open, and returned the opened file"
|
||||
|
||||
filename = Open(**options).show()
|
||||
if filename:
|
||||
return open(filename, mode)
|
||||
return None
|
||||
|
||||
def askopenfiles(mode = "r", **options):
|
||||
"""Ask for multiple filenames and return the open file
|
||||
objects
|
||||
|
||||
returns a list of open file objects or an empty list if
|
||||
cancel selected
|
||||
"""
|
||||
|
||||
files = askopenfilenames(**options)
|
||||
if files:
|
||||
ofiles=[]
|
||||
for filename in files:
|
||||
ofiles.append(open(filename, mode))
|
||||
files=ofiles
|
||||
return files
|
||||
|
||||
|
||||
def asksaveasfile(mode = "w", **options):
|
||||
"Ask for a filename to save as, and returned the opened file"
|
||||
|
||||
filename = SaveAs(**options).show()
|
||||
if filename:
|
||||
return open(filename, mode)
|
||||
return None
|
||||
|
||||
def askdirectory (**options):
|
||||
"Ask for a directory, and return the file name"
|
||||
return Directory(**options).show()
|
||||
|
||||
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# test stuff
|
||||
|
||||
def test():
|
||||
"""Simple test program."""
|
||||
root = Tk()
|
||||
|
@ -269,6 +444,38 @@ def test():
|
|||
savefile = fd.go(key="test")
|
||||
print(loadfile, savefile)
|
||||
|
||||
# Since the file name may contain non-ASCII characters, we need
|
||||
# to find an encoding that likely supports the file name, and
|
||||
# displays correctly on the terminal.
|
||||
|
||||
# Start off with UTF-8
|
||||
enc = "utf-8"
|
||||
import sys
|
||||
|
||||
# See whether CODESET is defined
|
||||
try:
|
||||
import locale
|
||||
locale.setlocale(locale.LC_ALL,'')
|
||||
enc = locale.nl_langinfo(locale.CODESET)
|
||||
except (ImportError, AttributeError):
|
||||
pass
|
||||
|
||||
# dialog for openening files
|
||||
|
||||
openfilename=askopenfilename(filetypes=[("all files", "*")])
|
||||
try:
|
||||
fp=open(openfilename,"r")
|
||||
fp.close()
|
||||
except:
|
||||
print("Could not open File: ")
|
||||
print(sys.exc_info()[1])
|
||||
|
||||
print("open", openfilename.encode(enc))
|
||||
|
||||
# dialog for saving files
|
||||
|
||||
saveasfilename=asksaveasfilename()
|
||||
print("saveas", saveasfilename.encode(enc))
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue