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 :

Classes, Tkinter et conception générale d'application [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Classes, Tkinter et conception générale d'application
    Bonjour à tous et à toutes,
    Grand débutant Python, je me lance dans le développement de ma première application personnelle. J'ai créé pour cela une classe spéciale pour gérer sa fenêtre principale et qui est destinée à être appelée depuis le programme principal. En voici le code :
    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
    # Importations
    from tkinter import *
    import os
     
    class FenetrePrincipale(Tk):
    	"Classe créant la fenêtre de base de l'interface:"
    	"	- une fenêtre "
    	"	- un cadre logo"
    	"	- un cadre pour les onglets de navigation"
    	"	- un cadre pour le menu d'affichage"
    	"	- un cadre pour l'affichage principal"
     
    	# Constructeur
    	def __init__(self):
    		# Appel du constructeur de la classe parente 'Tk'
    		Tk.__init__(self)						
     
    		#Titre de la fenêtre
    		self.title("Delphidactic 4.0")			
     
    		# Récupération de la largeur et de la hauteur de l'écran dans <wscr> et <hwcr>
    		wscr = self.winfo_screenwidth()			
    		hscr = self.winfo_screenheight()
     
    		# Rédimensionnement de la fenêtre à la taille de l'écran
    		self.geometry("%dx%d+0+0" % (wscr, hscr))	
     
    		#self.iconbitmap("dd_icon.ico")
     
    		# Icône de la barre de tâche
    		if "nt" == os.name:							
    			self.wm_iconbitmap("dd_icon.ico")			# pour Windows
    		else:
    			self.wm_iconbitmap("@dd_icon.xbm")			# pour Linux
     
    		# Définitions des cadres principaux et permanents
    		# Cadre du logo
    		cadrLogo = Frame(self,bg='white', height=int(hscr/16), width=int(wscr/8),bd=2, relief=FLAT)			
    		cadrLogo.grid(row=1, column=1)
    		can = Canvas(cadrLogo, height=int(hscr/16)-5, width=int(wscr/8)-5, bg='white',bd=-2)
    		logo = PhotoImage(file='logo66.gif')
    		can.create_image((int(wscr/8))/2,(int(hscr/16))/2,image=logo)
    		can.image=logo
    		can.pack()
     
    		# Cadre de la barre de navigation
    		self.cadrNavig = Frame(self,bg='grey50', bd=0, height=int(hscr/16), width=wscr-int(wscr/8), relief=FLAT)
    		self.cadrNavig.grid(row=1, column=2)
     
    		# Cadre du menu des affichages
    		self.cadrMenAff = Frame(self,bg='grey60', bd=0, height=hscr-int(hscr/16), width=int(wscr/8), relief=FLAT)
    		self.cadrMenAff.grid(row=2, column=1)
     
    		# Cadre de l'affichage principal
    		self.cadrPrinc = Frame(self, bd=0, height=hscr-int(hscr/16), width=wscr-int(wscr/8), relief=FLAT)
    		self.cadrPrinc.grid(row=2, column=2)
    		self.cadrPart2 = Frame(self.cadrPrinc,bg='white', bd=0, height=hscr-int(hscr/16), width=(wscr-int(wscr/8))/2, relief=FLAT)
    		self.cadrPart1 = Frame(self.cadrPrinc,bg='light blue', bd=0, height=hscr-int(hscr/16), width=(wscr-int(wscr/8))-(wscr-int(wscr/8))/2, relief=FLAT)
    		self.cadrPart1.grid(row=1,column=1)
    		self.cadrPart2.grid(row=1,column=2)
     
    		def getSection1(self):
    			return self.cadrPart1
     
    		def getSection2(self):
    			return self.cadrPart2
     
    		def getMenu(self):
    			return self.cadrMenAff
    Pour essayer cette classe, j'ai créé le petit programme test suivant pour voir si je peux provoquer l'affichage d'un Label par exemple dans l'un des Frames de la fenêtre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # Importations
    from interface import *
    from tkinter import *
     
    fen = FenetrePrincipale()
    Label(fen.getSection1(),'Hello').pack()
     
    fen.mainloop()
    Quand je le lance, j'obtiens le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: '_tkinter.tkapp' object has no attribute 'getSection1'
    Je ne comprends pas bien ce message et pourquoi il me parle d'un 'attribut' getSection1 alors qu'il s'agit d'une méthode. Je pressens que la référence du cadre dans lequel je veux afficher le Label ne passe pas sans en comprendre la raison.
    Qu'est-ce que j'ai raté ? Y a-t-il un problème dans la conception générale de ce début d'appli? Est-ce par exemple une bonne idée de faire de la fenêtre principale une classe comme je l'ai fait ou serait-il préférable de la créer dans le corps principal de l'appli?

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Salut,

    Les méthodes sont aussi des attributs.
    Cette méthode, tu l'as placée à l'intérieur de __init__() où elle n'a bien sur pas sa place. Décale la d'une indentation à gauche.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Bonjour VinsS et merci de ta réactivité,
    J'ai fait ce que tu m'as dit et j'obtiens un nouveau message d'erreur qui semble lui venir du programme test et que je ne comprends pas non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "test.py", line 24, in <module>
        Label(fen.getSection1(),'Hello').pack()
      File "/usr/lib/python3.6/tkinter/__init__.py", line 2763, in __init__
        Widget.__init__(self, master, 'label', cnf, kw)
      File "/usr/lib/python3.6/tkinter/__init__.py", line 2292, in __init__
        classes = [(k, v) for k, v in cnf.items() if isinstance(k, type)]
    AttributeError: 'str' object has no attribute 'items'

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Autant pour moi, je viens de comprendre : il me manquait le non de l'option text dans le Label.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label(fen.getSection1(),text='Hello').pack()
    Merci en tout cas pour le coup de main.

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

Discussions similaires

  1. Infrastructure-conception générale d'une application simple
    Par petitours dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 28/10/2016, 15h08
  2. classe Template et méthodes "générales"
    Par rulianf dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2005, 13h42
  3. Réponses: 8
    Dernier message: 18/07/2005, 18h38
  4. [Débutant][Conception] Contrôler une application distante
    Par muad'dib dans le forum Général Java
    Réponses: 10
    Dernier message: 05/07/2005, 14h58

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