askopenfilename is not defined? - Making a browse button in tkinter - python

The purpose of my code is to create a GUI that has 4 buttons. 2 of them are to open a "browse" window, allowing the user to select a file from a directory. The third button is to allow the user to choose a directory for the final document to be outputted to. The fourth button applies my python code to both files, creating the outputted document.
In attempting to create the "browse" buttons, through many posts here on stackoverflow and on the internet, most solutions include the "askopenfilename" module that is often imported from tkFileDialog. However no matter how I word it, or whatever variations of tkinter modules that i import, I consistently receive the same error messages of "no module name tkfileDialog" or "askopenfilename is not defined".
Am I doing something wrong with my code? Is this a common error found in tkinter with python 3.6? How would one go about creating a browse button that finds a file and adds its path?
Please let me know!
Thanks.
Below is my code:
import os
#from tkFileDialog import *
from tkinter import filedialog
from Tkinter import *
from tkfileDialog import askopenfilename
content = 'apple'
file_path = 'squarebot'
#FUNCTIONS
def browsefunc(): #browse button to search for files
filename = askopenfilename()
infile = open(filename, 'r')
content = infile.read()
pathadd = os.path.dirname(filename)+filename
pathlabel.delete(0, END)
pathlabel.insert(0, pathadd)
return content
def open_file(): #also browse button to search for files - im trying various things to get this to work!
global content
global file_path
#filename = filedialog.askopenfilename(filetypes = (typeName {.txt},))
filename = askopenfilename()
infile = open(filename, 'r')
content = infile.read()
file_path = os.path.dirname(filename)
entry.delete(0, END)
entry.insert(0, file_path)
return content
def process_file(content): #process conversion code
print(content)
def directoryname():
directoryname = filedialog.askdirectory() # pick a folder
#GUI
root = Tk()
root.title('DCLF Converter')
root.geometry("598x600")
mf = Frame(root)
mf.pack()
f1 = Frame(mf, width=600, height=250) #DC file
f1.pack(fill=X)
f2 = Frame(mf, width=600, height=250) #LF file
f2.pack(fill=X)
f3 = Frame(mf, width=600, height=250) #destination folder
f3.pack(fill=X)
f4 = Frame(mf, width=600, height=250) #convert button
f4.pack()
file_path = StringVar
Label(f1,text="Select Your DC File (Only txt files)").grid(row=0, column=0, sticky='e') #DC button
entry = Entry(f1, width=50, textvariable=file_path)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Label(f2,text="Select Your LF File (Only csv files)").grid(row=0, column=0, sticky='e') #LF button
entry = Entry(f2, width=50, textvariable=file_path)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Label(f3,text="Select Your Destination Folder").grid(row=0, column=0, sticky='e') #destination folder button
entry = Entry(f3, width=50, textvariable=directoryname)
entry.grid(row=0,column=1,padx=2,pady=2,sticky='we',columnspan=25)
Button(f1, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#DC button
Button(f2, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#LF button
Button(f3, text="Browse", command=browsefunc).grid(row=0, column=27, sticky='ew', padx=8, pady=4)#destination folder button
Button(f4, text="RECONCILE NOW", width=32, command=lambda: process_file(content)).grid(sticky='ew', padx=10, pady=10)#convert button
root.mainloop()
P.S If you have found any other errors in my code please let me know. I am just starting with tkinter, and as such this may be attributed to something completely unrelated!
Much Appreciated

This is what I use in my code so it will work with the Tkinter module in both Python 2 and 3:
try:
import Tkinter as tk
import ttk
from tkFileDialog import askopenfilename
import tkMessageBox
import tkSimpleDialog
from tkSimpleDialog import Dialog
except ModuleNotFoundError: # Python 3
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
import tkinter.messagebox as tkMessageBox
import tkinter.simpledialog as tkSimpleDialog
from tkinter.simpledialog import Dialog
You asked to be notified any of other errors and I noticed the way you're using askopenfilename doesn't look right. Specifically, the filetypes keyword argument should be a sequence of two-element tuples containing file type names and patterns that will select what appears in the file listing. So for text files you would use:
filename = askopenfilename(filetypes=[('text files', '*.txt')])
I usually also include a generic pattern to allow easy access to files with other extensions thusly:
filename = askopenfilename(filetypes=[('text files', '*.txt'), ("all files", "*")])
Either way, it's important to remember to check the value returned because it might be the empty string it the user didn't select anything.

The problem was actually that I needed to append askopenfilename() to filedialog as mentioned by Roars in a now deleted comment!(it looks like this --> filedialog.askopenfilename().

The module name is misnamed.
Since the python version is 3.6 you need to use filedialog library. The includes should look something like this:
import os
from tkinter import *
import tkinter.filedialog
or
import os
from tkinter import *
from tkinter import filedialog

You can try this:
from tkinter.filedialog import askopenfilename

Related

Python tkinter printing unexpected newlines

Tkinter is adding newlines every 30 seconds:
Unwanted newlines
I'm running this in windows CMD.
I wrote a simple program to test this with a single askopenfilename() call in there.
When I click the browse button, it adds a newline, then after I choose the file and click begin, it adds a newline every 30 seconds while the program is "running":
import tkinter as tk
from tkinter import filedialog
from tkinter.filedialog import askdirectory
import time
def input1():
input1_path = tk.filedialog.askopenfilename()
input1_entry.delete(1, tk.END) # Remove current text in entry
input1_entry.insert(0, input1_path) # Insert the 'path'
#returns file paths for the input files and output directory
def begin():
global inputFileName
inputFileName = input1_entry.get()
master.destroy()
master = tk.Tk()
master.title('Omega NExT Archive Plotter')
one_frame = tk.Frame(master)
two_frame = tk.Frame(master)
line1 = tk.Frame(master, height=1, width=400, bg="grey80", relief='groove')
input1_path = tk.Label(one_frame, text="Archive File Input:")
input1_entry = tk.Entry(one_frame, text="", width=60)
browse1 = tk.Button(one_frame, text="Browse", command=input1)
begin_button = tk.Button(two_frame, text='Begin!', command=begin)
one_frame.pack(side=tk.TOP)
line1.pack(pady=10)
two_frame.pack(side=tk.BOTTOM)
input1_path.pack()
input1_entry.pack()
browse1.pack(pady=10)
begin_button.pack(pady=20, fill=tk.X)
master.mainloop()
time.sleep(1000000)
So I have other guys I work with running this on their computers, and it sounds like the problem is happening on our "managed" computers, but not the "less-than-managed" computers. It sounds like some kind of weird IT issue.

pygame not loading music file

I want to get a music on playlist and load it, but it's returning :
File "c:/Users/User/Documents/Python-testes/teste-2.py", line 25, in play
mixer.music.load(filenames)
pygame.error: Couldn't open 'C:/Python/Playlist/BØRNS - Electric Love.mp3'
I tried to use the .wav archive too but keeps returning this error, I'm using the vsc and the Python 3.8.8 version and pygame 2.0.1, this is my code:
from tkinter import Listbox, Tk
from tkinter import Label
from tkinter import Button
from tkinter import filedialog
from tkinter.constants import ACTIVE, END
from pygame import mixer
import pygame
def play_song():
filenames = list(filedialog.askopenfilenames(initialdir = "C:/Python/Playlist/", title = "Please select a file", filetypes=(("Mp3 Files", "*.mp3"),)))
for song in filenames:
song = song.split("/")
song = song[-1]
Playlist_box.insert(END,song)
def play():
filenames = Playlist_box.get(Playlist_box.curselection())
filenames = (f'C:/Python/Playlist/{filenames}')
mixer.init()
mixer.music.load(filenames)
mixer.music.play(loops=0)
root = Tk()
root.title('music')
label = Label(root,
text="choose the song").pack()
Playlist_box = Listbox(root, bg="black", fg="green", width=60)
Playlist_box.pack()
Button(root, text="choose your songs", command=play_song).pack()
Button(root, text="Play music", padx=12, bg="black", fg="white", command= play).pack()
root.mainloop()
I also tried to put the file path but the error is the same.
the error was in 'filenames' directory call,
i put :
filenames = (f'C:/Python/Playlist/{filenames}')
but it supose to be
filenames = (f'C:/Users/User/Documents/Python/Playlist/{filenames}')
he's working now, thank you people but it was just the call directory!!

How to use Tkinter to open file in folder using dropdown

I need help on how to make a button after I choose a folder in dropdown list.
For Example: I have 3 folders name "Folder 1","Folder 2" & "Folder 3". Inside "Folder 1", I have 5 excel(.xlsx) files. So I need help on how to read and display the data in 1 excel(.xlsx) file.
My current situation: I choose "Folder 1" in the dropdown menu. The next thing that I need is a button which can open the "Folder 1" and display the other list of 5 excel(.xlsx) files. And then, I can choose one of the excel(.xlsx) file and display the data inside the gui.
Here is my code.... Help me :'(
import os
import tkinter as tk
from tkinter import ttk
#import tkinter as tk
from tkinter import filedialog, messagebox, ttk
folder = r'C:\Users\test folder'
filelist = [fname for fname in os.listdir(folder)]
master = tk.Tk()
master.geometry('1200x800')
master.title('Select a file')
optmenu = ttk.Combobox(master, values=filelist, state='readonly')
optmenu.pack(fill='x')
master.mainloop()
You cannot just select and read a file's contents from tkinter. You have to write some other scripts for that reading part.
What the selection of filename does from tkinter combo box, is nothing but, get the particular file name as a string type.
However, in Python it's pretty straight forward to read a .xlsx file.
You can use Pandas module for that.
I have written the code for you to read the file, (but you have to install pandas)
from functools import partial
import os
import tkinter as tk
from tkinter import ttk
#import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import pandas
def get_selected_file_name(file_menu):
filename = file_menu.get()
print("file selected:", filename)
reader = pandas.read_excel(filename) # code to read excel file
# now you can use the `reader` object to get the file data
folder = os.path.realpath('./test_folder')
filelist = [fname for fname in os.listdir(folder)]
master = tk.Tk()
master.geometry('1200x800')
master.title('Select a file')
optmenu = ttk.Combobox(master, values=filelist, state='readonly')
optmenu.pack(fill='x')
button_select = tk.Button(master, text="Read File",
width=20,
height=7,
compound=tk.CENTER,
command=partial(get_selected_file_name, optmenu))
button_select.pack(side=tk.RIGHT)
master.mainloop()
The window should look somewhat like this:
I'd explore using the filedialog module in tkinter.
import tkinter as tk
from tkinter import filedialog
def load_file():
f_in = filedialog.askopenfilename( filetypes = [ ( 'Python', '*.py' ) ]) # Change to appropriate extension.
if len( f_in ) > 0:
with open( f_in, 'r' ) as file:
filedata = file.read()
print( filedata ) # printed to the terminal for simplicity.
# process it as required.
root = tk.Tk()
tk.Button( root, text = 'Find File', command = load_file ).grid()
root.mainloop()
askopenfilename allows a user to navigate the folder tree to find the correct file. Basic documentation

Open a specific file from a tkinter window

I have a tkinter window and need to press a button to open a csv file. For example:
root = Tk()
def open_file():
# show the csv file to the user
open_button = Button(root, text="Open", command=open_file)
open_button.pack()
Is there a way to do this, or something similar? I have tried using askopenfilename, but this doesn't seem to work for me, as it only opens the home directory.
Have a look at this link. As you can see from the link, the approaches differ a bit for python 2.7 and 3. Since python 2.7 is reaching the end of its life, I will demonstrate for python 3:
from tkinter import filedialog
from tkinter import *
root = Tk()
root.filename = filedialog.askopenfilename(initialdir = "/",title = "Select file",filetypes = (("jpeg files","*.jpg"),("all files","*.*")))
print (root.filename)
If you correctly installed tkinter using pip and filled all the arguments correctly it should work. Make sure the root directory actually exists and you specified syntactically correct (types of slashes matter).
You can also open the file picker even though it starts in the wrong directory. You can browse to the correct root directory and click ok and have the program print the directory. Then you'll know how to specify the root directory.
The following code show tkinter window with a button. When the user click the button and point to a CSV file, it would show the first few lines into a message box for show. I use pandas to open the CSV file.
import tkinter as tk
from tkinter import filedialog
import tkinter.messagebox as msgBox
import os
import pandas as pd
def open_file():
filename = filedialog.askopenfilename(initialdir=os.getcwd())
if(filename!=''):
df = pd.read_csv(filename, encoding = "ISO-8859-1", low_memory=False)
mR,mC=df.shape
cols = df.columns
num=5
pd.options.display.float_format = '{:.2f}'.format
msg=str(df.iloc[:num,:]) + '\n' + '...\n' + \
df.iloc[-num:,:].to_string(header=False) + '\n\n' + \
str(df.describe())
msgBox.showinfo(title="Data", message=msg)
root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
button = tk.Button(frame, text="Open", command=open_file)
button.pack(side = tk.LEFT)
root.mainloop()

how do i display search results in Python Tkinter window

I am not sure if this question has been asked, but i have looked around and did not find anything specific to my problem. I am trying to build an App to search though all dirs and sub dirs for specific files by there ext(.txt, .mkv, .mp3) mostly these extention will be used (if it matters) I would like the program to display the findings in a text area(text field of sort) to show file name and path.
I have a script that i am working with but i'm not sure if it is the best way to go about it. So my question is how do i binde the existing script to the button widget. i think? there could be more. again still learning.
If there is an easier way(less steps = cleaner code) please "show me the code" Documentation is always helpful but a "hands on" method works best for me. I am still learning Python and Tkinter now. This is not the complete code. i have removed everything that was not working for me so very incomplete.
from tkinter import *
from tkinter import ttk
import os
Root = Tk()
def help!
for dirname, dirnames, filenames in os.walk('/'):
for i in glob.glob(dirname+'/'+search+'*')
print (i)
This part writen for python 2.7 now being writen in 3.x
entry = ttk.Entry(root, text = 'Enter file name')
entry.pack()
button = ttk.Button(root, text = 'Search')
button.pack()
# Text field of sort goes here!
Thanks in advance
UPDATE:
Complete code.
Python 3x (it should be)
from tkinter import *
from tkinter import ttk
from sys import argv
import glob
import os
search_input = argv
#code in question
def find_files():
for dirname, dirnames, filenames in os.walk('/home'):
for i in glob.glob('/*'+searchinput):
listbox.insert(END, search_input)
#Code in question
main = Tk()
main.title("FSX")
main.geometry('640x480')
frame1 = ttk.Frame(main, height=200, width=400)
frame1.pack()
entry = Entry(frame1, width=30)
entry.pack()
button1 = ttk.Button(frame1, text="Search", command=find_files)
button1.pack()
button1.bind ('<ButtonPress>', lambda e: progressbar.start())
button2 = ttk.Button(frame1, text="Quit")
button2.pack()
button2.bind ('<ButtonPress>', lambda e: exit())
progressbar = ttk.Progressbar(frame1, orient = HORIZONTAL, length = 200, mode = 'indeterminate')
progressbar.pack()
#progressbar.start()
frame2 = ttk.Frame(main, height=200, width=400)
frame2.pack()
listbox = Listbox(frame2, height=200, width=400)
listbox.pack(fill=BOTH, expand=YES)
progressbar.stop()
main.mainloop()
this is the complete code. don't mind the progress bar issue.
I modified your example to show the found files in a listbox. In this example I use for log files in /tmp folder. The found files are saved in found_files list and then displayed in listbox.
from tkinter import *
from tkinter import ttk
import glob
import os
search = '*log'
found_files = []
for dirname, dirnames, filenames in os.walk('/tmp'):
for i in glob.glob(dirname+'/'+search+'*'):
print(i)
found_files.append(i)
root = Tk()
root.geometry( "640x480" );
listbox = Listbox(root)
for a_file in found_files:
listbox.insert(END, a_file)
listbox.pack(fill=BOTH, expand=YES)
root.mainloop()
labl = Label(text="{}".format(Result goes here))
labl.pack()
You could display your result like this one. Check for pack() parameters to design your label. What we do here is simple, text parameter of Label function is taking a specific data with format() function.
If your result is from a function, then you have to put it in your function. For example;
def fnk():
a=range(1,100)
lst1=[]
for t in range(6):
while len(lst1)<6:
x=random.choice(a)
if str(x) not in lst1:
lst1.append(str(x))
labl = Label(text="{}".format(" ".join(lst1)), fg="red",font="Times 35 bold")
labl.pack()
bttn = Button(text="Start", command = fnk)
bttn.pack(side=LEFT)
Like a program like this, whenever you click to Start button, you will see different six numbers on your screen in range(1,100). Better you put your results in a list, and put them in format() example above.

Categories