6

我正在尝试使用 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

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

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 标签之间的位置交换,以及标签框的可见方面。

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

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

4

1 回答 1

10

有很多地方需要调整,大家评论一下(我可能会忘记一些东西,所以一定要检查底部的代码)。

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

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

现在Labelframe您创建。这是错误的,该labelwidget选项并不意味着您认为它的作用。它指定一个Label小部件作为此标签框架的标签。因此,为这个参数指定你的主框架是没有意义的。也许您想指定一些文本在标签框架中的某个位置可见。此外,此标签框架也必须使用 3 的列跨度进行网格化。

对于一般的“网格化”,我建议您指定 option 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()

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

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

于 2012-12-21T00:36:46.817 回答