"""
Miscellaneous user interface utilities for
- selecting files or directories.
If nothing or a non-existing file/direcoty is selected, the return is "0".
Otherwise the file/directory is returned.
- waitbar
"""
# author: Thomas Haslwanter; date: April-2021
import os
# import matplotlib.pyplot as plt
# plt.switch_backend('agg')
import sys
import tkinter
import tkinter.filedialog as tkf
from tkinter import messagebox
[docs]def progressbar(it, prefix = "", size = 60):
"""
Shows a progress-bar on the commandline.
This has the advantage that you don't need to bother with windows
managers. Nifty coding!
Parameters
----------
it : integer array
index variable
prefix : string
Text preceding the progress-bar
size : integer
Length of progress-bar
Examples
--------
>>> import time
>>> for ii in progressbar(range(50), 'Computing ', 25):
>>> #print(ii)
>>> time.sleep(0.05)
"""
count = len(it)
def _show(_i):
# Helper function to print the desired information line.
x = int(size*_i/count)
sys.stdout.write("%s[%s%s] %i/%i\r" % (prefix, "#"*x, "."*(size-x), _i, count))
# sys.stdout.flush()
_show(0)
for i, item in enumerate(it):
yield item
_show(i+1)
sys.stdout.write("\n")
sys.stdout.flush()
[docs]def get_file(FilterSpec='*', DialogTitle='Select File: ', DefaultName=''):
"""
Selecting an existing file.
Parameters
----------
FilterSpec : query-string
File filters
DialogTitle : string
Window title
DefaultName : string
Can be a directory AND filename
Returns
-------
filename : string
selected existing file
pathname: string
selected path
Examples
--------
>>> (myFile, myPath) = skinematics.ui.getfile('*.py', 'Testing file-selection', 'c:\\temp\\test.py')
"""
root = tkinter.Tk()
root.withdraw()
root.attributes("-topmost", True)
fullInFile = tkf.askopenfilename(initialfile=DefaultName,
title=DialogTitle, filetypes=[('all files','*'), ('Select',
FilterSpec)])
# Close the Tk-window manager again
root.destroy()
if not os.path.exists(fullInFile):
return (0, 0)
else:
print('Selection: ' + fullInFile)
dirName = os.path.dirname(fullInFile)
fileName = os.path.basename(fullInFile)
return (fileName, dirName)
[docs]def save_file(FilterSpec='*',DialogTitle='Save File: ', DefaultName=''):
"""
Selecting an existing or new file:
Parameters
----------
FilterSpec : string
File filters.
DialogTitle : string
Window title.
DefaultName : string
Can be a directory AND filename.
Returns
-------
filename : string
Selected file.
pathname : string
Selecte path.
Examples
--------
>>> (myFile, myPath) = skinematics.ui.savefile('*.py', 'Testing file-selection', 'c:\\temp\\test.py')
"""
root = tkinter.Tk()
root.withdraw()
root.attributes("-topmost", True)
outFile = tkf.asksaveasfile(mode='w', title=DialogTitle, initialfile=DefaultName, filetypes=[('Save as', FilterSpec)])
# Close the Tk-window manager again
root.destroy()
if outFile == None:
(fileName, dirName) = (0,0)
else:
fullOutFile = outFile.name
print('Selection: ' + fullOutFile)
dirName = os.path.dirname(fullOutFile)
fileName = os.path.basename(fullOutFile)
return (fileName, dirName)
[docs]def get_dir(DialogTitle='Select Directory', DefaultName='.'):
""" Select a directory
Parameters
----------
DialogTitle : string
Window title
DefaultName : string
Can be a directory AND filename
Returns
-------
directory : string
Selected directory.
Examples
--------
>>> myDir = skinematics.ui.getdir('c:\\temp', 'Pick your directory')
"""
root = tkinter.Tk()
root.withdraw()
root.attributes("-topmost", True)
fullDir = tkf.askdirectory(initialdir=DefaultName, title=DialogTitle)
# Close the Tk-window manager again
root.destroy()
if not os.path.exists(fullDir):
return 0
else:
print('Selection: ' + fullDir)
return fullDir
[docs]def askquestion (DialogTitle='Interactive Selection', Question='Are we done yet?'):
""" Ask the user a yes/no question
Parameters
----------
DialogTitle : string
Window title
Question : string
Question to the user
Returns
-------
yes_no : boolean
Selected answer.
Examples
--------
>>> my_wish = sksound.misc.askquestion('Work or Play', 'Do you want to go home?')
"""
root = tkinter.Tk()
root.withdraw()
# On some systems, this dialog remains in the back
# To overcome that, move it up. Unfortunately, this somehow also makes the
# "root" visible again :(
# To be fixed sometime ...
to_top = tkinter.Toplevel(root)
yes_no = messagebox.askyesno(title=DialogTitle, message=Question, master=to_top)
# Close the Tk-window manager again
root.destroy()
return yes_no
if __name__ == "__main__":
# Test functions
"""
result = askquestion(DialogTitle='Interactive choice',
Question='Are we done yet?')
print('You have selected {0}'.format(result))
import time
for ii in progressbar(range(50), 'Computing ', 25):
#print(ii)
time.sleep(0.05)
(myFile, myPath) = get_file('*.eps', 'Testing file-selection', r'c:\temp\test.eps')
if myFile == 0:
print(0)
else:
print('File: %s, Path: %s' % (myFile, myPath))
(myFile, myPath) = save_file('*.txt', 'Testing saving-selection', r'c:\temp\test.txt')
myDir = get_dir()
print(myDir)
root = tkinter.Tk()
app = Demo1(root, sys._getframe())
root.mainloop()
"""