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
を埋めていません!通常、カスタムクラスなしでこれを行うと、属性を使用すると正しく動作します。私はこれについて正しく考えていますか?
はどうもありがとうございました。私がしなければならなかったのは、Frame .__ init __(self、None)をFrame .__ init __(self、parent)に変更することでした。再度、感謝します。 – voxeloctree
私はすぐに話しました。上記の編集をご覧ください。私は本当にここで何が起こっているのか理解したい。 – voxeloctree
'myTestFrame'は' rowconfigure'と 'columnconfigure'を呼び出して' weight = 1'を設定する必要があります。そうしないと、グリッド内のウィジェットは展開されません。私はこれを[こちら](http://www.tkdocs.com/tutorial/grid.html)で学びました。 – unutbu