2011-10-20 8 views
1

TkinterのGRIDジオメトリマネージャまたはカスタムクラスのいずれか、またはその両方に問題があります。おそらく両方。ここでは、コードです:TkinterのGrid ManagerのPythonクラス

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() 

`

は、今ここで問題です:コードのこの作品は、私はそれが何をしたいすべてのものを行います。ここには3つのフレーム、上部フレームself.f1、中間フレームself.f2、下部フレームself.f3、および単純な終了ボタンがあります。上(行0)および下(行2)フレームは水平方向にサイズ変更され(列0)、中間フレームの行(行1、列0)はすべて水平方向および垂直方向にサイズ変更されます。すべてが良いです...自分のクラスを実装しようとするまではmyTestFrameです。

self.f2のカスタムフレームに、Text()というウィジェットを挿入しようとするたびに、物事が乾いてしまいます。それはデフォルトのテキストウィジェットを表示しますが、私のサイズ変更はファンキーになります、グリッド配置は狂っています。何が起こっている?

EDIT !!! 下記のunutbuの答えはもちろん、クラスの問題に役立ちます。今度はGRIDマネージャーが中間フレームself.f2の中にテキストウィジェットを正しく配置していますが、スティッキーをmyText.grid(sticky = N+S+E+W)に設定しても正しく展開されません。だから、私は次のように思った:class Appのコンストラクタでサイズ変更可能なルートウィンドウを設定することで、Appウィンドウの最初の行と0番目の列がすべてのスペース割り当てを受け取るように設定しました。 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を埋めていません!通常、カスタムクラスなしでこれを行うと、​​属性を使用すると正しく動作します。私はこれについて正しく考えていますか?

答えて

4

Frame.__init__ニーズ親を渡す:

class myTestFrame(tk.Frame): 
    tk.Frame.__init__(self, parent, *args, **kwargs) 

たRunnable例:

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() 
+0

はどうもありがとうございました。私がしなければならなかったのは、Frame .__ init __(self、None)をFrame .__ init __(self、parent)に変更することでした。再度、感謝します。 – voxeloctree

+0

私はすぐに話しました。上記の編集をご覧ください。私は本当にここで何が起こっているのか理解したい。 – voxeloctree

+0

'myTestFrame'は' rowconfigure'と 'columnconfigure'を呼び出して' weight = 1'を設定する必要があります。そうしないと、グリッド内のウィジェットは展開されません。私はこれを[こちら](http://www.tkdocs.com/tutorial/grid.html)で学びました。 – unutbu

関連する問題