The problem is the function readfile() returns a variable filetext, which contains the all the text after doing the opne and read operations.
In you main function you call readfile(file) and give it the proper argument when it returns filetext it's not returning it to anything. So the data in filetext goes down the sewers so to speak. Then in the next line you call readfile() again, but with no argument, which I'm assuming gives you an error explaining just that.
You have to understand when you call a function, the variables inside that function go through whatever process they go through but once the function is done running and it returns whatever value those variables are discarded until the function is called again, and it's starts afresh. A function is basically a little program inside your program.
So:
def main():
....''' Read and print a file's contents. '''
....file = input(str('Name of file? '))
....readfile(file)
....contents = readfile()
....print(contents)
should become:
def main():
....''' Read and print a file's contents. '''
....file = input(str('Name of file? '))
....contents = readfile(file)
....print(contents)
Also the code can be improved. You don't need to use close() anymore if you use the with keyword. And raw_input() is better for two reasons. It always returns a string which is what you want in this case, and two, it always returns a string ^^, which not only gives you a definate starting point for any input (more pythonic) it's safer because with raw_input() 1 + 1 will give you "1 + 1" but with input() it will give you the number 2, whoops o.O! And also your accounting for the possibility of a filename which doesn't exists but theres no failover. The function will survive cos it has a try except block but all functions return a value even if you don't explicitly code it. So when it executes the except statement, it will return None by default. and 'None' will get printed, which is... awkward I guess.
def readfile(filename):
....try:
........with f as open(filename):
............return f.read()
....except IOError:
........# some failover code here for you
........print('oops!')
........return False
def main():
....file = raw_input('Name of file? ')
....contents = readfile(file)
....if contents: # somemore failover for examples sake
........print(contents)
....else:
........print(file, 'doesn't exist! helooo!!')