Python&ttk使用labelFrames清理帧

Jay*_*uso 6 python tkinter ttk

我正在尝试使用ttk/Tkinter构建一个基本的GUI.

我已经绘制出一个基本的GUI,它具有正确的基本组件,但是当我尝试美化它/将其空间化时,我达到了让ttk容器很好地发挥作用的极限......

例子:

from Tkinter import *
import ttk

class MakeGUI(object):
    def __init__(self,root):
        self.root = root
        self.root.title("Text Comparitor")
        ## build frame
        self.mainframe = ttk.Frame(self.root, padding="3 3 12 12")
        self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
        self.mainframe.columnconfigure(0, weight=1)
        self.mainframe.rowconfigure(0, weight=1)
        self.mainframe.pack()
        ## text labels
        ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E)
        self.mainframe.pack(side="bottom", fill=BOTH, expand=True)
        self.mainframe.grid()
        ttk.Label(self.mainframe, text="Source Filename:").grid(column=1, row=2, sticky=W)
        ttk.Label(self.mainframe, text="Source Text:").grid(column=1, row=3, sticky=W)
        ttk.Label(self.mainframe, text="Converted Text:").grid(column=1, row=4, sticky=W)
        ttk.Label(self.mainframe, text="Cleaned Source:").grid(column=1, row=5, sticky=W)
        ttk.Label(self.mainframe, text="Cleaned Converted:").grid(column=1, row=6, sticky=W)
        ttk.Label(self.mainframe, text="Details:").grid(column=1, row=7, sticky=W)
        ## buttons
        self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE)
        self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S)
        self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW)

    def closeFrame(self):
        self.root.destroy()

    def nextPara(self):
        pass

    def prevPara(self):
        pass

def main():
    root = Tk()
    makeGUI = MakeGUI(root)
    root.mainloop()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

结果如下: http://imgur.com/a/CwpCU#0

我一直在尝试添加第二个容器对象,一个标签框架来保存文本标签对象,这导致按钮向上移动(因此我假设我没有正确地将labelframe引用到网格中:

from Tkinter import *
import ttk

class MakeGUI(object):
    def __init__(self,root):
        self.root = root
        self.root.title("Text Comparitor")
        ## build frame
        self.mainframe = ttk.Frame(self.root, padding="3 3 12 12")
        self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
        self.mainframe.columnconfigure(0, weight=1)
        self.mainframe.rowconfigure(0, weight=1)
        self.mainframe.pack()
        ## text labels
        ttk.Label(self.mainframe, text="Conversion Truth Tester", font=("Helvetica", 32)).grid(column=1, row=1, sticky=E)
        self.lfdata = ttk.Labelframe(self.root, labelwidget=self.mainframe, text='Label')#
        self.lfdata.grid()
        ttk.Label(self.lfdata, text="Source Filename:").grid(column=1, row=2, sticky=W)
        ttk.Label(self.lfdata, text="Source Text:").grid(column=1, row=3, sticky=W)
        ttk.Label(self.lfdata, text="Converted Text:").grid(column=1, row=4, sticky=W)
        ttk.Label(self.lfdata, text="Cleaned Source:").grid(column=1, row=5, sticky=W)
        ttk.Label(self.lfdata, text="Cleaned Converted:").grid(column=1, row=6, sticky=W)
        ttk.Label(self.lfdata, text="Details:").grid(column=1, row=7, sticky=W)

        ## buttons
        self.close = ttk.Button(self.mainframe, text="Close",command=self.closeFrame).grid(column=1, row=9, sticky=SE)
        self.next = ttk.Button(self.mainframe, text="Next",command=self.nextPara).grid(column=1, row=9, sticky=S)
        self.next = ttk.Button(self.mainframe, text="Prev",command=self.prevPara).grid(column=1, row=9, sticky=SW)

    def closeFrame(self):
        self.root.destroy()

    def nextPara(self):
        pass

    def prevPara(self):
        pass

def main():
    root = Tk()
    makeGUI = MakeGUI(root)
    root.mainloop()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

结果如下: http://imgur.com/a/CwpCU#1 请注意按钮abd标签之间的位置交换,以及labelframe的几乎可见方面.

我试图让第二个版本'看起来'像第一个更漂亮的版本.

任何指针 - 我一直在阅读各种资源/文档,并且找不到任何适合我的例子的东西(最有可能的 - 我正在做一些愚蠢的事情......)并且我尝试过的任何东西都没有 - 包括pack(),grid()以及我在其他相关示例中找到的其他片段.

mmg*_*mgp 10

有很多地方需要调整,让我们评论一下(我可能会忘记一些事情,所以一定要检查底部的代码).

首先,仅在框架中对列/行应用权重时,不会在调整窗口大小时将其扩展.你需要这样做root.之后,您可能希望在框架中执行此操作,以匹配您在调整大小后对布局的期望.在你的情况下,最有意义的是使每一列具有相同的权重> 0并且仅使第二行具有权重> 0.列的推理是你有3个按钮,并且你将希望它们全部扩展自由空间以同样的方式.对于第二部分,考虑到你Labelframe在第二行有一个直接观察.给任何其他行的权重> 0将给你一个非常奇怪的布局.加权问题已经完成.

我观察到的下一件事是你的顶级标签有更大的字体.你当然希望它跨越3列(同样,这个数字3与你稍后将创建的按钮行相关).您可能还希望文本在这3列中居中(我不确定您的偏好).

现在Labelframe你创造了.这是错的,labelwidget选项并不意味着你的想法.它指定一个Label小部件作为此标签框架的标签.因此,为此参数指定主框架毫无意义.也许您想要指定一些文本在标签框架中的某个位置可见.此外,此标签框架也必须以3的栏深度进行格式化.

对于"网格化"一般我建议指定选项in_,因此您可以清楚地了解哪个小部件是"网格化".有了这个,很明显,column=0, row=0每次加深小部件育儿级别时都要开始.

以下是我调整代码的方法:

import Tkinter
import ttk

class MakeGUI(object):
    def __init__(self,root):
        self.root = root
        self.root.title(u"Title")
        ## build frame
        self.mainframe = ttk.Frame(self.root, padding=(6, 6, 12, 12))
        self.mainframe.grid(sticky='nwse')
        for column in range(3):
            self.mainframe.columnconfigure(column, weight=1)
        self.mainframe.rowconfigure(1, weight=1)

        ## text labels
        ttk.Label(self.mainframe, text=u"Label Title", anchor='center',
                font=("Helvetica", 32)).grid(in_=self.mainframe,
                        column=0, row=0, columnspan=3, sticky="ew")

        self.lfdata = ttk.Labelframe(self.mainframe, padding=(6, 6, 12, 12),
                text='Labelframe')
        self.lfdata.grid(column=0, columnspan=3, row=1, sticky='nsew')
        info = (u"Source Filename", u"Source Text", u"Converted Text",
                u"Cleaned Source", u"Cleaned Converted", u"Details")
        for i, item in enumerate(info):
            ttk.Label(self.lfdata, text=u"%s:" % item).grid(in_=self.lfdata,
                    column=0, row=i, sticky='w')

        ## buttons
        btn = (u"Close", u"Next", u"Prev")
        for i, item in enumerate(btn):
            ttk.Button(self.mainframe, text=item).grid(in_=self.mainframe,
                    column=i, row=3)

def main():
    root = Tkinter.Tk()
    root.columnconfigure(0, weight=1)
    root.rowconfigure(0, weight=1)
    makeGUI = MakeGUI(root)
    root.mainloop()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

以下是程序启动时以及调整大小后的外观:

在此输入图像描述 在此输入图像描述