0

次のコードを実行すると、作成されたラベルが同じグリッドに追加されていないかのように、エントリ ボックスの上に表示されます。

class Application(Frame):
    def __init__(self,master):
        super(Application,self).__init__(master)
        self.grid()
        self.new_intervals()

    def new_intervals(self):
        self.int_label = Label(text="Interval Name")
        self.int_label.grid(row=0, column=0,sticky=W)
        self.int_time_label = Label(text="Time (HH:MM:SS)")
        self.int_time_label.grid(row=0, column=1,sticky=W)
        self.box1 = Entry(self)
        self.box1.grid(row=1,column=0,sticky=W)
        self.box2 = Entry(self)
        self.box2.grid(row=1,column=1,sticky=W)
        self.box3 = Entry(self)
        self.box3.grid(row=2,column=0,sticky=W)
        self.box4 = Entry(self)
        self.box4.grid(row=2,column=1,sticky=W)


root = Tk()
root.title("Interval Timer")
root.geometry("400x500")
app=Application(root)
root.mainloop() 

これらのボックスをループに追加できることは知っていますが、現時点ではループなしでは機能しません

4

1 に答える 1

2
  • アプリケーション フレームは、メイン ウィンドウの行 0、列 0 にあります。これは、何も指定しない場合のデフォルトです。また、デフォルトとして、それらは中央に表示されます
  • このフレームには、2 つの行にまたがる 4 つのエントリ ウィジェットがあり、これらのエントリ ウィジェットの周囲に収まるようにフレームが大きくなります。
  • 「間隔名」ラベルも、メイン ウィンドウの行 0、列 0 に配置されています。これは、明示的に指示したことと、その親がメイン ウィンドウであるためです。
  • 「時間」ラベルもメイン ウィンドウの行 0 にあります。これは、親がメイン ウィンドウであるためです。
  • これらのラベルは両方とも、行の垂直方向の中央に表示されています。これは、オーバーライドしていないデフォルトの動作であるためです。これが、エントリ ウィジェットの上に表示される理由です。

したがって、ラベルとアプリケーション フレームはメイン ウィンドウの同じ行にあり、ラベルは既定で垂直方向の中央にあるため、エントリ ウィジェットの中央に表示されます。

ラベルをフレームの子にするつもりだったと思うので、ラベルを作成するときに最初のパラメーターとして「self」を指定する必要があります。

self.int_label = Label(self, text="Interval Name")
...
self.int_time_label = Label(self, text="Time (HH:MM:SS)")

また、特定のマスター ウィンドウのすべてのグリッド ステートメントをグループ化することをお勧めします。これにより、ウィジェットの編成が見やすくなります。私の経験では、これによりコードが読みやすくなり、維持しやすくなります。

例えば:

self.int_label = Label(...)
self.int_time_label = Label(...)
self.box1 = Entry(...)
...
self.int_label.grid(...)
self.int_time_label.grid(...)
self.box1.grid(...)
...
于 2014-01-07T01:57:11.137 に答える