Tkinter 网格管理器中的 Python 类

vox*_*ree 2 python grid resize class tkinter

我对 Tkinter 的 GRID 几何管理器或自定义类或两者都有问题。最有可能两者兼而有之。这是代码:

import sys
from tkinter import 

def main():
    app = App()
    app.master.title("Sample application")
    app.mainloop()

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid(sticky=N+S+E+W)

        top = self.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)

        self.rowconfigure(1, weight=1)
        self.columnconfigure(0, weight=1)
        self.__createWidgets()

    def __createWidgets(self):
        self.f1 = Frame(self, height=100, width=200,
            bg='green')
        self.f1.grid(row=0, column=0, sticky=E+W)

        self.f2 = Frame( self, bg= "yellow", height=100, width=200 ) ############################# CHANGE to self.f2 = myTestFrame( self )
        self.f2.grid(row=1, sticky = N+S+E+W)

        self.f3 = Frame( self, bg = "cyan", height = 100, width = 200 )
        self.f3.grid(row=2, sticky = E+W)

        self.quitButton = Button ( self, text="Quit", command=self.quit )
        self.quitButton.grid(row=4, column=0, columnspan=100,
            sticky=E+W)

class myTestFrame( Frame ):
    def __init__( self, parent):
        Frame.__init__(self, None)

        self.myText = Text( self )
        self.myText.grid()

        #self.testFrame = Frame ( self, bg = "white", height = 100, width = 300 )
        #self.testFrame.grid()

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

`

现在问题来了:这段代码完成了我想要它做的所有事情。这里有三个框架,顶部框架self.f1、中间框架self.f2、底部框架self.f3和一个简单的退出按钮。顶部(第 0 行)和底部(第 2 行)框架水平(第 0 列)调整大小,中间框架的行(第 1 行,第 0 列)接受水平和垂直调整大小的所有权重。一切都很好......直到我尝试实现我自己的类myTestFrame

每当我尝试self.f2使用Text()小部件填充自定义框架时,事情就会变得混乱。它显示默认文本小部件,但我调整大小变得时髦,GRID 放置很疯狂。到底是怎么回事?

编辑!!!下面 unutbu 的回答肯定有助于解决课堂问题。现在 GRID 管理器在中间框架内正确放置了一个文本小部件self.f2,但是,即使我在myText.grid(sticky = N+S+E+W)其中设置了粘性,也无法正确展开。所以我想到了以下几点:

1) 通过使用 的def __init__构造函数将根窗口设置为可调整大小class App,我将其设置为应用程序窗口的第一行和第零列将接收用于调整大小的所有空间分配self.rowconfigure( 1, weight = 1)self.columnconfigure( 0, weight = 1)

2) 现在框架self.f2被放置在第 1 行,它将接收所有调整大小的self.f2.grid(N+S+E+W).

3) 现在我用一个text()小部件填充这个自定义框架,该小部件通过声明self.myText.grid( sticky = N+S+E+W).

但是text()小部件没有填充self.f2!当我在没有自定义类的情况下正常执行此操作时,使用该sticky = N+S+E+W属性可以正常工作。我是否正确地考虑了这一点?

unu*_*tbu 5

Frame.__init__需要传递父:

class myTestFrame( tk.Frame ):
    tk.Frame.__init__(self, parent, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

可运行示例:

import sys
import Tkinter as tk
E=tk.E
W=tk.W
N=tk.N
S=tk.S
def main():
    app = App()
    app.master.title("Sample application")
    app.mainloop()

class App(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.grid(sticky=N+S+E+W)

        top = self.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)

        self.rowconfigure(1, weight=1)
        self.columnconfigure(0, weight=1)
        self.__createWidgets()

    def __createWidgets(self):
        self.f1 = tk.Frame(self, height=100, width=200, bg='green')
        self.f1.grid(row=0, sticky=E+W)

        self.f2 = myTestFrame(self, bg='yellow', height=100, width=200)

        self.f3 = tk.Frame( self, bg = "cyan", height = 100, width = 200)
        self.f3.grid(row=2, sticky=E+W)

        self.quitButton = tk.Button(self, text="Quit", command=self.quit)
        self.quitButton.grid(row=4, column=0, sticky=E+W)

class myTestFrame( tk.Frame ):
    def __init__(self, parent, cnf={}, **kw):
        tk.Frame.__init__(self, parent, cnf, **kw)
        self.grid(row=1, sticky=N+S+E+W)
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)                
        self.myText = tk.Text(self)
        self.myText.grid(row=0, sticky=N+S+E+W)

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