2017-02-16 9 views
-2

Я пытаюсь получить поле ввода в моем основном окне tkinter, однако, если я положил e= tk.Entry(...) в свой __init__, я получаю сообщение об ошибке. При размещении за пределами init он создает собственное окно. Запись работает и выполняет свою функцию, но я хочу, чтобы она была частью главного окна.Tkinter: Entry появляется как собственное окно

class ChatApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     container = tk.Frame(self) 

     container.grid() 

     #container.grid_rowconfigure(0, weight=1) 
     #container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     frame = StartPage(container, self) 
     frame_ = PageOne(container, self) 

     self.frames[StartPage] = frame 
     self.frames[PageOne] = frame_ 

     frame.grid(row=0, column=0, sticky="nsew") 
     frame_.grid(row=0, column=0, sticky="nsew") 

     self.show_frame(StartPage) 

    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 

class StartPage(tk.Frame): 

    def __init__(self, parent, controller,*args): 
     tk.Frame.__init__(self, parent) 
     usrlabel = tk.Label(self, text="Input Username", font=LARGE_FONT) 
     usrlabel.grid(pady=10,padx=10) 
     usrentry = tk.Entry(self) 
     usrentry.grid() 
     global uu 
     uu = usrentry.get() 

     #command within button cant throw args to funcs. Use lambda to throw those args to the func instead 
     button1 = tk.Button(self, text="Visit Page 1",command= 
          lambda: controller.show_frame(PageOne)) 
     button1.grid() 

class PageOne(tk.Frame): 

    def __init__(self, parent, controller): 
     e = tk.Entry(self,tk.Frame,width= 40) 
     tk.Frame.__init__(self, parent) 
     label = tk.Label(self, text="Page 1", font=LARGE_FONT) 
     label.grid() 

     #command within button cant throw args to funcs. Use lambda to throw those args to the func instead 
     button1 = tk.Button(self, text="Start Page",command=lambda:controller.show_frame(StartPage)) 
     button1.grid() 

     file = open("htfl.txt","r") #opens file 
     #print(file.read(1)) 
     a = file.read() 
     b = file.read() 
     print(file.read()) 

     #entry 

     self.e.grid(row=10,column=0,sticky = "W") 
     #text 
     T = tk.Text(self, height=9, width=30) 
     T.grid(row=3,column= 0) 
     #T.insert(END,a) 
     b = tk.Button(self, text="Send", width=10, command=self.callback).grid(row=10,column=2) 

    def callback(self,*args): 
     global uu 
     f = open("htfl.txt","a") 
     f.write("Douglas:"+self.e.get()+"\n") 
     self.e.delete(0, 'end') 

Я попытался положить e = tk.Entry(self,width= 40) в __init__ и получил следующие ошибки

Traceback (most recent call last): 
    File "C:\Users\Douglas Rouse\Google Drive\Python\New structure.py", line 94, in <module> 
    app = ChatApp() 
    File "C:\Users\Douglas Rouse\Google Drive\Python\New structure.py", line 19, in __init__ 
    frame_ = PageOne(container, self) 
    File "C:\Users\Douglas Rouse\Google Drive\Python\New structure.py", line 52, in __init__ 
    e = tk.Entry(self,width= 40) 
    File "C:\Users\Douglas Rouse\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 2516, in __init__ 
    Widget.__init__(self, master, 'entry', cnf, kw) 
    File "C:\Users\Douglas Rouse\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 2132, in __init__ 
    BaseWidget._setup(self, master, cnf) 
    File "C:\Users\Douglas Rouse\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 2110, in _setup 
    self.tk = master.tk 
AttributeError: 'PageOne' object has no attribute 'tk' 
+0

Вы пробовали положить его в '__init__' и указав корневое окно, то есть' self.e = tk.Entry (я, ширина = 40) '? Я имею в виду, вы сделали это с помощью 'label'. – TigerhawkT3

+0

@ TigerhawkT3 Да, тогда я тоже получаю сообщение об ошибке. –

+2

, пожалуйста, не изменяйте свой вопрос и полностью меняйте то, что вы просите. Это сделало мой ответ бесполезным. Кроме того, пожалуйста, прочитайте и следуйте советам здесь: [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) –

ответ

0

я звоню запись до инициализации самого кадра. все, что я должен был сделать:

def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.e = tk.Entry(self,width= 40) 
     label = tk.Label(self, text="Page 1", font=LARGE_FONT) 
     label.grid()