75

ウィンドウにカスタム タイトルを追加しようとしていますが、うまくいきません。私のコードが正しくないことはわかっていますが、それを実行すると、代わりに 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")
4

12 に答える 12

92

ルート ウィンドウを作成しない場合、他のウィジェットを作成しようとすると、Tkinter がルート ウィンドウを作成します。したがって、 では__init__、フレームを初期化するときにまだルート ウィンドウを作成していないため、Tkinter がルート ウィンドウを作成します。次に、2 番目のルート ウィンドウmake_widgetsを作成するを呼び出します。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)。どちらも同じことをすることになりますが、関数を呼び出すには前者が適切です。

于 2010-03-08T02:06:21.890 に答える
16

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

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

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

于 2010-03-11T13:30:18.677 に答える
2

私はこれがうまくいくことを発見しました:

window = Tk()
window.title('Window')

多分これは役立ちますか?

于 2020-04-02T00:00:49.090 に答える
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()
        ABC.make_widgets(self)

    def make_widgets(self):
        self.parent.title("Simple Prog")

タイトルが変更され、2 つのウィンドウが表示されることはありません。私は、python ライブラリのドキュメントの Tkinter リファレンスのようにparent残しました。master

于 2012-12-28T20:14:14.183 に答える
1

2 つのウィンドウを開いているという問題に遭遇し、この質問に出くわした人のために。これが私が解決策を見つけた方法です。

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

Frame.__init__(self, parent)

前に実行されています

self.root = Tk()

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

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

なぜそうなのか、私にはよくわかりません。

于 2016-08-22T19:20:37.970 に答える
1

簡単な方法:

root = Tk()
root.title('Hello World')
于 2020-07-27T17:20:44.203 に答える
0

self.parent は実際のウィンドウへの参照であるため、self.root.title は self.parent.title である必要があり、self.root は存在​​してはなりません。

于 2010-03-07T08:36:54.633 に答える