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")
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.
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.
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.
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.
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.
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.
widget.winfo_toplevel().title("My_Title")
modifie le titre de l'une des instances Tk
ou Toplevel
dont la widget
est un enfant.