Python之tkinter 框架Frame的基本應用

框架Frame

  這是一個容器控件,當我們設計的GUI程序很複雜時,此時可以考慮將一系列相關的Widget控件組織在一個框架內,這樣比較方便管理。構造方法語法如下:

# 父對象可以省略
Frame(父對象, options, ...)

參數:

  • 第一個參數:父對象,表示這個框架將建立在哪一個窗口內
  • 第二個參數:options,參數如下
參數 含義
borderwidth 邊界寬度
默認是兩個像素
bd 邊界寬度
默認是兩個像素
bg 背景顏色
background 背景顏色
cursor 當鼠標光標移至框架上時的形狀
height 高,單位是字符高
highlightbackground 當框架沒有獲取焦點時的顏色
highlightcolor 當框架取得焦點時的顏色
highlighthickness 當框架取得焦點時的厚度
relief 可由此控制框架外框
默認是relief=FLAT
width 框架的寬度,單位是像素
省略時會自動調整爲實際寬度

框架Frame的初步運用

例子:建立三個不同底色的框架

import tkinter

# 創建主窗口
root = tkinter.Tk()
for i in ["red", "orange", "lightgreen"]:
	# 這裏省略了root
    tkinter.Frame(bg=i, height=50, width=150).pack()

root.mainloop()

運行結果:
在這裏插入圖片描述
框架也是一個Widget控件,所以最後也需要使用控件配置管理器包裝與定位,也就是pack、grid等

例子:同時讓鼠標光標在不同的框架上有不同的形狀

import tkinter

# 創建主窗口
root = tkinter.Tk()
# 用字典存儲框架顏色與光標形狀
x = {"red": "cross", "orange": "boat", "lightgreen": "clock", "lightblue": "star"}

for i in x:
    # 建立四個不同底色的框架與光標形狀
    tkinter.Frame(bg=i, cursor=x[i], height=50, width=150).pack(side=tkinter.LEFT)

root.mainloop()

運行結果:
在這裏插入圖片描述

在框架內創建Widget控件

  創建框架時會傳回框架對象,假設此對象是A,以後在此框架內建立Widget控件時,此對象A就是框架內Widget控件的父容器,

A = Frame(root, ...)     # 傳回框架對象A
button = Button(A, ...)  # 框架對象A是button功能按鈕的父容器

例子

import tkinter

# 創建主窗口
root = tkinter.Tk()
# 建立上層框架
frameUp = tkinter.Frame(root, bg="lightyellow")
frameUp.pack()
# 上層框架第一個按鈕
butOne = tkinter.Button(frameUp, text="One", fg="red")
butOne.pack(side=tkinter.LEFT, padx=5, pady=5)
# 上層框架第二個按鈕
butTwo = tkinter.Button(frameUp, text="Two", fg="orange")
butTwo.pack(side=tkinter.LEFT, padx=5, pady=5)
# 上層框架第三個按鈕
butThree = tkinter.Button(frameUp, text="Three", fg="lightgreen")
butThree.pack(side=tkinter.LEFT, padx=5, pady=5)
# 建立下層框架
frameLow = tkinter.Frame(root, bg="lightblue")
frameLow.pack()
# 建立下層框架的按鈕
butLast = tkinter.Button(frameLow, text="Last")
butLast.pack(side=tkinter.LEFT, padx=5, pady=5)


root.mainloop()

運行結果:
在這裏插入圖片描述

活用relief 屬性

可以利用 relie 屬性的特性,將Widget 控件建立在框架內

例子

import tkinter

# 創建主窗口
root = tkinter.Tk()
frameOne = tkinter.Frame(width=150, height=80, relief=tkinter.GROOVE, borderwidth=5)
frameOne.pack(side=tkinter.LEFT, padx=5, pady=5)

frameTwo = tkinter.Frame(width=150, height=80, relief=tkinter.RAISED, borderwidth=5)
frameTwo.pack(side=tkinter.LEFT, padx=5, pady=5)

