Error al intentar abrir el cuadro de diálogo desde un botón de widget en python

Soy nuevo en Python. Estoy tratando de abrir un cuadro de diálogo para obtener un valor dentro de un widget que ya tiene una lista de otros miembros del personal.

Pero recibe errores y no puede averiguar qué hacer.

Aquí está mi código:

import Tkinter,Tkconstants,tkFileDialog
from Tkinter import *
import csv
import numpy
import math
import numpy.random as nrnd
import matplotlib.pyplot as plt
import shutil
import tkMessageBox
global filesavepath
class App:
    def __init__(self,master):
        self.mymaster=master
        frame=Frame(master)
        frame.pack()
        self.importbutton=Button(frame,text='Import Data',command=self.importdata)
        self.importbutton.pack()
        self.executebutton=Button(frame,text='Execute',command=self.popup)
        self.executebutton.pack()
        self.distribution_rep=Button(frame,text='Repeat Purchase Score Distribution',command=self.distrepbutton)
        self.distribution_rep.pack()
        self.distribution_churn=Button(frame,text='Churn Probability Distribution',command=self.distchurnbutton)
       self.distribution_churn.pack()
       self.exitbutton=Button(frame,text='Exit',command=self.exitapp)
       self.exitbutton.pack()
       self.file_opt=options={}
       options['defaultextension']=''
       options['filetypes']=[('allfiles','.*'),('textfiles','.txt')]
       options['initialdir']='C:\\'
       options['initialfile']='myfile.txt'
       options['parent']=root
       options['title']='Thisisatitle'
    def importdata(self):
        filename=tkFileDialog.askopenfilename(**self.file_opt)
        filesavepath="C:/input_full.csv"
        shutil.copy2(filename,filesavepath)
        if filename:
            return open(filename,'r')

    def popup(self):
        top = self.top = Tkinter.Toplevel(self)
        myLabel = Tkinter.Label(top, text='Enter your username below')
        myLabel.pack()

        self.myEntryBox = Tkinter.Entry(top)
        self.myEntryBox.pack()

        mySubmitButton = Tkinter.Button(top, text='Done', command=self.execbutton)
        mySubmitButton.pack()
    def execbutton(self):
        if self.myEntryBox.get() != "":
            self.timevalue = self.myEntryBox.get()
            self.top.destroy()
        execfile("Repeat Purchase Algo in python v6")
        tkMessageBox.showinfo("Job Done", "Probability Computation completed")       
    def send(self):
        global timevalue
        timevalue=self.myEntryBox.get()
        self.top.destroy()
    def distrepbutton(self):
        plt.hist(prob,bins=10,normed=TRUE)
        plt.xlabel('Probability')
        plt.title('Histogram of Repeat Purchase Probability')
        plt.show()
    def distchurnbutton(self):
        plt.hist(churn_prob,bins=10,normed=TRUE)
        plt.ylabel('Probability')
        plt.title('Histogram of Churn Probability')
        plt.show()
    def exitapp(self):
        self.mymaster.destroy()

root=Tk()
root.title('Repeat Puchase Widget')
app=App(root)
root.mainloop()

Entonces, como puede ser evidente para usted, estoy importando un conjunto de datos con un botón Importar, ejecutando un análisis en otro código a través de un botón llamado Ejecutar y luego mostrando algunos gráficos.

Lo que quería era abrir una especie de ventana emergente al hacer clic en el botón "Ejecutar" que ingresará un valor. Pero estoy recibiendo el siguiente error:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:/Python27/widget_repeat_purchase_v4", line 42, in popup
    top = self.top = Tkinter.Toplevel(self)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 2017, in __init__
    BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1965, in __init__
    BaseWidget._setup(self, master, cnf)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1943, in _setup
    self.tk = master.tk
AttributeError: App instance has no attribute 'tk'

No tengo idea de qué hacer. Por favor ayuda.

preguntado el 29 de julio de 12 a las 06:07

Si se pregunta por qué hay tantas importaciones, tenga en cuenta que son para el segundo script de Python que estoy ejecutando aquí:

2 Respuestas

Cuando crea el widget de nivel superior, está pasando self como primer argumento. Tkinter requiere que este sea un widget principal. Sin embargo, en su código self no representa un widget.

En tu caso concreto quieres pasar self.mymaster más bien que self:

top = self.top = Tkinter.Toplevel(self.mymaster)

Respondido 29 Jul 12, 13:07

Gracias Bryan, funciono... no me di cuenta del error... de verdad gracias - Anindya Sankar Dey

Utilice las Tkinter.Toplevel() en lugar de Tkinter.Toplevel(self)

Respondido 29 Jul 12, 11:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.