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 :

Supprimer des boutons de la barre de titre


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut Supprimer des boutons de la barre de titre
    Salut,

    j'ai un problème avec le code ci-dessous. J'aimerais que les boutons iconize et maximize à coté du bouton de fermeture (la croix) disparaissent de la fenêtre de l'éditeur. Quelqu'un sait si c'est possible et si oui comment faire?

    A+

    Pfeuh

    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
     
    try:import Tkinter
    except:import tkinter as Tkinter
    import tkFileDialog
    import tkMessageBox
    import sys
     
    class NOTEPAD(Tkinter.Toplevel):
        def __init__(self,container, fname_var="", *args, **kwds):
            Tkinter.Toplevel.__init__(self, *args, **kwds)
            self.hide()
            self.editor = Tkinter.Text(self)
            self.editor.grid()
            self.fname_var = fname_var
            self.protocol('WM_DELETE_WINDOW', self.hide)
            self.editor.bind('<Escape>', self.escape)
     
        def setText(self):
            try:
                text = open(self.fname_var.get(), 'r').read(-1)
            except:
                return False
            self.editor['state'] = 'normal'
            self.editor.delete('1.0', 'end')
            self.editor.insert('end', text)
            self.editor['state'] = 'disabled'
            return True
     
        def show(self):
            if not self.setText():
                return
            self.title(self.fname_var.get())
            self.resizable(False, False)
            self.deiconify()
            self.editor.focus()
     
        def hide(self):
            self.withdraw()
     
        def escape(self, event=None):
            self.hide()
     
     
    win = Tkinter.Tk()
    fname_var = Tkinter.StringVar(value=sys.argv[0])
    print fname_var.get()
    notepad = NOTEPAD(win, fname_var)
    Tkinter.Button(win, text="View code", width= 40, height =5, command=notepad.show).grid()
    win.mainloop()
    Images attachées Images attachées  

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour pfeuh,

    Puisque tu utilise un Toplevel tu as self.transient(container) qui devrait le faire.

    Pour le root c'est plus dur:
    L'éternel et radical .overrideredirect(True)
    Sous Windows .attributes("-toolwindow", 1)
    Pour le bouton de redimensionnement (ce que tu fait dans ton code) .resizable(False, False)
    Sous Windows sans doute l'api Win32 mais je ne connais pas.
    Les bloquer par un bind de <Configure>.
    Non exhaustif.

    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
    try:
        import Tkinter
        import tkFileDialog
        import tkMessageBox
    except:
        import tkinter as Tkinter
        from tkinter import filedialog as tkFileDialog
        from tkinter import messagebox as tkMessageBox
     
     
     
    class NOTEPAD(Tkinter.Toplevel):
        def __init__(self, container, *args, **kwds):
            Tkinter.Toplevel.__init__(self, *args, **kwds)
            self.withdraw()
            self.editor = Tkinter.Text(self)
            self.editor.grid()
            self.protocol('WM_DELETE_WINDOW', self.hide)
            self.editor.bind('<Escape>', lambda e: self.hide())
            self.transient(container)
     
        def show(self):
            with open(fname_var.get(), 'r') as f:
                text = f.read()
            self.editor['state'] = 'normal'
            self.editor.delete('0.0', 'end')
            self.editor.insert('end', text)
            self.editor['state'] = 'disabled'
            self.title(fname_var.get())
            self.resizable(False, False)
            self.deiconify()
            self.editor.focus()
     
        def hide(self):
            self.withdraw()
     
    win = Tkinter.Tk()
    fname_var = Tkinter.StringVar(value=__file__)
    notepad = NOTEPAD(win)
    Tkinter.Button(win, text="View code", width=40, height=5, command=notepad.show).grid()
    win.mainloop()
    @+

    Edit: __file__

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Une question quand même: Puisque le but est d'afficher le code pourquoi mettre cela dans des fonctions ?
    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
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
     
     
    class NOTEPAD(Tk.Toplevel):
        def __init__(self, container, name, *args, **kwds):
            Tk.Toplevel.__init__(self, *args, **kwds)
            self.withdraw()
            editor = Tk.Text(self)
            editor.grid()
            with open(name, 'r') as f:
                editor.insert('end', f.read())
            editor['state'] = 'disabled'
            self.title(name)
            self.resizable(False, False)
            self.protocol('WM_DELETE_WINDOW', self.hide)
            self.bind('<Escape>', lambda e: self.hide())
            self.transient(container)
     
        def show(self):
            self.deiconify()
     
        def hide(self):
            self.withdraw()
     
    win = Tk.Tk()
    win.title("tk: transient sample")
    notepad = NOTEPAD(win, __file__)
    Tk.Button(win, text="View code",
              width=40, height=5,
              command=notepad.show).pack()
    win.mainloop()
    Ou alors cela a un autre but ?

    @+

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Le but est de pouvoir à tout moment visualiser des fichiers générés par le programme principal, qui a une interface graphique assez conséquente. Donc si on peut cacher ce qui pollue l'affichage en fermant proprement ces fenêtres sans les détruire, c'est tout bon. En résumé, c'est une sorte de notepad en read only que l'on peut rendre invisible et qui chaque fois qu'on le réveille rafraichit ses données en les relisant du fichier.

    Quand on demande la fermeture par la croix rouge ou par la touche escape, on le cache, et quand on appelle la fonction show on le rappelle avec un rafraichissement de ses données. Dans ce contexte, on n'a pas besoin des deux boutons iconize et maximize.

    Citation Envoyé par PauseKawa Voir le message
    Pour le bouton de redimensionnement (ce que tu fait dans ton code) .resizable(False, False)
    Oui, mais je ne fais que stopper l'action du bouton. En fait, j'aimerais l'enlever physiquement. Tu as sans doute raison, ça doit être dans l'API windows, donc très difficilement accessible.

    Quand au bouton iconize, il cache le notepad qui reste cependant visible dans la barre des tâches. Donc 10 fichiers cachées 10 inscriptions dans la barre des tâches (un groupe), pas très propre. Je pense que c'est iconize que tu voulais inhiber par un bind?

    A+

    Pfeuh

  5. #5
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Merci PauseKawa,

    .attributes("-toolwindow", 1) fait parfaitement le job.

    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
    try:import Tkinter
    except:import tkinter as Tkinter
    import tkFileDialog
    import tkMessageBox
    import sys
     
    class NOTEPAD(Tkinter.Toplevel):
        def __init__(self,container, fname_var="", *args, **kwds):
            Tkinter.Toplevel.__init__(self, *args, **kwds)
            self.hide()
            self.editor = Tkinter.Text(self)
            self.editor.grid()
            self.fname_var = fname_var
            self.protocol('WM_DELETE_WINDOW', self.hide)
            self.editor.bind('<Escape>', self.escape)
            self.attributes("-toolwindow", 1)
     
        def setText(self):
            try:
                text = open(self.fname_var.get(), 'r').read(-1)
            except:
                return False
            self.editor['state'] = 'normal'
            self.editor.delete('1.0', 'end')
            self.editor.insert('end', text)
            self.editor['state'] = 'disabled'
            return True
     
        def show(self):
            if not self.setText():
                return
            self.title(self.fname_var.get())
            self.resizable(False, False)
            self.deiconify()
            self.editor.focus()
     
        def hide(self):
            self.withdraw()
     
        def escape(self, event=None):
            self.hide()
     
    win = Tkinter.Tk()
    fname_var = Tkinter.StringVar(value=sys.argv[0])
    print fname_var.get()
    notepad = NOTEPAD(win, fname_var)
    Tkinter.Button(win, text="View code", width= 40, height =5, command=notepad.show).grid()
    win.mainloop()
    A+

    Pfeuh

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir pfeuh,

    Cela limite donc l’utilisation du code (self.attributes("-toolwindow", 1)) à Windows. De plus .attributes("-toolwindow", 1) ne semble pas fonctionner tout le temps (de mémoire).
    self.transient(container) ne fonctionne pas pour vous ?

    @+

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/01/2010, 19h32
  2. Comment ajouter un bouton dans la barre de titre d'une fenêtre ?
    Par Interruption13h dans le forum C++Builder
    Réponses: 10
    Dernier message: 04/07/2006, 19h07
  3. Comment cacher des boutons de la barre de titre ?
    Par programaniac dans le forum Composants VCL
    Réponses: 7
    Dernier message: 16/11/2005, 10h04
  4. Quatrième bouton sur la barre de titre d'une fenêtre
    Par Yacine95000 dans le forum MFC
    Réponses: 8
    Dernier message: 02/06/2004, 17h54

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