<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Tkinter 中的布局管理 > 原文: [http://zetcode.com/tkinter/layout/](http://zetcode.com/tkinter/layout/) 在 Tkinter 教程的這一部分中,我們介紹布局管理器。 在設計應用的 GUI 時,我們決定要使用哪些小部件以及如何在應用中組織這些小部件。 為了組織小部件,我們使用專門的不可見對象,稱為布局管理器。 有兩種小部件:容器及其子級。 容器將子項分組為合適的布局。 Tkinter 具有三個內置的布局管理器:`pack`,`grid`和`place`管理器。 `place`幾何管理器使用絕對定位來定位小部件。 `pack`幾何管理器在水平和垂直框中組織窗口小部件。 `grid`幾何管理器將小部件放置在二維網格中。 ## 絕對定位 在大多數情況下,程序員應使用布局管理器。 在某些情況下,我們可以使用絕對定位。 在絕對定位中,程序員以像素為單位指定每個小部件的位置和大小。 如果我們調整窗口大小,則小部件的大小和位置不會改變。 在各種平臺上,應用看起來都不同,在 Linux 上看起來不錯,在 Mac OS 上看起來不太正常。 在我們的應用中更改字體可能會破壞布局。 如果我們將應用翻譯成另一種語言,則必須重做布局。 `absolute.py` ```py #!/usr/bin/env python3 """ ZetCode Tkinter tutorial In this script, we lay out images using absolute positioning. Author: Jan Bodnar Last modified: April 2019 Website: www.zetcode.com """ from PIL import Image, ImageTk from tkinter import Tk, BOTH from tkinter.ttk import Frame, Label, Style class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Absolute positioning") self.pack(fill=BOTH, expand=1) Style().configure("TFrame", background="#333") bard = Image.open("bardejov.jpg") bardejov = ImageTk.PhotoImage(bard) label1 = Label(self, image=bardejov) label1.image = bardejov label1.place(x=20, y=20) rot = Image.open("rotunda.jpg") rotunda = ImageTk.PhotoImage(rot) label2 = Label(self, image=rotunda) label2.image = rotunda label2.place(x=40, y=160) minc = Image.open("mincol.jpg") mincol = ImageTk.PhotoImage(minc) label3 = Label(self, image=mincol) label3.image = mincol label3.place(x=170, y=50) def main(): root = Tk() root.geometry("300x280+300+300") app = Example() root.mainloop() if __name__ == '__main__': main() ``` 在此示例中,我們使用絕對定位放置了三個圖像。 我們使用位置幾何圖形管理器。 ```py from PIL import Image, ImageTk ``` 我們使用 Python Imaging Library(PIL)模塊中的`Image`和`ImageTk`。 ```py style = Style() style.configure("TFrame", background="#333") ``` 我們使用樣式將框架配置為具有深灰色背景。 ```py bard = Image.open("bardejov.jpg") bardejov = ImageTk.PhotoImage(bard) ``` 我們從當前工作目錄中的圖像創建圖像對象和照片圖像對象。 ```py label1 = Label(self, image=bardejov) ``` 我們用圖像創建一個`Label`。 標簽可以包含文本或圖像。 ```py label1.image = bardejov ``` 我們必須保留對圖像的引用,以防止圖像被垃圾收集。 ```py label1.place(x=20, y=20) ``` 將標簽放置在框架上的`x = 20`和`y = 20`坐標處。 ![Absolute](https://img.kancloud.cn/ae/14/ae14c208d3ebfadeb2e1bd8febf2ce3b_302x306.jpg) 圖:絕對定位 ## Tkinter 包管理器 `pack`幾何管理器在水平和垂直框中組織窗口小部件。 布局由`fill`,`expand`和`side`選項控制。 ### 按鈕示例 在下面的示例中,我們將兩個按鈕放置在窗口的右下角。 我們使用`pack`管理器。 `buttons.py` ```py #!/usr/bin/env python3 """ ZetCode Tkinter tutorial In this script, we use the pack manager to position two buttons in the bottom-right corner of the window. Author: Jan Bodnar Last modified: April 2019 Website: www.zetcode.com """ from tkinter import Tk, RIGHT, BOTH, RAISED from tkinter.ttk import Frame, Button, Style class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Buttons") self.style = Style() self.style.theme_use("default") frame = Frame(self, relief=RAISED, borderwidth=1) frame.pack(fill=BOTH, expand=True) self.pack(fill=BOTH, expand=True) closeButton = Button(self, text="Close") closeButton.pack(side=RIGHT, padx=5, pady=5) okButton = Button(self, text="OK") okButton.pack(side=RIGHT) def main(): root = Tk() root.geometry("300x200+300+300") app = Example() root.mainloop() if __name__ == '__main__': main() ``` 我們有兩個框架。 有一個基礎框架和一個附加框架,該框架可在兩個方向上擴展,并將兩個按鈕按到基礎框架的底部。 這些按鈕放置在水平框中,并位于此框的右側。 ```py frame = Frame(self, relief=RAISED, borderwidth=1) frame.pack(fill=BOTH, expand=True) ``` 我們創建另一個`Frame`小部件。 該小部件占用了大部分區域。 我們更改框架的邊框,使框架可見。 默認情況下,它是平坦的。 ```py closeButton = Button(self, text="Close") closeButton.pack(side=RIGHT, padx=5, pady=5) ``` 創建了`closeButton`。 將其放入水平盒中。 `side`參數使按鈕放置在水平線的右側。 `padx`和`pady`參數在小部件之間放置了一些空間。 `padx`在按鈕小部件之間以及`closeButton`和根窗口的右邊框之間放置一些空間。 `pady`在按鈕小部件與框架的邊框和根窗口的邊框之間放置一些空間。 ```py okButton.pack(side=RIGHT) ``` `okButton`放在`closeButton`旁邊,它們之間有 5px 的間距。 ![Buttons example](https://img.kancloud.cn/2e/30/2e3021e7a72d725d10baf85e9fec6111_302x226.jpg) 圖:按鈕示例 ### 回顧示例 `pack`管理器是一個簡單的布局管理器。 它可用于執行簡單的布局任務。 為了創建更復雜的布局,我們需要利用更多的框架,每個框架都有自己的包管理器。 `review.py` ```py #!/usr/bin/env python3 """ ZetCode Tkinter tutorial In this example, we use the pack manager to create a review example. Author: Jan Bodnar Last modified: April 2019 Website: www.zetcode.com """ from tkinter import Tk, Text, TOP, BOTH, X, N, LEFT from tkinter.ttk import Frame, Label, Entry class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Review") self.pack(fill=BOTH, expand=True) frame1 = Frame(self) frame1.pack(fill=X) lbl1 = Label(frame1, text="Title", width=6) lbl1.pack(side=LEFT, padx=5, pady=5) entry1 = Entry(frame1) entry1.pack(fill=X, padx=5, expand=True) frame2 = Frame(self) frame2.pack(fill=X) lbl2 = Label(frame2, text="Author", width=6) lbl2.pack(side=LEFT, padx=5, pady=5) entry2 = Entry(frame2) entry2.pack(fill=X, padx=5, expand=True) frame3 = Frame(self) frame3.pack(fill=BOTH, expand=True) lbl3 = Label(frame3, text="Review", width=6) lbl3.pack(side=LEFT, anchor=N, padx=5, pady=5) txt = Text(frame3) txt.pack(fill=BOTH, pady=5, padx=5, expand=True) def main(): root = Tk() root.geometry("300x300+300+300") app = Example() root.mainloop() if __name__ == '__main__': main() ``` 該示例顯示了如何創建具有多個框架和包裝管理器的更復雜的布局。 ```py self.pack(fill=BOTH, expand=True) ``` 第一個框架是基礎框架,其他框架放置在該基礎框架上。 請注意,除了在框架內組織子代外,我們還在基礎框架上管理框架。 ```py frame1 = Frame(self) frame1.pack(fill=X) lbl1 = Label(frame1, text="Title", width=6) lbl1.pack(side=LEFT, padx=5, pady=5) entry1 = Entry(frame1) entry1.pack(fill=X, padx=5, expand=True) ``` 前兩個小部件放置在第一幀上。 使用`fill`和`expand`參數水平拉伸該條目。 ```py frame3 = Frame(self) frame3.pack(fill=BOTH, expand=True) lbl3 = Label(frame3, text="Review", width=6) lbl3.pack(side=LEFT, anchor=N, padx=5, pady=5) txt = Text(frame3) txt.pack(fill=BOTH, pady=5, padx=5, expand=True) ``` 在第三幀內,我們放置一個標簽和一個文本小部件。 標簽固定在北方。 文本小部件將占據整個剩余區域。 ![Review example](https://img.kancloud.cn/81/4c/814c68c9888663ed86ec637fe4a3e0a2_302x326.jpg) 圖:回顧 example ## Tkinter 網格管理器 Tkinter 的`grid`幾何管理器用于創建計算器的骨架。 `calculator.py` ```py #!/usr/bin/env python3 """ ZetCode Tkinter tutorial In this script, we use the grid manager to create a skeleton of a calculator. Author: Jan Bodnar Last modified: April 2019 Website: www.zetcode.com """ from tkinter import Tk, W, E from tkinter.ttk import Frame, Button, Entry, Style class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Calculator") Style().configure("TButton", padding=(0, 5, 0, 5), font='serif 10') self.columnconfigure(0, pad=3) self.columnconfigure(1, pad=3) self.columnconfigure(2, pad=3) self.columnconfigure(3, pad=3) self.rowconfigure(0, pad=3) self.rowconfigure(1, pad=3) self.rowconfigure(2, pad=3) self.rowconfigure(3, pad=3) self.rowconfigure(4, pad=3) entry = Entry(self) entry.grid(row=0, columnspan=4, sticky=W+E) cls = Button(self, text="Cls") cls.grid(row=1, column=0) bck = Button(self, text="Back") bck.grid(row=1, column=1) lbl = Button(self) lbl.grid(row=1, column=2) clo = Button(self, text="Close") clo.grid(row=1, column=3) sev = Button(self, text="7") sev.grid(row=2, column=0) eig = Button(self, text="8") eig.grid(row=2, column=1) nin = Button(self, text="9") nin.grid(row=2, column=2) div = Button(self, text="/") div.grid(row=2, column=3) fou = Button(self, text="4") fou.grid(row=3, column=0) fiv = Button(self, text="5") fiv.grid(row=3, column=1) six = Button(self, text="6") six.grid(row=3, column=2) mul = Button(self, text="*") mul.grid(row=3, column=3) one = Button(self, text="1") one.grid(row=4, column=0) two = Button(self, text="2") two.grid(row=4, column=1) thr = Button(self, text="3") thr.grid(row=4, column=2) mns = Button(self, text="-") mns.grid(row=4, column=3) zer = Button(self, text="0") zer.grid(row=5, column=0) dot = Button(self, text=".") dot.grid(row=5, column=1) equ = Button(self, text="=") equ.grid(row=5, column=2) pls = Button(self, text="+") pls.grid(row=5, column=3) self.pack() def main(): root = Tk() app = Example() root.mainloop() if __name__ == '__main__': main() ``` 網格管理器用于組織框架容器中的按鈕。 ```py Style().configure("TButton", padding=(0, 5, 0, 5), font='serif 10') ``` 我們將`Button`小部件配置為具有特定的字體并具有一些內部填充。 ```py self.columnconfigure(0, pad=3) ... self.rowconfigure(0, pad=3) ``` 我們使用`columnconfigure()`和`rowconfigure()`方法在網格列和行中定義一些空間。 這樣,我們可以實現按鈕之間有一定的間隔。 ```py entry = Entry(self) entry.grid(row=0, columnspan=4, sticky=W+E) ``` `Entry`小部件是顯示數字的地方。 小部件放置在第一行中,它橫跨所有四列。 小部件可能不會占用網格中單元所分配的所有空間。 `sticky`參數沿給定方向擴展小部件。 在我們的案例中,我們確保條目小部件從左向右展開。 ```py cls = Button(self, text="Cls") cls.grid(row=1, column=0) ``` `cls`按鈕位于第二行和第一列。 請注意,行和列從零開始。 ```py self.pack() ``` `pack()`方法顯示框架小部件并為其指定初始大小。 如果沒有給出其他參數,則大小將足以顯示所有子項。 此方法將框架窗口小部件打包到頂級根窗口,該窗口也是一個容器。 `grid`幾何管理器用于組織框架小部件中的按鈕。 ![Calculator](https://img.kancloud.cn/5a/1b/5a1bb19c8b4203857326832d813a8d64_322x220.jpg) 圖:計算器 ### Windows 示例 以下示例使用`grid`幾何管理器創建 Windows 對話框。 `windows.py` ```py #!/usr/bin/env python3 """ ZetCode Tkinter tutorial In this script, we use the grid manager to create a more complicated Windows layout. Author: Jan Bodnar Last modified: April 2019 Website: www.zetcode.com """ from tkinter import Tk, Text, BOTH, W, N, E, S from tkinter.ttk import Frame, Button, Label, Style class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Windows") self.pack(fill=BOTH, expand=True) self.columnconfigure(1, weight=1) self.columnconfigure(3, pad=7) self.rowconfigure(3, weight=1) self.rowconfigure(5, pad=7) lbl = Label(self, text="Windows") lbl.grid(sticky=W, pady=4, padx=5) area = Text(self) area.grid(row=1, column=0, columnspan=2, rowspan=4, padx=5, sticky=E+W+S+N) abtn = Button(self, text="Activate") abtn.grid(row=1, column=3) cbtn = Button(self, text="Close") cbtn.grid(row=2, column=3, pady=4) hbtn = Button(self, text="Help") hbtn.grid(row=5, column=0, padx=5) obtn = Button(self, text="OK") obtn.grid(row=5, column=3) def main(): root = Tk() root.geometry("350x300+300+300") app = Example() root.mainloop() if __name__ == '__main__': main() ``` 在此示例中,我們使用`Label`小部件,`Text`小部件和四個按鈕。 ```py self.columnconfigure(1, weight=1) self.columnconfigure(3, pad=7) self.rowconfigure(3, weight=1) self.rowconfigure(5, pad=7) ``` 我們在網格中的小部件之間定義一些空間。 `weight`參數使第二列和第四行可增長。 該行和列被文本小部件占據,因此所有多余的空間都被它占用。 ```py lbl = Label(self, text="Windows") lbl.grid(sticky=W, pady=4, padx=5) ``` 標簽窗口小部件已創建并放入網格中。 如果未指定列和行,則假定為第一列或行。 該標簽向西粘貼,其邊框周圍有一些填充物。 ```py area = Text(self) area.grid(row=1, column=0, columnspan=2, rowspan=4, padx=5, sticky=E+W+S+N) ``` 文本窗口小部件已創建,并從第二行和第一列開始。 它跨越兩列和四行。 小部件和根窗口的左邊框之間有 4px 的間距。 最終,小部件將粘在所有四個方面。 因此,調整窗口大小時,文本小部件會向各個方向擴展。 ```py abtn = Button(self, text="Activate") abtn.grid(row=1, column=3) cbtn = Button(self, text="Close") cbtn.grid(row=2, column=3, pady=4) ``` 這兩個按鈕位于文本小部件旁邊。 ```py hbtn = Button(self, text="Help") hbtn.grid(row=5, column=0, padx=5) obtn = Button(self, text="OK") obtn.grid(row=5, column=3) ``` 這兩個按鈕位于文本小部件下方; “幫助”按鈕占據第一列,“確定”按鈕占據最后一列。 ![Windows example](https://img.kancloud.cn/42/e3/42e3444e4e24a3e934d82efb8a0c9d12_352x326.jpg) 圖:窗口示例 在 Tkinter 教程的這一部分中,我們介紹了小部件的布局管理。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看