2017-10-16 8 views
0

Je rencontre des problèmes pour créer un widget d'entrée avec tkinter. J'ai importé les modules nécessaires et j'ai déjà créé plusieurs boutons et cases à cocher. Cependant, je ne peux pas comprendre comment initialiser correctement l'entrée. Voici mon code correspondant:Impossible de créer un widget d'entrée avec tkinter

# 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() 

Je ne vois aucun retraçage, mais je ne peux pas sembler obtenir ma boîte d'entrée pour apparaître. Qu'est-ce que je fais mal?

EDIT: code entier ajouté.

+1

Pouvez-vous montrer le reste du code? – mentalita

+0

Bien sûr, voir mon édition pour le reste du code. – NoOrangeJuice

Répondre

2

Le problème avec votre champ de saisie est que vous ne l'avez pas dit ce que cadre/fenêtre pour être placé dans

changement.

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

A:Assurez-vous de toujours indiquer la fenêtre/l'image dans laquelle un widget sera placé en tant que premier argument. Dans ce cas, il s'agit de self car self fait référence à un cadre. Gardez à l'esprit que votre programme ne pourra pas utiliser la chaîne get() à l'intérieur de votre champ de saisie car vous ne l'avez pas défini en tant qu'attribut de classe. Donc, très probablement, vous devrez changer

Ce:

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

à ceci: pour pouvoir lire

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

Ce changement sera nécessaire pour que le reste de votre application ou écrire dans le widget d'entrée.

+0

Bravo cela a parfaitement fonctionné. C'est bon de savoir que, au lieu d'utiliser le maître, j'ai encore besoin de fournir soi-même. Merci d'avoir attrapé l'attribut d'entrée, je n'ai pas encore réussi à implémenter 'get()' mais vous m'avez sauvé du temps. – NoOrangeJuice

-1

changement

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

à

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

J'ai essayé de le faire mais je reçois une erreur non définie. Quand j'ai créé mes cases, j'ai seulement besoin de 'Checkbutton'. Y a-t-il une raison pour laquelle 'Entry' requiert spécifiquement' tk.'? Merci pour votre réponse. – NoOrangeJuice

+0

personne: Ceci n'est pas exact car l'OP n'importait pas «tkinter as tk» mais l'importait en tant que *. –

+0

Lorsque j'ai posté la réponse, la ligne d'importation n'était pas là, juste la classe Application (Frame, Tk). J'ai fait une hypothèse – person