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

  1. #1
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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 expérimenté
    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
    Points : 1 351
    Points
    1 351
    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 expérimenté
    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
    Points : 1 351
    Points
    1 351
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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 ?

    @+

  7. #7
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    self.transient(container) ne fonctionne pas pour vous ?
    Si je le mets à la place de self.attributes("-toolwindow", 1)? Ben non, en fait, quand on clique sur le bouton "View code", la fenêtre n'apparait pas.

  8. #8
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Amusant les WM...

    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
    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.container = container
            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())
     
        def show(self):
            self.deiconify()
            self.transient(self.container)
     
        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()
    Fonctionne sous Linux et sans doute les autres.
    Ce qui me fait penser que
    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
    class NOTEPAD(Tk.Toplevel):
        def __init__(self, container, name, *args, **kwds):
            Tk.Toplevel.__init__(self, *args, **kwds)
            self.transient(container)
            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())
     
        def show(self):
            self.deiconify()
     
        def hide(self):
            self.withdraw()
    (utiliser .transient() avant le .withdraw())
    Devrait aussi fonctionner (c'est le cas sous Linux) mais là je ne peux pas promettre sous Windows.

    @+

  9. #9
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Fonctionne sous Linux et sans doute les autres.
    Je confirme, le premier script marche sous windows. Merci beaucoup, je vais donc m'inspirer de celui là. Visuellement, il est même mieux, car la taille des boutons restants (la croix de fermeture et le nouveau truc rajouté par Seven qui permet les copies d'écrans) et la hauteur de la titlebar sont préservés.

    Citation Envoyé par PauseKawa Voir le message
    Devrait aussi fonctionner (c'est le cas sous Linux) mais là je ne peux pas promettre sous Windows.
    Hélas non, le deuxième script ne marche pas sous windows, c'est le même problème que ton script initial, La fenêtre ne s'affiche jamais.
    Images attachées Images attachées   

  10. #10
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Et dans la série "on n'arrête pas de fignoler", un petit problème inattendu...
    Images attachées Images attachées  

+ 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