利用tkinter进行图形化编程(上)

1,915 阅读4分钟

tkinter是什么?

tkinter是Python标准图形库,是一个功能强大的图形用户界工具包,能够用来开发图形化界面,如应用程序中的窗口,按钮,菜单等

使用方法

首先,我们应该从导入tkinter库, 并创建自己的根窗口作为容器

import tkinter as tk
window = tk.Tk()
window.title("My Window") # 设置窗口的名称

使用内置的Canvas对象在根窗口中创建画布,并在其上进行操作,注意在上面进行的操作必须使用pack方法之后才能在上面显示出来,Canvas 上的主要参数有

  • width -> 控制窗口的宽度
  • height -> 控制窗口的高度
  • bg -> 控制窗口的背景颜色
c = Canvas(window, width=500,height=500, bg='white')
c.pack()

在画布上,我们可以进行许多操作,对应的画布中有许多方法

create_rectangle -- 创建矩形

语法:create_rectangle(x1,y1,x2,y2,options) 其中的坐标为矩形的两个对角的坐标

1

options:

  • tags -> 设置标签,可以用于查找
  • outline -> 设置轮廓
  • fill -> 设置填充颜色,为字符串
  • width -> 设置轮廓宽度
  • state -> 设置图像的状态,hidden为隐藏,默认为normal
  • dash -> 设置轮廓线为虚线,接受参数为元组,第一个画的像素,第二个为跳过多少像素
c.create_rectangle(10,10,100,100,outline='green', width=2)
c.create_rectangle(100,200,200,300, fill='red', state='normal',dash=(3,4))
c.create_rectangle(0,200,100,400,state='hidden', tag='#2') # 不会显示出来

在这里插入图片描述

create_oval -- 创建椭圆

create_oval(x1,y1,x2,y2,options) 其中(x1,y1), (x2,y2)对应的位置如箭头指向:

2

options:

  • tags -> 设置标签,可以用于查找
  • outline -> 设置轮廓
  • fill -> 设置填充颜色,为字符串
  • width -> 设置轮廓宽度
  • state -> 设置图像的状态,hidden为隐藏,默认为normal
  • dash -> 设置轮廓线为虚线,接受参数为元组,第一个画的像素,第二个为跳过多少像素
c.create_oval(100,100,200,200, outline='red',width=4, fill='green', dash=(3,4))

2

create_arc --创建弧形

create_arc(x1,y1,x2,y2,options) 坐标的定义与create_oval类似,不再赘述

options:

  • start -> 弧形开始的角度
  • extent -> 从开始位置旋转过的角度
  • style -> 定义类型 arc, chord, pieslice
  • width -> 线的宽度
  • fill -> 填充颜色,但只有 pieslice和chord有
  • state -> 设置图像的状态,hidden为隐藏,默认为normal
  • dash -> 设置轮廓线为虚线,接受参数为元组,第一个画的像素,第二个为跳过多少像素
c.create_arc(100,100,200,200, start=90, extent=90, style='pieslice', dash=(3,4), fill='grey')
c.create_arc(200,200,300,300, style='arc', start=90, extent=90)
c.create_arc(300,300,400,400, style='chord', start=90, extent=90, fill='grey')

3

create_text -- 创建文字

create_text(x,y,options) 位置为书写文字的中间

options:

  • text -> 需要显示的文字
  • font -> 需要显示的字体
  • anchor -> 定位的位置有E,S,W,N以及两两组合,默认为N
  • state -> 控制是否显示
  • width -> 控制文本宽度
  • justify -> 控制多行文本的对齐方式,其值为LEFT, CENTER,RIGHT, 默认为LEFT
c.create_text(200,200,text='Welcome here to learn python', font='mocano', justify=tk.LEFT)

create_image -- 显示图像

create_image(x,y,options) x, y 与anchor定义的方向有关,默认为N

img = tk.PhotoImage(file='./1.gif')
c.create_image(250,100,image=img)

首先,我们需要定义一个img,然后以参数的形式传递给函数即可,注意,PhotoImage只能使用.gif的图片,使用其他类型的,可以使用PIL中的Image

其他函数

- move

Canvas.move(object,dx,dy)

移动以及创建的对象,x轴移动dx,y轴移动dy

- delete

Canvas.delete(object)

删除对应的对象

- itemconfig

Canvas.itemconfig(object, options)

重新对对象进行设置,比如之前提到的fill, bg等等

- gettags

Canvas.gettags(object)

获取对象的属性

- find_withtag

Canvas.find_withtag(tag)

以标签来寻找到对应的对象的标识号(定义的每个对象返回的均为一个标识号,一般为整数)

练习

学习了上面的内容,我们便可以通过tkinter来进行简单的绘画了,下面我们来看看:

输入本金a,年利率i,年数n.计算今后n年的增值情况,计算公式是 a*((1+i)**n), 并用柱状图表示(例如可画成下面形状).注意最大高度应随a,i,n而定. 简单版:固定n为常数(如10年).

Answer

import tkinter

def draw(a,i,n):
    root = tkinter.Tk()
    root.title(" {} 年内的增值情况".format(n))
    height = 600
    height_scale = a*((1+i)**n)/(height*0.9)  # 最大高度占总高度的 90%
    width = 1000
    canvas = tkinter.Canvas(root,height=height, width=width)
    canvas.create_line(10,20,width-10,20,) # 最上面的线段
    canvas.create_line(10,height-20,width-10,height-20) # 最下面的线段
    space = width/(3*n+1)  # 矩形间空格的大小
    ori_space = space  
    rect_width = 2*space  # 每个矩形的宽度
    
    for j in range(0,n):  # 每年
        x = a*((1+i)**j)/height_scale
        canvas.create_rectangle(space,height-20-x,space+rect_width,height-20,fill='green')
        canvas.create_text(space+rect_width/2,height-20-x, text=round(x*height_scale,2))
        canvas.create_text(space+rect_width/2,height-10,text=j)
        space += ori_space+rect_width  # 下一个x值
    canvas.pack()
    root.mainloop()
    pass

def main():
    try:
        a = float(input("请输入本金: "))
        i = float(input("请输入年利率: "))
        n = int(input("请输入年数: "))
    except:
        print("输入错误,请重新输入")
    else:
        draw(a,i,n)

if __name__ == '__main__':
    main()