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")
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.
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.
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.
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 parent
master
comme 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 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.
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.
widget.winfo_toplevel().title("My_Title")
change le titre de Tk
ou Toplevel
exemple que le widget
est un enfant de.