一個GUI應用程序有很多的組件,將這些組件有序美觀地排布在窗口上,需要用Tkinter提供的佈局管理器,tkinter提供了三種管理其:pack,grid和place.
下面這個代碼是用grid來進行的佈局管理。
在看代碼之前介紹幾個重要的選項:
row :單元格的行號
column:單元格的列號。
columnspan:跨越的列數。
rowspan:跨越的行數。
ipadx,ipady設置組件之間x方向和y方向的間隔。單位爲像素。
sticky:默認是center,組件緊貼着該單元格里的某一角或者對應於東南西北中某些角,如WE,代表緊貼單元格的東西兩個方向,這樣組件就會橫向佔滿整個單元格,方向用大寫字母ESWN這四個字母表示。
下面代碼實現的功能就是仿計算器界面設計。
效果如圖:
代碼如下:
# GUI經典寫法:面向對象的寫法
# Frame框架是一個容器,放其他組件的容器
# 下面是一個測試經典的GUI程序的寫法,使用面向對象的方式
# Radiobutton是單選按鈕組件
# 屬性有:value = ' '設置該單選按鈕對應的值
# variable = self.v可以設置其對應的變量,可以設置對應變量的值來初始化單選按鈕的選中狀態
# 多個組件對應一個變量,則可以認定這幾個組件是一組。
from tkinter import *
from tkinter import messagebox
import os
import webbrowser
import random
class Application(Frame):
"""一個經典的GUI程序計算器設計"""
def __init__(self,master=None):#構造器,構造一個組件對象
super().__init__(master) #super代表的是父類的定義,而不是父類對象。
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
btnText = (('MC','M+','M-','MR'),
('C','±','➗','✖'),
(7,8,9,'-'),
(4,5,6,'+'),
(1,2,3,'='),
(0,'.'))
self.ent = Entry(self)
self.ent.grid(row = 0,column = 0,columnspan = 4,pady = 10) #columnspan跨列
for rindex,r in enumerate(btnText):
for cindex,c in enumerate(r):
if c == '=':
Button(self,text = c,width=2).grid(row = rindex+1,column = cindex,sticky = NSEW,rowspan = 2)
elif c == 0:
Button(self,text = c,width=2).grid(row = rindex+1,column = cindex,sticky = NSEW,columnspan = 2)
elif c == '.':
Button(self,text = c,width=2).grid(row = rindex+1,column = cindex+1,sticky = NSEW)
else:
Button(self,text = c,width=2).grid(row = rindex+1,column = cindex,sticky = NSEW)
if __name__ == '__main__':
root = Tk()
root.geometry("200x240+200+300")
root.title("計算器界面設計")
app = Application(master=root)
root.mainloop()