2017-10-16 103 views
0

我在使用tkinter创建入口小部件时遇到了一些麻烦。我已经导入了必要的模块,并且已经创建了几个按钮和复选框。但是我无法弄清楚如何正确地初始化Entry。这里是我的相关代码:无法使用tkinter创建Entry小部件

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

我没有看到任何回溯,但我似乎无法让我的输入框显示出来。我究竟做错了什么?

编辑:添加完整的代码。

+1

你可以显示你的其他代码吗? – mentalita

+0

当然,请参阅我编辑的其余代码。 – NoOrangeJuice

回答

2

与输入字段的问题是你还没有告诉它被放置在哪一帧/窗口

更改:

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

收件人:

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

确保您始终提供窗口/框架,即widget将作为第一个参数放置。在这种情况下,它是self,因为self表示一个帧。

请记住,您的程序将无法在输入字段中输入字符串get(),因为您尚未将其定义为类属性。所以,最有可能你会需要改变

此:

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

这样:

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

这种变化将是必要的,以便为您的应用程序的其余部分能读或写入入口小部件。

+0

干杯这完美的工作。这是很好的知道,代替使用主人,我仍然需要提供自我。感谢您获取入口属性,我还没有实现'get()',但是您为我节省了一些时间。 – NoOrangeJuice

-1

变化

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

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

我试过这样做,但我得到一个未定义的错误。当我创建我的复选框时,我只需要有'Checkbutton'。 'Entry'具体需要'tk.'吗?感谢您的答复。 – NoOrangeJuice

+0

person:这不正确,因为OP没有导入'tkinter as tk',而是导入为*。 –

+0

当我发布答案时,导入行不在那里,只是类Application(Frame,Tk)。我做了一个假设 – person

相关问题