6

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

結果は次のとおりです。http://imgur.com/a/CwpCU#0

テキスト ラベル オブジェクトを保持するためのラベル フレームである 2 番目のコンテナー オブジェクトを追加しようとしましたが、その結果、ボタンがさらに上に移動します (したがって、ラベル フレームをグリッドに適切に参照していないと仮定します。

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

http://imgur.com/a/CwpCU#1ボタンとラベルの間の位置の交換と、ラベルフレームのほぼ目に見える側面に注意してください。

2 番目のバージョンを 1 番目のよりきれいなバージョンのように「見える」ようにしようとしています。

任意のポインタ-さまざまなリソース/ドキュメントを読んでいますが、私の例に合ったものを見つけることができません(おそらく-私は何かばかげたことをしています...)。pack()grid()および他の関連する例で見つけた他のスニペット。

4

1 に答える 1

10

調整が必要な箇所が多々ありますので、コメントさせて頂きます(忘れてしまいそうなので、下のコードを必ず確認してください)。

まず、フレーム内の列/行に重みを適用しても、ウィンドウのサイズを変更しても拡大されません。で行う必要がありますroot。その後、サイズ変更後のレイアウトに関する期待に合わせるために、フレーム内でそれを行うことができます。あなたの場合、最も理にかなっているのは、すべての列に同じ重み> 0を持たせ、2番目の行にのみ重み> 0を持たせることです。列の理由は、3つのボタンがあり、それらすべてを展開したいからです。フリースペースも同様。Labelframe2 番目の部分については、2 行目にがあることを考えると、これは直接観察です。他の行に 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()

プログラムの開始時とサイズ変更後の外観は次のとおりです。

ここに画像の説明を入力 ここに画像の説明を入力

于 2012-12-21T00:36:46.817 に答える