frameThree = tkinter.Frame(width=150, height=80, relief=tkinter.RIDGE, borderwidth=5)
frameThree.pack(side=tkinter.LEFT, padx=5, pady=5)

root.mainloop()

運行結果:
在這裏插入圖片描述

在含有raised屬性的框架內創建複選框

例子

import tkinter

# 創建主窗口
root = tkinter.Tk()
frame = tkinter.Frame(width=150, height=80, relief=tkinter.RAISED, borderwidth=5)
frame.pack(padx=10, pady=10)
label = tkinter.Label(frame, text="選擇你最喜歡的食物")
label.pack()
foodOne = tkinter.Checkbutton(frame, text="熱乾麪")
foodOne.pack(anchor=tkinter.W)
foodTwo = tkinter.Checkbutton(frame, text="油條")
foodTwo.pack(anchor=tkinter.W)
foodThree = tkinter.Checkbutton(frame, text="面窩")
foodThree.pack(anchor=tkinter.W)

root.mainloop()

運行結果:
在這裏插入圖片描述

額外對relief屬性的支持

在標準的Frame框架中,對於relief屬性並沒有完全支持。

例如,solidsunken屬性,此時可以使用tkinter.ttkFrameStyle模塊

例子

import tkinter
from tkinter.ttk import Frame, Style

# 創建主窗口
root = tkinter.Tk()
# 改用Style
style = Style()
# 改用alt支持Style
style.theme_use("alt")

fm1 = Frame(root, width=150, height=80, relief="flat")
fm1.grid(row=0, column=0, padx=5, pady=5)

fm2 = Frame(root, width=150, height=80, relief="groove")
fm2.grid(row=0, column=1, padx=5, pady=5)

fm3 = Frame(root, width=150, height=80, relief="raised")
fm3.grid(row=0, column=2, padx=5, pady=5)

fm4 = Frame(root, width=150, height=80, relief="ridge")
fm4.grid(row=1, column=0, padx=5, pady=5)

fm5 = Frame(root, width=150, height=80, relief="solid")
fm5.grid(row=1, column=1, padx=5, pady=5)

fm6 = Frame(root, width=150, height=80, relief="sunken")
fm6.grid(row=1, column=2, padx=5, pady=5)


root.mainloop()

運行結果:
在這裏插入圖片描述

上述程序中需使用tkinter.ttk模塊內Frame的作爲支持,纔可正常顯示relief外框。

alt參數主要是此機制內對於relief支持的參數

標籤框架LabelFrame

標籤框架的基本概念

  這也是一個容器控件,主要是將一系列相關Widget組織在一個標籤框架內,然後給他一個名稱,他的構造方法語法如下:

LabelFrame(父對象, options, ...)

參數:

  • 第一個參數:父對象,表示這個標籤框架將建立在哪一個窗口內
  • 第二個參數:options,參數如下
參數 含義
borderwidth 邊界寬度
默認是兩個像素
bd 邊界寬度
默認是兩個像素
bg 背景顏色
background 背景顏色
cursor 當鼠標光標移至按鈕上時的形狀
font 標籤框架中文字的字形
height 高,單位是字符高
highlightbackground 當框架沒有獲取焦點時的顏色
highlightcolor 當框架取得焦點時的顏色
highlighthickness 當框架取得焦點時的厚度
labelAnchor 設置放置標籤的位置
relief 可由此控制框架外框
默認是relief=FLAT
text 標籤內容
width 框架的寬度,單位是像素
省略時會自動調整爲實際寬度

例子

import tkinter

# 創建主窗口
root = tkinter.Tk()
textFirst = "歡迎登錄"
photo = tkinter.PhotoImage(file="1.png")
Logo = tkinter.Label(root, image=photo, text=textFirst, compound=tkinter.BOTTOM)
Logo.pack()

# LabelFrame標籤框架
labelFrame = tkinter.LabelFrame(root, text="登錄框")

accountLabel = tkinter.Label(labelFrame, text="賬號")
accountLabel.grid(row=0, column=0)

