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. Je sais que mon code n'est pas correct mais quand je l'exécute, il crée 2 fenêtres à la place, une avec juste le titre tk et une autre plus grande fenêtre avec "Simple Prog". Comment faire 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 ça 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")
44
demandé sur Bill the Lizard 2010-03-07 09:50:21

7 réponses

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__, parce que 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 ce qui crée un deuxième fenêtre racine. C'est pourquoi vous voyez deux fenêtres.

un programme Tkinter bien écrit devrait toujours explicitement créer une fenêtre root avant de créer d'autres widgets.

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

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 aussi 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 bonne façon d'appeler la fonction.

75
répondu Bryan Oakley 2017-12-07 10:20:24

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()

Maintenant vous devriez avoir un cadre avec un titre, puis après vous pouvez ajouter des fenêtres pour différents widgets si vous voulez.

13
répondu lugte098 2015-07-01 20:20:05

Je ne sais pas si j'ai raison, mais est-ce que c'est 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.

11
répondu user8879510 2017-11-07 00:44:25

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 changement de titre, et vous n'aurez pas deux fenêtres. J'ai quitté mon parentmaster comme dans les références Tkinter dans la documentation de la bibliothèque python.

1
répondu Danny Staple 2012-12-28 20:14:14

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 est d'exécuter Tk () avant de lancer Frame.__init_ ()

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

Pourquoi c'est le cas, je ne suis pas entièrement sûr.

1
répondu Rethipher 2016-08-22 19:20:37

self.parent est une référence à la fenêtre réelle, donc self.racine.le titre devrait être soi-même.parent.titre, et l'auto.racine ne devrait pas exister.

0
répondu Colin Valliant 2010-03-07 08:36:54
widget.winfo_toplevel().title("My_Title")

change le titre de Tk ou Toplevel exemple que le widget est un enfant de.

0
répondu Nae 2018-01-29 23:09:10