1

私は自分自身にPythonを教えており、ウィンドウGUIを使用するローカルアプリを構築しようとしています。を使用して画面をレイアウトしようとすると、多くの問題が発生しますgrid()。さまざまなコードスニペットを検索して試しましたが、同じ問題があり、フレームとウィジェットがフォーマットされていないようです。grid()以下のコードは本当に単純ですが、私の最終目標は、将来好きなGUIを構築できるように、使用方法を習得することです。

私は次のことができるようになりたいです:

--Window-----------------
| Section 1 | Section 2 |
|           |           |
-------------------------
| Section 3             |
|                       |
|                       |
-------------------------

from Tkinter import Button, Frame, Entry, Tk, Label, Menubutton, Menu, IntVar

class MainScreen(Frame):
def __init__(self, master):
    Frame.__init__(self, master)
    self.grid()
    self.searchSection()
    self.quitButton()


def searchSection(self):
    # Create Search Section
    self.searchFrame = Frame(self.master, bg='grey', relief='sunken', width=200, height=200)
    self.searchFrame.grid(row=0, column=0, rowspan=5, columnspan=30, sticky="wens")
    Label(self.searchFrame, text="Search :", bg='grey').grid(row=1, column=1, columnspan=20, sticky='w')
    self.searchField = Entry(self.searchFrame)
    self.searchField.grid(row=2, column=1, columnspan=7, sticky='w')
    #Create Menu Options
    self.search = Menubutton(self.searchFrame, text = "Search", bg='grey')
    self.search.grid(row=2, column=8, columnspan=3, sticky='w')
    self.search.menu = Menu(self.search, tearoff = 0)
    self.search['menu'] = self.search.menu       
    self.SearchType1Var = IntVar()
    self.search.menu.add_checkbutton(label="SearchType1", variable = self.SearchType1Var)


def quitButton(self):
    ## Provide a quit button to exit the rogram
    self.quitFrame = Frame(self.master, bg='grey', width=50, height=50)
    self.quitFrame.grid(row=0, column=20, rowspan=5, columnspan=5, sticky='ewns')
    self.quitButton = Button(self.quitFrame, text="Quit", command=exit)
    self.quitButton.grid()


if __name__ == '__main__':

root = Tk()
root.title("Learn Grid GUI")
root.geometry("800x600+200+150")
main = MainScreen(root)
root.mainloop()
4

2 に答える 2

2

サブフレームを使用するという本能は優れていますが、実装によって問題が本来よりも難しくなっています。一般的な経験則として、ウィジェットを作成してその親に配置するさまざまな関数を使用しないことをお勧めします。言い換えると、特定のコンテナgridのすべてのorpackステートメントは、通常、すべて同じ関数内にある必要があります。

私の経験では、レイアウトを実現するための最良の方法は「分割統治」です。たとえば、アスキー図面には3つのセクションが表示されます。それから始めて、それだけ。セクションごとに1つずつ、合計3つのフレームを作成します。それらに何かを追加しようとする前に、それらを適切にコンテナに配置してください。

これを行うときは、視覚化のために、最初に各フレームに異なる色と明示的なサイズを指定します。例えば:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master, *args, **kwargs)
        self.master = master
        self.s1 = tk.Frame(self, background="pink", width=200, height=200)
        self.s2 = tk.Frame(self, background="blue", width=200, height=200)
        self.s3 = tk.Frame(self, background="bisque", width=200, height=200)

        self.s1.grid(row=0, column=0, sticky="nsew")
        self.s2.grid(row=0, column=1, sticky="nsew")
        self.s3.grid(row=1, column=0, columnspan=2, sticky="nsew")

        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=1)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

それが適切に機能し、サイズが変更されたら、ウィジェットの追加に進むことができます。一度に1つのセクションです。GUIの主要部分がウィンドウのサイズ変更に適切に応答するようになっているので、プログラムの他の部分にどのように影響するかを気にせずに、すべての努力を1つのセクションに集中させることができます。

これらのセクションの1つにウィジェットを追加すると、そのセクション内の行と列は他のウィジェットから独立していることを知っておくことが重要です。たとえば、セクション2の列1に何かを配置すると、GUI全体の絶対列ではなく、セクション2内の列1を参照します。

説明のために、セクション3で検索ラベル、エントリウィジェット、およびメニューボタンをすべて配置することを想定します(質問から、それらをどこに配置するかはわかりません)。この場合、ラベルは行0にあり、2つの列にまたがっており、エントリウィジェットとメニューボタンは下の別々の列にあります。最初の列を拡大および縮小する必要があると思います。

これには、プログラムに2つの変更が必要です。1つ目はsearchSection、検索セクションにウィジェットを作成する関数を作成することです。2番目の変更は、GUIのコンストラクターでこの関数を呼び出すことです。

これが完全に機能する最終バージョンです。

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master, *args, **kwargs)

        self.s1 = tk.Frame(self, background="pink", width=200, height=200)
        self.s2 = tk.Frame(self, background="blue", width=200, height=200)
        self.s3 = tk.Frame(self, background="bisque", width=200, height=200)

        self.s1.grid(row=0, column=0, sticky="nsew")
        self.s2.grid(row=0, column=1, sticky="nsew")
        self.s3.grid(row=1, column=0, columnspan=2, sticky="nsew")

        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=1)

        # now create the search section
        self.searchSection(self.s1)

    def searchSection(self, parent):
        l = tk.Label(parent, text="Search :", bg='grey')
        self.searchField = tk.Entry(parent)
        self.search = tk.Menubutton(parent, text="Search", bg="grey")
        self.search.menu = tk.Menu(self.search, tearoff = 0)
        self.search['menu'] = self.search.menu
        self.SearchType1Var = tk.IntVar()
        self.search.menu.add_checkbutton(label="SearchType1", 
                                         variable = self.SearchType1Var)

        l.grid(row=0, column=0, columnspan=2, sticky='w')
        self.searchField.grid(row=1, column=0, sticky="ew")
        self.search.grid(row=1, column=1, sticky="ew")

        parent.grid_columnconfigure(0, weight=1)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()
于 2013-03-25T16:19:36.767 に答える
0

私が正しく理解していれば、あなたの問題はGUIをソートできないことです。答えは非常に簡単です。GUIを並べ替える場合は、ウィンドウに表示するのと同じ順序でコードを配置するだけです。例えば:

 --Window--
| text box |
|  button  |
|          |
------------

-Code-
[text box code here]
[button code here]
root.mainloop()

私は長い間tkinterで働いてきました、そしてそれは私のために働きました。幸運と幸せな休日!

LStyle

于 2013-03-24T11:00:07.107 に答える