accountEntry = tkinter.Entry(labelFrame)
accountEntry.grid(row=0, column=1)

passWd = tkinter.Label(labelFrame, text="密碼")
passWd.grid(row=1, column=0)

passWdEntry = tkinter.Entry(labelFrame, show="*")
passWdEntry.grid(row=1, column=1)

labelFrame.pack(padx=10, pady=5, ipadx=5, ipady=5)

root.mainloop()

運行結果:
在這裏插入圖片描述

將標籤框架用於複選框

  標籤框架的應用範圍很廣泛,也常應用於將選項按鈕或是複選框組織起來

例子

import tkinter

def send():
    x = ""
    for j in cheakboxs:
        # 這裏實際上是cheakboxs[j].get() == True
        # 如果被勾選的話傳回來的值爲True
        # 如果沒有被勾選的話傳回來的值爲False
        if cheakboxs[j].get():
            x = x +foods[j] + "\n"
    print(x)
# 創建主窗口
root = tkinter.Tk()

# LabelFrame標籤框架
labelFrame = tkinter.LabelFrame(root, text="選擇最喜歡的食物")
foods = {0: "餃子", 1: "春捲", 2: "湯圓", 3: "混沌", 4: "熱乾麪"}
# 這裏負責給予字典的鍵一個False或者True的值,用於檢測是否被勾選
cheakboxs = {}
for i in range(len(foods)):
    # 這裏相當於是{0: False, 1: False, 2: False, 3: False, 4: False}
    cheakboxs[i] = tkinter.BooleanVar()
    # 只有被勾選才變爲True
    tkinter.Checkbutton(labelFrame, text=foods[i], variable=cheakboxs[i]).grid(row=i + 1, sticky=tkinter.W)

labelFrame.pack(padx=10, pady=5, ipadx=5, ipady=5)
button = tkinter.Button(root, text="提交", width=10, command=send)
button.pack()

root.mainloop()

運行結果:
在這裏插入圖片描述

頂層窗口 Toplevel

Toplevel 窗口的基本概念

  這個控件的功能類似於Frame,但是這個控件所產生的容器是一個獨立的窗口,有自己的標題欄和邊框。他的構造方法語法如下:

Toplevel(options, ...)

參數:

  • 第一個參數:options,參數如下
參數 含義
borderwidth 邊界寬度
默認是兩個像素
bd 邊界寬度
默認是兩個像素
bg 背景顏色
background 背景顏色
cursor 當鼠標光標在Toplevel 窗口上時的形狀
font 字形
fg 文字前景顏色
height 窗口高度
width 窗口寬度
Toplevel 窗口的基礎運行

例子

import tkinter

root = tkinter.Tk()

rootTwo = tkinter.Toplevel()
tkinter.Label(rootTwo, text="Python!!!").pack()
root.mainloop()

運行結果:
在這裏插入圖片描述
兩個窗口出現後,Toplevel 窗口關閉後,原主窗口仍可以繼續使用。但是如果關閉了主窗口,Toplevel 窗口將自動關閉

例子:設置Toplevel 窗口的標題和大小

import tkinter

root = tkinter.Tk()

rootTwo = tkinter.Toplevel()
rootTwo.title("Toplevel")
rootTwo.geometry("200x150")
tkinter.Label(rootTwo, text="Python!!!").pack()
root.mainloop()

運行結果:
在這裏插入圖片描述

使用按鈕彈出Toplevel窗口

例子

import tkinter
import random


def show():
    num = random.randrange(1, 10)
    t1 = tkinter.Toplevel()
    t1.geometry("100x80")
    t1.title("Toplevel")
    # BOTH 上下左右居中
    # expand是否填充額外的父容器空間
    tkinter.Label(t1, text=num).pack(fill=tkinter.BOTH, expand=True)


root = tkinter.Tk()
button = tkinter.Button(root, text="請點擊", command=show)
button.pack()

root.mainloop()

運行結果:
在這裏插入圖片描述

謝謝觀看,筆者會持續更新,如有錯誤或者建議,請私信我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章