我正在尝试使用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()
结果为:
我一直在尝试添加第二个容器对象,一个标签框来保存文本标签对象,这会导致按钮向上移动(所以我假设我没有正确地将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()
导致:注意按钮abd标签之间的位置交换,以及labelframe的几乎可见方面。
我正试图让第二个版本'看起来'像第一个更漂亮的版本。
任何指针 - 我一直在阅读各种资源/文档,并且找不到任何适合我的例子的东西(最有可能的是 - 我做的事情很傻......)而且我尝试过的任何东西都没有用过但是 - 包括我在其他相关示例中找到的pack()
,grid()
和其他代码段。
答案 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()
以下是程序启动时以及调整大小后的外观: