暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python图形界面化编程(上)

Golang学习杂记 2019-11-16
715

01

tkinter是什么?


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


02

使用方法


首先,我们应该从导入tkinter库, 并创建自己的根窗口作为容器,之后进行的操作都是在这个根窗口上进行

import tkinter as tk
window = tk.Tk()
window.title("My Window") # 设置窗口的名称
window.mainloop() # 使用该方法才会让窗口一直显示


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

  • width -> 控制窗口的宽度

  • height -> 控制窗口的高度

  • bg -> 控制窗口的背景颜色

c = Canvas(window, width=500,height=500, bg='white')
c.pack()


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


01

create_rectangle -- 创建矩形

语法:

create_rectangle(x1,y1,x2,y2,options) 

其中的坐标为矩形的两个对角的坐标

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') # 不会显示出来



02

create_oval -- 创建椭圆

语法:

create_oval(x1,y1,x2,y2,options) 

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

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))



03

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')



04

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)




05

create_image -- 显示图像

语法:

create_image(x,y,options)

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

  • img -> 接受一个图片对象

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


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

from tkinter import *
from PIL import ImageTk, Image
root = Tk()
root.title("My Window")
c = Canvas(root, width=500,height=400)
img1 = Image.open('./logo.png')
img = ImageTk.PhotoImage(img1)
c.create_image(250,100,image=img, anchor=N)


c.pack(side='top')
root.mainloop()

使用上述代码,可以得到如图效果



06

其他函数

01

move

Canvas.move(object,dx,dy)

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

02

delete

Canvas.delete(object)

删除对应的对象

03

itemconfig

Canvas.itemconfig(object, options)

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

04

gettags

Canvas.gettags(object)

获取对象的属性

05

find_withtag

Canvas.find_withtag(tag)

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


03

练习

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

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



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



不懂之处,可后台留言,或访问博客,在博客后提问



文章转载自Golang学习杂记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论