今天必须再为大家安排一篇粉丝提问的历史遗留问题,喜欢的朋友记得去文末三连击一下!
遗留问题
这段长文字是作者的回答,答案当然是可以。但是代码还是得自己打一遍才能理解,因此这里就不在上次的小工具里修改,想要更改上次小工具背景的小伙伴,可以看完本文后自行操作。
效果展示
Tkinter组件介绍
在上一次的文章中,相信各位对tkinter模块有了一个基础的了解,想看基础介绍的可以去前面那篇文章查看,这里就不浪费各位的时间,直接介绍今天的主角。
「Canvas」
Canvas是一个高度灵活的组件,你可以用它绘制图形和图表,创建图形编辑器,并实现各种自定义的小部件。通常被用来绘画各种图形以及放置图片。
用法:在Canvas组件上绘制对象,可以用create_xx()的方法,xx表示对象类型,例如线段line,矩形rectangle,文本text ,扇形arc,图片image,圆oval。
# 创建一个矩形,指定画布的颜色为白色
from tkinter import *
root = Tk()
cv = Canvas(root, bg='white')
cv.create_rectangle(10, 10, 200, 200)
cv.pack()
root.mainloop()
# 创建一个圆形,指定画布的颜色为白色
from tkinter import *
root = Tk()
cv = Canvas(root, bg='white')
cv.create_ovale(10, 10, 200, 200)
cv.pack()
root.mainloop()
# 创建画布,里面放上图片
from tkinter import *
from PIL import Image,ImageTk
root = Tk()
#注该代码下须有对应的图片文件
im_root = ImageTk.PhotoImage(Image.open('猫.jpg'))
canvas_root = Canvas(root, width=440, height=440)
canvas_root.create_image(220, 220, image=im_root)
canvas_root.pack()
root.mainloop()
tkinter只支持gif格式,在展示jpg或png等格式,需使用PIL库获得ImageTk.PhotoImage对象代替tk.PhotoImage对象。
「Frame」
Frame(框架)控件在屏幕上显示一个矩形区域,多用来作为容器。在一些复杂的界面设计经常用到,用来将一定范围内的组件进行分组,方便管理;亦或者在一些需要用到界面切换时,常常用到。
from tkinter import *
def change():
frame1.pack_forget() #将该框架隐藏
frame2.pack()
def change1():
frame2.pack_forget() #将该框架隐藏
frame1.pack()
root = Tk()
root.geometry('200x100+600+300')
frame1 = Frame(root)
frame2 = Frame(root)
Label(frame1, text="你好").grid(row=0,column=0)
Label(frame2, text="hello").grid(row=0,column=0)
Button(frame1, text="hello", command=change).grid(row=0,column=1)
Button(frame2, text="你好",command=change1).grid(row=0,column=1)
frame1.pack()
frame2.pack()
frame2.pack_forget() #将该框架隐藏
root.mainloop()
完整代码
from tkinter import *
from PIL import Image,ImageTk
class tkinter():
def __init__(self,root):
self.root = root
self.root.title("数据分析与统计学之美") # 窗口标题栏
self.root.geometry('640x360+600+300') # 窗口大小
self.root.resizable(width=FALSE, height=FALSE) # 限制窗口大小,拒绝用户调整边框大小
self.frame=Frame(self.root,borderwidth=0) #创建两个框架
self.frame1=Frame(self.root)
def homepage(self):
global im_root, im_root1 # 注,在类里需将放置图片的对象定义为全局变量
im_root = ImageTk.PhotoImage(Image.open('草原.png')) #打开图片
im_root1 = ImageTk.PhotoImage(Image.open('草原一角.png'))
canvas_root = Canvas(self.frame, width=640, height=360)
canvas_root.create_image(320, 180, image=im_root) #放置图片
canvas_root.pack()
Button(self.frame, text="切换背景为日出",borderwidth=0, image=im_root1,command=self.switch_button,compound="center").place(width=200, height=50,x=1,y=2)
self.frame.pack()
self.Se_page() #先将两个框架内容展示出来,再将其中一个隐藏起来
self.frame1.pack_forget() #隐藏第二个框架的内容
def switch_button(self): #隐藏第一个框架内容,展示第二个框架内容
self.frame.pack_forget()
self.frame1.pack()
def Se_page(self):
global im_root2, im_root3 # 注,在类里需将放置图片的对象定义为全局变量
im_root2 = ImageTk.PhotoImage(Image.open('日出.png'))
im_root3 = ImageTk.PhotoImage(Image.open('日出一角.png'))
canvas_root = Canvas(self.frame1, width=640, height=360)
canvas_root.create_image(320, 180, image=im_root2)
canvas_root.pack()
Button(self.frame1, text="背景切换为草原",borderwidth=0, image=im_root3,command=self.switch_button1,compound="center").place(width=200, height=50,x=440,y=2)
self.frame1.pack()
def switch_button1(self): #隐藏第二个框架内容,展示第一个框架内容
self.frame1.pack_forget()
self.frame.pack()
if __name__ == '__main__':
root = Tk()
tk = tkinter(root)
tk.homepage()
root.mainloop()
如代码所示,在tkinter类里定义两个框架,用来放置不同的内容。
def homepage(self):
global im_root, im_root1 # 注,在类里需将放置图片的对象定义为全局变量
im_root = ImageTk.PhotoImage(Image.open('草原.png')) #打开图片
im_root1 = ImageTk.PhotoImage(Image.open('草原一角.png'))
canvas_root = Canvas(self.frame, width=640, height=360)
canvas_root.create_image(320, 180, image=im_root) #放置图片
canvas_root.pack()
Button(self.frame, text="切换背景为日出",borderwidth=0, image=im_root1,command=self.switch_button,compound="center").place(width=200, height=50,x=1,y=2)
self.frame.pack()
self.Se_page() #先将两个框架内容展示出来,再将其中一个隐藏起来
self.frame1.pack_forget() #隐藏第二个框架的内容
两个框架思路代码相同,这里只介绍第一个框架。框架里先打开我们要作为背景的图片,利用画布将图片放置上去作为框架的背景,再放置一个用来切换的按钮,由于按钮如果没有添加背景图片会显得很突兀。
因此我们可以处理一下图片,首先决定按钮要位于图片的哪个地方,然后打开截图工具,将按钮所在位置的内容截图下来,作为按钮的背景。