web-dev-qa-db-ja.com

pythonでTkinterを使用してタイトルバーを編集する

ウィンドウにカスタムタイトルを追加しようとしていますが、問題があります。私のコードが正しくないことは知っていますが、実行すると、代わりに2つのウィンドウが作成されます。 tkウィンドウのタイトルが「Simple Prog」になるようにするには、新しい追加ウィンドウを作成するのではなく、どうすればよいですか。私は完全なコードにそれがあるとエラーがあるので、私はTk()部分を持つとは思わない

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

ルートウィンドウを作成しない場合、他のウィジェットを作成しようとすると、Tkinterはルートウィンドウを作成します。したがって、___init___では、フレームを初期化するときにルートウィンドウをまだ作成していないため、Tkinterが作成します。次に、_make_widgets_を呼び出して、secondルートウィンドウを作成します。そのため、2つのウィンドウが表示されます。

よく書かれたTkinterプログラムは、他のウィジェットを作成する前に、常に明示的にルートウィンドウを作成する必要があります。

ルートウィンドウを明示的に作成するようにコードを変更すると、予想されるタイトルのウィンドウが1つ表示されます。

例:

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

また、self.make_widgets()ではなくABC.make_widgets(self)を使用することに注意してください。両方とも同じことをすることになりますが、前者は関数を呼び出す適切な方法です。

82
Bryan Oakley

私が正しいかどうかはわかりませんが、これはあなたが望むものですか?

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

ルートは作成するウィンドウであり、残りは自明です。

24
user8879510

次のようなものを試してください:

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

これで、タイトル付きのフレームができました。その後、必要に応じて、異なるウィジェット用のウィンドウを追加できます。

13
lugte098

自分でこれを行ったので、次のようにできます。

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

タイトルが変更され、2つのウィンドウが表示されなくなります。 pythonライブラリドキュメント)のTkinter参照資料のように、parentmasterのままにしました。

1
Danny Staple

2つのウィンドウが開いているという問題にぶつかり、この質問に出くわした場合。これが私が解決策に出会った方法です。

この質問のコードが2つのウィンドウを生成している理由は、

Frame.__init__(self, parent)

前に実行されています

self.root = Tk()

簡単な修正は、Frame .__ init_()を実行する前にTk()を実行することです

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

なぜそうなのか、完全にはわかりません。

1
Rethipher

self.parentは実際のウィンドウへの参照なので、self.root.titleはself.parent.titleである必要があり、self.rootは存在しないはずです。

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

Tkが子であるToplevelまたはwidgetインスタンスのタイトルを変更します。

0
Nae