IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Placement de widget "pack"


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2012
    Messages
    292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 292
    Points : 435
    Points
    435
    Par défaut Placement de widget "pack"
    Bonjour,

    Je voudrai pouvoir placer trois frames de widgets suivant la disposition suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
                                Tk.Button        Mean-Shift filtering parmeters
                                Tk.Button        Correction light parameters
                                Tk.Button        Method search markers
                                Tk.Button        Method fitting ellipse
    -------------------------------------------------------------------------------
                                                            |
                                                            |
                                                            |
                                                            |
    ImageTk   pil_image                              |                self.subclasses[i]
                                                            |
                                                            |
                                                            |
                                                            |
    Pour cela je définit plusieurs frame dans l'initalisation de la classe parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            Tk.Frame.__init__(self) 
            self.fr_Upper = Tk.Frame(self,borderwidth=1,relief = "raised") 
            self.fr_Lower = Tk.Frame(self,borderwidth=1,relief = "sunken") 
            self.fr_Lleft = Tk.Frame(self.fr_Lower,borderwidth=1,relief = "raised") 
            self.fr_Lright = Tk.Frame(self.fr_Lower,borderwidth=1,relief = "raised")    
            self.fr_Upper.pack(side = Tk.TOP, expand=1,fill=Tk.BOTH) 
            self.fr_Lower.pack(side = Tk.BOTTOM, expand=1,fill=Tk.BOTH) 
            self.fr_Lleft.pack(side = Tk.LEFT, expand=1,fill=Tk.BOTH) 
            self.fr_Lright.pack(side = Tk.RIGHT, expand=1,fill=Tk.BOTH) 
    Il me suffit logiquement par la suite de définir les bons frame pour widgets considérés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #Les Tk.Button en haut (dans __init__)
            self.buttons = [ Tk.Button(self.fr_Upper, text="Mean-Shift filtering parmeters", command = lambda x = None: self.change_frame(0)),
                        Tk.Button(self.fr_Upper, text="Correction light parameters", command = lambda x = None: self.change_frame(1)),
                        Tk.Button(self.fr_Upper, text="Method search markers", command = lambda x = None: self.change_frame(2)),
                        Tk.Button(self.fr_Upper, text="Method fitting ellipse", command = lambda x = None: self.change_frame(3)) ]
            self.pack_buttons()
        def pack_buttons(self):
            self.buttons[0].pack(fill=Tk.X)
            self.buttons[1].pack(fill=Tk.X)
            self.buttons[2].pack(fill=Tk.X)
            self.buttons[3].pack(fill=Tk.X)
    
    #Les  class enfants en bas à droite (dans __init__)
            self.subclasses = [ ParamMeanShift(self.fr_Lright, self.buttons[0]), ParamLight(self.fr_Lright, self.buttons[1]), ParamMarker(self.fr_Lright, self.buttons[2]), ParamFit(self.fr_Lright, self.buttons[3]) ]
    
        def change_frame(self, frame_choice):
            """ Destruction du frame de la sous class courante et initialisation de la nouvelle sousclasse """
            if (frame_choice!=3 and self.subclasses[frame_choice].current_image!=None ):
                global current_image        
                current_image = self.subclasses[frame_choice].current_image
                self.show_curr_img()
            self.subclasses[self.previous_choice].forget()
            self.buttons[self.previous_choice]["background"] = "white"
            self.pack_buttons()
            self.buttons[frame_choice]["background"]="green"
            self.subclasses[frame_choice].pack()
            self.previous_choice = frame_choice    
    
    # L'image pil en bas à gauche method de la class parent
        def show_curr_img(self):
            global current_image
            display = 1
            pil_image = None
            # Conversion de numpy.ndarray OU cv.iplimage vers PIL.Image (ImageTk.Image)
            if type(current_image) == cv.iplimage:
                if current_image.nChannels == 3:
                    pil_image = Image.fromstring(
                            'RGB', 
                            cv.GetSize(current_image), 
                            current_image.tostring(), 
                            'raw', 
                            'BGR', 
                            current_image.width*3, 
                            0)    
                elif current_image.nChannels==1:
                    pil_image = Image.fromstring(
                            'L', 
                            cv.GetSize(current_image), 
                            current_image.tostring())
                else:
                    print("Error: Format non compatible nchannels!=1 ou 3")
            elif type(current_image) == np.ndarray:
                if len(np.shape(current_image)) == 3 or len(np.shape(current_image)) == 2:
                    if current_image.dtype == np.uint32:
                        im8bit = np.zeros(np.shape(current_image), dtype = np.int8)
                        im8bit += np.floor(current_image*255/(np.max(current_image)-np.min(current_image)))
                        pil_image = Image.fromarray(im8bit)
                    else:
                        pil_image = Image.fromarray(current_image)
                else:
                    print("Error: Format non compatible nchannels!=1 ou 3")
            elif current_image==None:
                diplay=0
            else:
                display=0
                print("type d'image gérée")
            if display:
                pil_image = pil_image.resize((450,300), Image.ANTIALIAS)
                tk_image = ImageTk.PhotoImage(pil_image)
                try:
                    panel1 = Tk.Label(self.fr_Lleft, image=tk_image)
                    panel1.pack()
                    panel1.image = tk_image
                except ValueError:
                    print(ValueError)
                    pass
    En réalité j'obtiens les widgets des classes enfants en dessous de l'image.

    Qu'est ce qui ne va pas dans mon code?

    pour information je msuis inspiré de https://sympa.obspm.fr/wws/d_read/st...N/Cours_II.pdf ( page 26 )

    Merci d'avance.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo