Python& ttk使用labelFrames清理帧

时间:2012-12-18 05:23:29

标签: 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()

结果为: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()

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

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

任何指针 - 我一直在阅读各种资源/文档,并且找不到任何适合我的例子的东西(最有可能的是 - 我做的事情很傻......)而且我尝试过的任何东西都没有用过但是 - 包括我在其他相关示例中找到的pack()grid()和其他代码段。

1 个答案:

答案 0 :(得分: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()

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

enter image description here enter image description here