2010-03-07 17 views
41

Ich versuche, einen benutzerdefinierten Titel zu einem Fenster hinzuzufügen, aber ich habe Probleme damit. Ich weiß, dass mein Code nicht richtig ist, aber wenn ich ihn ausführe, erzeugt er stattdessen zwei Fenster, eines mit nur dem Titel tk und ein anderes größeres Fenster mit "Simple Prog". Wie mache ich es so, dass das tk-Fenster den Titel "Simple Prog" hat, anstatt ein neues zusätzliches Fenster zu haben. Ich denke nicht, ich bin nehme an, die Tk() Teil zu haben, weil, wenn ich das in meinem vollständigen Code, gibt es einen FehlerVerwenden von Tkinter in Python zum Bearbeiten der Titelleiste

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") 
+0

Kam hierher, aber ich war eigentlich auf der Suche nach http://StackOverflow.com/Questions/30009909/change-title-of-Tkinter-Application-in-o-s-X-Menu-Bar, falls jemand anderes auch – Andrei

Antwort

0

self.parent ist ein Hinweis auf die tatsächlichen Fenster, so self.root. Titel sollte self.parent.title sein, und self.root sollte nicht existieren.

+0

It scheint nicht zu funktionieren. Soll ich self.parent = Tk() behalten? – Dan

+0

ja, du bist. Ich sagte nur zu self.root.title zu self.parent.title zu ändern und self.root zu entfernen –

73

Wenn Sie kein Root-Fenster erstellen, erstellt Tkinter eines für Sie, wenn Sie versuchen, ein anderes Widget zu erstellen. In Ihrem __init__, weil Sie noch kein Root-Fenster erstellt haben, wenn Sie den Rahmen initialisieren, erstellt Tkinter einen für Sie. Dann rufen Sie make_widgets, die ein zweites Root-Fenster erstellt. Deshalb sehen Sie zwei Fenster.

Ein gut geschriebenes Tkinter-Programm sollte immer explizit ein Root-Fenster erstellen, bevor Sie andere Widgets erstellen.

Wenn Sie Ihren Code ändern, um das Stammfenster explizit zu erstellen, erhalten Sie ein Fenster mit dem erwarteten Titel.

Beispiel:

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

Beachten Sie auch die Verwendung von self.make_widgets() statt ABC.make_widgets(self). Während beide das gleiche tun, ist ersteres der richtige Weg, die Funktion aufzurufen.

+0

Ja, ich habe gerade diesen Code in Python ABC() .hauptrand() ausgeführt und es machte 2 Dinge, ein Fenster namens Simple Prog und ein anderes Fenster, aber nur die Titelleiste mit "tk" – Dan

+2

@Dan: Meine Vermutung ist, weil Tkinter einen Rahmen erstellt, bevor du das Hauptfenster erstellst, erstellt er ein Toplevel-Fenster für dich (oder vielleicht nur ein körperloses Rahmen-Widget) . Die Art, wie du deinen Code hast, ist falsch. Sie müssen das Stammfenster erstellen, bevor Sie andere Fenster erstellen. –

13

Probieren Sie etwas wie:

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

Jetzt sollten Sie einen Rahmen mit einem Titel, dann später Sie Fenster für verschiedenen Widgets hinzufügen können, wenn Sie möchten.

+0

Sowohl diese Lösung als auch die von @Bryan funktionieren für mich (Python 3) –

1

Nachdem das selbst gerade getan Sie es auf diese Weise tun können:

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

Sie den Titel ändern sehen, und Sie werden nicht zwei Fenster. Ich habe meine parent als master wie in der Tkinter Referenz Zeug in der Python-Bibliothek Dokumentation verlassen.

+0

Also, wie genau unterscheidet sich dieser Beitrag von dem, was ich gepostet habe? – lugte098

+0

Meine Antwort war vor Jahren, also werde ich mich nicht erinnern, warum - meine Antwort ist viel näher an der OP-Probe und in der Klasse gehalten, aber sie könnte als eine Bearbeitung für Ihre vorgeschlagen worden sein, wenn sie zählte. Keine Ahnung ... –

1

Für jeden, der auf das Problem mit zwei Fenstern zu öffnen, und läuft über diese Frage. Hier ist, wie ich auf eine Lösung gestoßen bin.

Der Grund der Code in dieser Frage zwei Fenster produziert, weil

Frame.__init__(self, parent) 

vor

betrieben wird
self.root = Tk() 

Die einfache Lösung ist Rahmen laufen Tk() vor dem Ausführen .__ init_ ()

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

Warum das der Fall ist, bin ich mir nicht ganz sicher.

3

Ich bin nicht sicher, ob ich richtig bin, aber ist das was du willst?

Die Wurzel ist das Fenster, das Sie erstellen, und der Rest ist ziemlich selbsterklärend.

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

ändert den Titel entweder Tk oder Toplevel Instanz, dass die widget ist ein Kind.

+0

Siehe auch mehr [Warum gibt es mehrere Fenster angezeigt] (https://stackoverflow.com/questions/48289171/why-istopel-vel-showing-2-windows/48289343#48289343). – Nae

Verwandte Themen