python 3.2.5网格粘/重不工作

时间:2014-04-21 19:30:33

标签: python tkinter

以下是该问题的简单说明。它由网格布局组成,我在row 0放置了一个按钮小部件,在row 1放置了一个文本小部件。

我想要的是row 1中的文本小部件与表单一起展开,同时保持文本小部件的顶部锚定NW(第0行不扩展)。问题是水平(列扩展正确,但文本小部件行没有。如果我摆脱按钮,文本小部件正确扩展。另外,我放在一起的原始形式更复杂,最好使用一个因此,基本上使用包不是解决方案。任何帮助都将不胜感激。

################################################

from tkinter import *

class Application(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent

        self.initGui()

    # ##################################################################
    # Initialize GUI widgets    
    def initGui(self):
        self.parent.title("Test Grid")
        self.parent.resizable(width=TRUE, height=TRUE)
        self.grid(sticky=W+E+N+S, padx=20, pady=20)
        self.parent.columnconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.parent.rowconfigure(1, weight=1)
        self.rowconfigure(1, weight=1)

        # Add a button to row 0
        self.btn = Button(self, text="Button", width=20)
        self.btn.grid(row=0, column=0, padx=(0,10),pady=(0,10), sticky=N+W)

        # Add a text box and v-scrollbar to row 1
        self.txtOut = Text(self, width=80, height=20)
        self.scrOut = Scrollbar(self)
        self.txtOut.grid(row=1,column=0,padx=(0,18),sticky=N+E+S+W)
        self.scrOut.grid(row=1,column=0,sticky=N+S+E)
        self.scrOut.config(command=self.txtOut.yview)
        self.txtOut.config(yscrollcommand=self.scrOut.set)
        print(self.grid_size())

def main():
    root = Tk()
    app = Application(parent=root)   
    app.mainloop()

if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:1)

有一种情况,使用pack可能是一个解决方案。如果在根窗口中打包Frame(Application)的实例,然后在该框架内打包网格小部件,则不会导致任何冲突。它将减少所有rowconfigure和columnconfigure方法的麻烦,对我来说更有意义。

def initGui(self):
    self.parent.title("Test Grid")
    self.parent.resizable(width=TRUE, height=TRUE)

    self.pack(fill=BOTH, expand=1, padx=20, pady=20)
    self.columnconfigure(0, weight=1)
    self.rowconfigure(1, weight=1)

答案 1 :(得分:1)

核心问题是你将应用程序框架放在第0行(零),但是你给第1行(一)重量为1(一)。这就是为什么在调整窗口大小时文本小部件不会展开的原因。

这很难看到,因为您在其父级中混合了窗口小部件的网格命令以及它自己的子窗口小部件。这使得很难快速扫描代码以查看布局选项是什么,因为您不能假设所有grid,pack或place命令仅影响子窗口小部件。

您的代码的另一个小问题是您将文本小部件和滚动条放在同一列中。

以下是我更改代码的方法:从self.grid中删除self.parent.*configureinitGui命令。然后,使用pack将应用程序框架添加到创建它的位置的根窗口。另外,将滚动条移动到第1列。

class Application(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent

        self.initGui()

    # ##################################################################
    # Initialize GUI widgets    
    def initGui(self):
        self.parent.title("Test Grid")
        self.parent.resizable(width=TRUE, height=TRUE)
        self.columnconfigure(0, weight=1)
        self.rowconfigure(1, weight=1)

        # Add a button to row 0
        self.btn = Button(self, text="Button", width=20)
        self.btn.grid(row=0, column=0, padx=(0,10),pady=(0,10), sticky=N+W)

        # Add a text box and v-scrollbar to row 1
        self.txtOut = Text(self, width=80, height=20)
        self.scrOut = Scrollbar(self)
        self.txtOut.grid(row=1,column=0,padx=(0,18),sticky=N+E+S+W)
        self.scrOut.grid(row=1,column=1,sticky=N+S)
        self.scrOut.config(command=self.txtOut.yview)
        self.txtOut.config(yscrollcommand=self.scrOut.set)
        print(self.grid_size())

def main():
    root = Tk()
    app = Application(parent=root)   
    app.pack(fill="both", expand=True)
    app.mainloop()

if __name__ == '__main__':
    main()