2014-12-25 1 views
1

Я пытаюсь сделать программу для отображения метки в графическом интерфейсе 'HI' только после нажатия кнопки 'CLICK' в том же графическом интерфейсе.Щелкнуть по метке в том же gui после нажатия кнопки

Мой код:

import Tkinter as tki 
class App(object): 
    def __init__(self,root): 
     self.root = root 

     txt_frm = tki.Frame(self.root, width=900, height=900) 
     txt_frm.pack(fill="both", expand=True) 
     button3 = tki.Button(txt_frm,text="CLICK", command = self.retrieve_inpu) 
     button3.grid(column=0,row=2) 


    def retrieve_inpu(self): 

     label = tki.Label(txt_frm,text='HI') 
     label.grid(column=0,row=3) 
root = tki.Tk() 
app = App(root) 
root.mainloop() 

Но я получаю сообщение об ошибке, как:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__ 
    return self.func(*args) 
    File "C:/Python27/teste.py", line 14, in retrieve_inpu 
    label = tki.Label(txt_frm,text='HI') 
NameError: global name 'txt_frm' is not defined 

Пожалуйста, помогите мне, чтобы отобразить метку 'HI' в том же графическом интерфейсе после нажатия на кнопку 'CLICK'.

ответ

2

txt_frm в настоящее время является локальным для метода __init__. Другими словами, нет доступа к нему из-за пределов __init__. Это означает, что когда вы используете его внутри retrieve_inpu, Python не сможет найти имя и поэтому будет поднимать NameError.

Вы можете решить эту проблему, просто делает txt_frm и экземпляр атрибута App:

self.txt_frm = tki.Frame(self.root, width=900, height=900) 
self.txt_frm.pack(fill="both", expand=True) 

Теперь txt_frm доступен через self, что означает, что вы можете использовать его внутри retrieve_inpu:

label = tki.Label(self.txt_frm,text='HI') 
+0

мог u, пожалуйста, перепечатайте весь код? потому что все-таки я получаю ту же ошибку. –

+0

Это потому, что при создании кнопки вы также должны использовать 'self.txt_frm':' button3 = tki.Button (self.txt_frm, ...) '. 'txt_frm' теперь является атрибутом экземпляра' App', поэтому к нему всегда нужно обращаться через 'self'. – iCodez

Смежные вопросы