web-dev-qa-db-fra.com

Utiliser Tkinter en python pour éditer la barre de titre

J'essaie d'ajouter un titre personnalisé à une fenêtre, mais j'ai des problèmes avec ce titre. Je sais que mon code n'est pas correct, mais lorsque je l'exécute, il crée 2 fenêtres à la place, une avec simplement le titre tk et une autre fenêtre plus grande avec "Simple Prog". Comment est-ce que je fais pour que la fenêtre tk ait le titre "Simple Prog" au lieu d'avoir une nouvelle fenêtre supplémentaire. Je ne pense pas que je suis supposé avoir la partie Tk () parce que quand j'ai cela dans mon code complet, il y a une erreur

from tkinter import Tk, Button, Frame, Entry, END

class ABC(Frame):
    def __init__(self,parent=None):
        Frame.__init__(self,parent)
        self.parent = parent
        self.pack()
        ABC.make_widgets(self)

    def make_widgets(self):
        self.root = Tk()
        self.root.title("Simple Prog")
47
Dan

Si vous ne créez pas de fenêtre racine, Tkinter en créera une pour vous lorsque vous essayez de créer un autre widget. Ainsi, dans votre __init__, comme vous n'avez pas encore créé de fenêtre racine lorsque vous initialisez le cadre, Tkinter en créera une pour vous. Ensuite, vous appelez make_widgets qui crée une fenêtre racine second. C'est pourquoi vous voyez deux fenêtres. 

Un programme Tkinter bien écrit doit toujours créer explicitement une fenêtre racine avant de créer d’autres widgets. 

Lorsque vous modifiez votre code pour créer explicitement la fenêtre racine, vous obtenez une fenêtre avec le titre attendu.

Exemple:

from tkinter import Tk, Button, Frame, Entry, END

class ABC(Frame):
    def __init__(self,parent=None):
        Frame.__init__(self,parent)
        self.parent = parent
        self.pack()
        self.make_widgets()

    def make_widgets(self):
        # don't assume that self.parent is a root window.
        # instead, call `winfo_toplevel to get the root window
        self.winfo_toplevel().title("Simple Prog")

        # this adds something to the frame, otherwise the default
        # size of the window will be very small
        label = Entry(self)
        label.pack(side="top", fill="x")

root = Tk()
abc = ABC(root)
root.mainloop()

Notez également l'utilisation de self.make_widgets() plutôt que ABC.make_widgets(self). Alors que les deux finissent par faire la même chose, le premier est la manière appropriée d'appeler la fonction. 

79
Bryan Oakley

Je ne sais pas si j'ai raison mais est-ce ce que vous voulez?

    root = tkinter.Tk()
    root.title('My Title')

La racine est la fenêtre que vous créez et le reste est assez explicite.

19
user8879510

Essayez quelque chose comme:

from tkinter import Tk, Button, Frame, Entry, END

class ABC(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()        

root = Tk()
app = ABC(master=root)
app.master.title("Simple Prog")
app.mainloop()
root.destroy()

Vous devriez maintenant avoir un cadre avec un titre, puis vous pourrez ensuite ajouter des fenêtres pour Différents widgets si vous le souhaitez.

13
lugte098

Ayant fait cela moi-même, vous pouvez le faire de cette façon:

from tkinter import Tk, Button, Frame, Entry, END

class ABC(Frame):
    def __init__(self, parent=None):
        Frame.__init__(self, parent)
        self.parent = parent
        self.pack()
        ABC.make_widgets(self)

    def make_widgets(self):
        self.parent.title("Simple Prog")

Vous verrez le titre changer et vous n'obtiendrez pas deux fenêtres. J'ai laissé ma parent sous la forme master, comme indiqué dans les références Tkinter dans la documentation de la bibliothèque python.

1
Danny Staple

Pour quiconque se heurte à la question d'avoir deux fenêtres ouvertes et se heurte à cette question. Voici comment je suis tombé sur une solution.

La raison pour laquelle le code dans cette question produit deux fenêtres est parce que 

Frame.__init__(self, parent)

est exécuté avant 

self.root = Tk()

La solution simple consiste à exécuter Tk () avant d’exécuter Frame .__ init_ ()

self.root = Tk()
Frame.__init__(self, parent)

Pourquoi c'est le cas, je ne suis pas tout à fait sûr.

1
Rethipher

self.parent est une référence à la fenêtre réelle, donc self.root.title doit être self.parent.title et self.root ne doit pas exister.

0
Colin Valliant
widget.winfo_toplevel().title("My_Title")

modifie le titre de l'une des instances Tk ou Toplevel dont la widget est un enfant.

0
Nae