wake-up-neo.net

Verwenden von Tkinter in Python zum Bearbeiten der Titelleiste

Ich versuche, einem Fenster einen benutzerdefinierten Titel hinzuzufügen, aber ich habe Probleme damit. Ich weiß, dass mein Code nicht stimmt, aber wenn ich ihn starte, werden stattdessen 2 Fenster erstellt, eines mit nur dem Titel tk und ein weiteres, 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 glaube nicht, dass ich den Tk () - Teil habe, denn wenn ich das in meinem vollständigen Code habe, gibt es einen Fehler

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

Wenn Sie kein Stammfenster erstellen, erstellt Tkinter eines für Sie, wenn Sie versuchen, ein anderes Widget zu erstellen. In Ihrem __init__ erstellt Tkinter ein Fenster, da Sie beim Initialisieren des Frames noch kein Stammfenster erstellt haben. Dann rufen Sie make_widgets auf, wodurch ein second root-Fenster erstellt wird. Deshalb sehen Sie zwei Fenster. 

Ein gut geschriebenes Tkinter-Programm sollte immer explizit ein Stammfenster erstellen, bevor andere Widgets erstellt werden. 

Wenn Sie Ihren Code so ändern, dass er das Stammfenster explizit erstellt, 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() anstelle von ABC.make_widgets(self). Während beide dasselbe tun, ist die erste Methode die richtige Art, die Funktion aufzurufen. 

79
Bryan Oakley

Ich bin nicht sicher, ob ich recht habe, aber willst du das?

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

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

19
user8879510

Versuchen 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 haben. Danach können Sie Fenster für verschiedene Widgets hinzufügen, wenn Sie möchten.

13
lugte098

Nachdem Sie das selbst gemacht haben, können Sie es so machen:

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 sehen, dass sich der Titel ändert, und Sie erhalten keine zwei Fenster. Ich habe meine parent als master wie im Tkinter-Referenzmaterial in der Python-Bibliotheksdokumentation gelassen.

1
Danny Staple

Für alle, die sich mit dem Problem beschäftigen, zwei Fenster geöffnet zu haben, und über diese Frage. So bin ich auf eine Lösung gestoßen.

Der Grund, warum der Code in dieser Frage zwei Fenster erzeugt, ist weil 

Frame.__init__(self, parent)

wird vorher ausgeführt 

self.root = Tk()

Der einfache Fix besteht darin, Tk () auszuführen, bevor Frame .__ init_ () ausgeführt wird.

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

Warum das so ist, bin ich mir nicht ganz sicher.

1
Rethipher

self.parent ist ein Verweis auf das eigentliche Fenster. Daher sollte self.root.title self.parent.title sein und self.root nicht existieren.

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

ändert den Titel einer Tk- oder Toplevel-Instanz, deren widget ein untergeordnetes Element ist.

0
Nae