Tkinter,使用包:不能在底部保持页脚栏

时间:2017-12-02 15:07:33

标签: python layout tkinter

我试图让三个按钮的底行均匀分布,但由于我使用side="left"side="right",其他按钮最终位于中间。

示例代码:     import tkinter as tki

class App(object):

    def __init__(self):

        self.root = tki.Tk()
        self.root.config(bg="white")
        self.root.geometry("400x300")


        top_frm = tki.Frame(self.root).pack()
        T = tki.Text(top_frm, height=2, width=30)
        T.pack()
        T.insert(tki.END, "Just a text Widget\nin two lines\n")

        mdl_frm = tki.Frame(self.root, width="400").pack(fill="both",expand=True)

        lbut = tki.Button(mdl_frm, text='Left button').pack(side="left")
        rbut = tki.Button(mdl_frm, text='right button').pack(side="right")

        bottom_frm = tki.Frame(self.root).pack(side="bottom",fill="x",expand=False)

        btn_frm_r = tki.Frame(bottom_frm).pack(side="right",fill="x")
        btn_frm_c = tki.Frame(bottom_frm).pack(side="right",fill="x")
        btn_frm_l = tki.Frame(bottom_frm).pack(side="right",fill="x")
        button1 = tki.Button(btn_frm_r,text='Bottom button 1').pack()
        button2 = tki.Button(btn_frm_c,text='Bottom button 2').pack()
        button3 = tki.Button(btn_frm_l,text='Bottom button 3').pack()

app = App()
#launch the app
app.root.mainloop() 

我尝试将“左按钮”和“右按钮”放在一个框架中。 我在某处读到了使用side声明的时候,当某个地方被赋予一个区域时,它会完全控制该区域,因此我尝试先声明btm_frm帧并使用side="bottom"

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

.pack()会返回None,因此您无法.pack()并在一行中分配变量。
此外,我建议您在将其他物体放入框架后包装框架 最后,我建议您使用self.作为您的类属性;如果以后需要访问它们,你会发现它很有用。

import tkinter as tki

class App(object):

    def __init__(self):

        self.root = tki.Tk()
        self.root.config(bg="white")
        self.root.geometry("400x300")


        self.top_frm = tki.Frame(self.root)
        self.top_frm.pack()
        self.T = tki.Text(self.top_frm, height=2, width=30)
        self.T.pack()
        self.T.insert(tki.END, "Just a text Widget\nin two lines\n")

        self.mdl_frm = tki.Frame(self.root, width="400")
        self.mdl_frm.pack(fill="both",expand=True)

        self.lbut = tki.Button(self.mdl_frm, text='Left button')
        self.lbut.pack(side="left")
        self.rbut = tki.Button(self.mdl_frm, text='right button')
        self.rbut.pack(side="right")

        self.bottom_frm = tki.Frame(self.root)

        self.btn_frm_r = tki.Frame(self.bottom_frm)
        self.btn_frm_r.pack(side="right",fill="x")
        self.btn_frm_c = tki.Frame(self.bottom_frm)
        self.btn_frm_c.pack(side="right",fill="x")
        self.btn_frm_l = tki.Frame(self.bottom_frm)
        self.btn_frm_l.pack(side="right",fill="x")
        self.button1 = tki.Button(self.btn_frm_r,text='Bottom button 1')
        self.button1.pack()
        self.button2 = tki.Button(self.btn_frm_c,text='Bottom button 2')
        self.button2.pack()
        self.button3 = tki.Button(self.btn_frm_l,text='Bottom button 3')
        self.button3.pack()

        self.bottom_frm.pack(side="bottom",fill="x",expand=False)



app = App()
#launch the app
app.root.mainloop()

答案 1 :(得分:2)

使用side='left'side='right'作为按钮,因为您希望它们在其包含的框架内从左向右移动。

    button1 = tki.Button(btn_frm_r,text='Bottom button 1').pack(side="left")
    button2 = tki.Button(btn_frm_c,text='Bottom button 2').pack(side="left")
    button3 = tki.Button(btn_frm_l,text='Bottom button 3').pack(side="left")

顺便说一下,如果你要做tki.Button(...).pack(...),那么把它分配给一个变量是没有意义的。变量的值始终为None

pack算法的完整说明如下:http://tcl.tk/man/tcl8.5/TkCmd/pack.htm#M26