Calvin Ellington
Calvin Ellington

Reputation: 723

Cannot create Entry widget with tkinter

I'm having some trouble creating an entry widget with tkinter. I've imported the necessary modules and have already created several buttons and check boxes. However I cannot figure out how to properly initialize the Entry. Here is my relevant code:

# Necessary Modules.------------------------------------------------------------
import win32com.client as win32
import re
from tkinter import *
from tkinter.filedialog import askopenfilename
import tkinter.messagebox


# Class for selecting the file.-------------------------------------------------
class FilenameClass():
    def __init__(self):
        self.location = 'User Import.txt'

    def getFile(self, identity):
        self.file_opt = options = {}
        options['defaultextension'] = '.txt'
        options['filetypes'] = [('Text Document (.txt)', '.txt'),
                                ('all files', '.*')]
        self.filename = askopenfilename(**self.file_opt)
        if self.filename:
            if 'User Import' in identity:
                self.location = self.filename
                app.get_txt_File['bg'] = '#0d0'
                user_file = open(self.filename, 'r')
                user_total = user_file.read()
                remove_lines = user_total.splitlines()
                for user in remove_lines:
                    regex_tab = re.compile('\\t')
                    user_info = regex_tab.split(user)
                    app.users.append(user_info)
            else:
                app.loadButton['bg'] = '#e10'


# Main Class.-------------------------------------------------------------------
class Application(Frame, Tk):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.users = []
        self.fileOBJtxt = FilenameClass()
        self.createWidgets()

    def createWidgets(self):

        # Define the default values for the options for the buttons
        # Grid layout options
        self.rowconfigure(0, minsize=5)
        self.width = 54
        self.grid(padx=5)
        self.loadButton_gopt = {'row':1,'column':1,'padx': 2, 'pady': 5}
        self.loadButton_wopt = {'width': round(self.width),'bg':'#e10'}
        self.loadButton()
        self.trainingCheckBox()
        self.signatureInput()

    def loadButton(self):
        '''Button that calls the filename class which allows the user to select
        the text file they wish to use.'''

        self.get_txt_File = Button(self, text="Load User List", \
        command=lambda: self.fileOBJtxt.getFile('User Import'))
        for key, value in self.loadButton_wopt.items():
            self.get_txt_File[key] = value
        self.get_txt_File.grid(**self.loadButton_gopt)

    def trainingCheckBox(self):

        self.training_var = IntVar()
        self.training = Checkbutton(text="Include training video?", \
        variable=self.training_var).grid(row=2, sticky=W)

    def signatureInput(self):

        Label(text="Signature Name").grid(row=4, sticky=W)
        entry = Entry(bg='#fff', width=50)
        entry.grid(row=4, column=1, columnspan=4)     

# Initialization parameters.----------------------------------------------------
if __name__ == '__main__':
    app = Application()
    app.master.title('User Notification Tool')
    app.master.geometry('405x550+100+100')
    app.master.resizable(width=False, height=False)
    app.mainloop()

I'm not seeing any tracebacks, but I can't seem to get my Entry box to show up. What am I doing wrong?

EDIT: added entire code.

Upvotes: 0

Views: 127

Answers (2)

person
person

Reputation: 458

Change

entry = Entry(bg='#fff', width=50)

to

entry = tk.Entry(bg='#fff', width=50)

Upvotes: -1

Mike - SMT
Mike - SMT

Reputation: 15226

The problem with your entry field is you have not told it what frame/window to be placed in.

Change:

entry = Entry(bg='#fff', width=50)

To:

entry = Entry(self, bg='#fff', width=50)

Make sure you always provide the window/frame that a widget is going to be placed in as the first argument. In this case it is self as self refers to a frame.

Keep in mind that your program will not be able to get() the string inside of your entry field because you have not defined it as a class attribute. So most likely you will need to change

This:

entry = Entry(bg='#fff', width=50)
entry.grid(row=4, column=1, columnspan=4)    

To This:

self.entry = Entry(self, bg='#fff', width=50)
self.entry.grid(row=4, column=1, columnspan=4)     

This change will be necessary in order for the rest of your application to be able to read or write to the entry widget.

Upvotes: 2

Related Questions