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