Python GUI 设计(三)---Widget组件详解

2023-11-11

1.1 Canvas画布组件

Tkinter模块中的Canvas组件主要用于绘制图形、文字、设计动画等甚至也可以将其他小部件放在画布上,比如视频。它的语法格式如下。

Canvas(父窗口,options,...)

第一个参数是父窗口,表示这个画布建立在哪一个窗口对象内。canvas画布的相关参数的含义可以参考下表。
在这里插入图片描述
利用以上参数在窗口中创建一个宽度100,高度80的黄色画布,演示程序及效果可参考下图。

from tkinter import *  
top = Tk()
top.geometry("200x200")
canvas= Canvas(top,width=100,height=800,bg="yellow")  #创建画布
canvas.pack()
top.mainloop()

在这里插入图片描述
画布建立之后,左上角坐标是(0,0),向右x递增,向下y递增。除了创建画布之外,canvas还能进行图形绘制。

①绘制线条

Canvas组件绘制直线时可以通过create_line()方法实现,其使用方法如下:

create_line(x1,y1,x2,y2,...,options,...) 

线条会沿着(x1,y1),(x2,y2),···绘制下去,options为线条的可选参数,可参考下表。
在这里插入图片描述
利用以上参数设计不同颜色和宽度的线条,演示程序及效果可参考下图。分别绘制了宽度为5的黑色实线,宽度为2的蓝色实线和宽度为2的绿色虚线。

from tkinter import *  
top = Tk()
top.geometry("200x100")
canvas= Canvas(top,width=100,height=800,bg="pink")
canvas.pack()
canvas.create_line(10,10,190,10,width=5) #宽度为5,长度为180的黑色实线
canvas.create_line(10,50,190,50,fill = "blue",width=2) #蓝色实线
canvas.create_line(10,90,190,90,fill = "green",width=2,dash=(7,1)) #绿色虚线
top.mainloop()

在这里插入图片描述

②绘制矩形

Canvas组件绘制矩形时可以通过create_rectangle()方法实现,其使用方法如下:

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

其中(x1,y1)为矩形的左上角定点,(x2,y2)为矩形右下角定点,options为可选参数,可参考下表。
在这里插入图片描述
利用以上参数设计不同颜色和宽度的矩形,演示程序及效果可参考下图。第一个是无填充、边框为红色的矩形,第二个是黄色填充、边框为黑色的矩形。

from tkinter import *  
top = Tk()
top.geometry("200x100")
canvas= Canvas(top,width=200,height=100)
canvas.pack()
#宽度为5,线框为红色
canvas.create_rectangle(10,10,50,50,width=5,outline="red") 
#宽度为2,用黄色填充
canvas.create_rectangle(100,10,190,80,fill = "yellow",width=2) 
top.mainloop()

在这里插入图片描述

③绘制圆或椭圆

绘制圆和椭圆都可以通过create_oval()方法实现,其使用方法如下:

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

其中(x1,y1)为椭圆的左上角坐标,(x2,y2)为椭圆的右下角坐标,options为可选参数,有dash,fill,outline,width,他们的含义与绘制矩形的用法相类似。以设计一个黄色填充轮廓为红色的椭圆为例,演示程序及效果可参考下图。

from tkinter import *  
top = Tk()
top.geometry("200x100")
canvas= Canvas(top,width=200,height=100)
canvas.pack()
canvas.create_oval(50,10,150,90,fill = "yellow",outline="red") 
top.mainloop()

在这里插入图片描述

④添加文字

Canvas组件在画布增加文字时可以使用以下方法:

create_text(x, y, text, options)

参数 x与 y定义文字字符串的左上角坐标,参数 text 定义文字字符串的文字;参数 options 表示其他可选参数
在画布中增加文字,演示程序和效果如下:

from tkinter import *  
top = Tk()
top.geometry("300x300")
canvas= Canvas(top,bg ='yellow' ,width=200,height=200)
canvas.place(x=0,y=0)
canvas.create_text(50,50,text = "GUI界面") 
top.mainloop()

在这里插入图片描述

⑤插入图像

Canvas组件插入图像时可以通过create_image()方法在Canvas对象内插入图像文件,其使用方法如下:

create_image(x,y,options,...) 

其中(x,y)为图像左上角的坐标,options参数可以参考下表。
在这里插入图片描述
利用以上参数在画布窗口中插入图片,绘制一个蓝天白云的画面,利用PhotoImage加载图片,演示程序及效果可参考下图。

from tkinter import *  
top = Tk()
top.geometry("200x200")
canvas= Canvas(top,width=200,height=200,bg="SkyBlue")
canvas.pack()
house_img=PhotoImage(file=
"C:/Users/Administrator/Desktop/house.png")  #图片路径
cloud_img=PhotoImage(file=
"C:/Users/Administrator/Desktop/cloud.png")  #图片路径
canvas.create_image(100,20,image=cloud_img)  #图片左上角(100,20)
canvas.create_image(100,130,image=house_img) #图片左上角(100,130)
top.mainloop()

在这里插入图片描述

⑥关于画布的清除

方法1:清除画布所有内容

canvas.delete('all')

方法2:清除画布中指定内容,不完全清除整个画布

canvas.delete(canvas1)  #canvas1是canvas画布的某类方法

canvas1是canvas画布的某类方法,比如canvas1=canvas.create_text(50,50,text = “GUI界面”) ,canvas1是画布里面的文字方法,需要将该文字从画布里面清除,就指定清除的对象。

1.2 Messagebox会话框组件

Messagebox根据会话窗口的应用场景,提供了8种会话框,下面表格列出了4种常用的会话框。
在这里插入图片描述

1.3 Frame框架组件

Frame框架组件是一个在屏幕上的矩形区域。它主要作为其他组件的框架基础,当组件非常多的时候,就可以利用Frame框架组件将其他组件分类管理。Frame组件的语法如下:

Frame(top,options,...) 

第一个参数是父窗口,表示这个框架建立在哪一个窗口对象内。Frame框架的部分参数的含义可以参考下表。
在这里插入图片描述
利用以上参数建立3个不同颜色的框架,在每个框架内各放置一个按钮,演示程序及效果可参考下图。

from tkinter import *  
top = Tk()
top.geometry("200x100")
Frame1 = Frame(top,bg="red",height=33,width=100)
Frame1.pack()
Button(Frame1,text="1号金蛋").pack(padx=30,pady=2)
Frame2 = Frame(top,bg="green",height=33,width=100)
Frame2.pack()
Button(Frame2,text="2号金蛋").pack(padx=30,pady=2)
Frame3 = Frame(top,bg="yellow",height=33,width=100)
Frame3.pack()
Button(Frame3,text="3号金蛋").pack(padx=30,pady=2)
top.mainloop()

在这里插入图片描述
参考以上程序,假如要实现按下某个按钮,能够显示新的画面,可以通过利用pack_forget(),grid_forget(),place_forget()的方法,实现Frame框架组件的整体隐藏。

以按下“1号金蛋”按钮为例,按钮按下后,原先的框架组件Frame1及其中的组件会隐藏起来,然后建立新的框架组件Frame1_new,来放置标签组件。演示程序及效果可参考如下。

from tkinter import *  
def button1(Frame1):
  Frame1.place_forget()
  Frame1_new = Frame(top)
  Frame1_new.place(relheight=1,relwidth=1)  #参数均为1,框架组件铺满整个窗口
  Label(Frame1_new,text = "谢谢惠顾!",font = ("楷体",20)).place(x=40,y=2)
top = Tk()
top.geometry("200x100")  #窗口长宽
Frame1=Frame(top,bg="yellow")
Frame1.place(relheight=1,relwidth=1)
Button(Frame1,text ="1号金蛋",command=lambda:button1(Frame1)).place(x=80,y=30)
top.mainloop()

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python GUI 设计(三)---Widget组件详解 的相关文章

随机推荐

  • HTTP Status 500 An exception occurred processing JSP page

    问题代码 出现异常界面 从上图可知在19处出现了异常 主要有两处 以及 为了很好的解决以上错误 我们将依次把传进来的各个参数在tomcat控制台上打印输出 先看看结果 主要操作代码 控制台显示结果 从以上输出可看到getRemoteAddr
  • Object.keys()、Object.values()、Object.entries()详解

    在JavaScript中 Object keys 是一个内置函数 用于获取一个对象中所有可枚举属性的名称 并返回一个包含这些属性名称的数组 以下是使用Object keys 函数的示例 const obj a 1 b 2 c 3 const
  • 代码混淆后可能出现的问题

    1 ClassNotFoundException NoSuchMethodError 原因 这种异常会在好多情况下出现 比如 本地代码通过反射调用其他的类 但是经过了混淆之后 就会出现如上异常 调用了JNI之后 C或者C 和java代码进行
  • 前端面试题复习二

    组件中写 name 选项有什么作用 项目使用 keep alive 时 可搭配组件 name 进行缓存过滤 DOM 做递归组件时需要调用自身 name Vue devtools 调试工具里显示的组见名称是由 Vue 中组件 name 决定的
  • 战双服务器维护,战双帕弥什维护到几点 战双帕弥什维护什么时候结束

    战双帕弥什今日正式火爆开测 随着大量玩家的加入 服务器也难免出现了过载情况 很多玩家在登陆时出现了战双帕弥什提示服务器未开放请稍后再试的情况 那么战双帕弥什维护什么时候结束 战双帕弥什维护原因是什么 快一起了解一下吧 战双帕弥什维护原因 1
  • C++ 匿名对象的生命周期——强化训练(二)

    include
  • STM32F10X单片机学习之PWM.C代码注解

    include stm32f10x h Device header void PWM Init void RCC APB1PeriphClockCmd RCC APB1Periph TIM2 ENABLE 开启 APB1 外设总线上的外设时
  • Unity最新热更新框架 hybridclr_addressable

    GitHub YMoonRiver hybridclr addressable 开箱即用的商业游戏框架 集成了主流的开发工具 将主流的GameFramework修改 支持Addressable和AssetBundle 已完善打包工具和流程
  • “黑色星期五”数据分析实战

    项目背景 美国圣诞节大采购一般是从感恩节之后开始的 感恩节是每年11月的第四个星期四 因此它的第二天 也就是美国人大采购的第一天 在这一天 美国的商场都会推出大量的打折和优惠活动 以在年底进行最后一次大规模的促销 这有点类似于淘宝的双十一购
  • Java项目——文档搜索引擎

    文章目录 1 项目概述 2 准备阶段 2 1 项目创建 2 2 准备静态页面 3 搜索逻辑 4 分词 5 处理 HTML 文件 5 1 枚举文件夹中所有文件 5 2 预处理文件 5 2 1 获取标题 5 2 2 获取 URL 5 2 3 获
  • [VUE] 过滤器函数

    VUE 过滤器可以用在两个地方 双花括号插值和 v bind 表达式 代码如下 message capitalize div div 你可以在一个组件的选项中定义本地的过滤器 filters capitalize function valu
  • Apple Magic Mouse 卡顿的问题

    更新时间 2022 06 30 17 58 37 发现在公司使用就会很卡顿 在家里使用就很流畅 感觉还是公司信号被干扰了 更新时间 2022年06月13日 尝试过下面所以的方法 以及怀疑是键盘蓝牙干扰 把键盘关掉 最后的结论 都没什么卵用
  • opencv读写和保存中文路径图片及base64与图片互转

    文章目录 1 opencv读取中文路径图片 2 opencv保存中文路径图片 3 图片转base64 4 base64转图片 有几点要注意 cv2 imread filename flags cv2 imwrite filename img
  • 交叉编译器的安装方法

    首先简单介绍一下 所谓的搭建交叉编译环境 即安装 配置交叉编译工具链 在该环境下编译出嵌入式Linux系统所需的操作系统 应用程序等 然后再上传到目标机上 交叉编译工具链是为了编译 链接 处理和调试跨平台体系结构的程序代码 对于交叉开发的工
  • STL 常用函数

    STL 常用函数 本文参考自 C STL常用函数总结 总结学习用 sort 函数 排序函数 sort 起始地址 末尾地址 cmp 其中cmp是可以自己定义的函数名 sort a a 5 sort vec begin vec end bool
  • ajax内置对象有什么,用js内置对象XMLHttpRequest 来用ajax

    步骤 用XMLHTTPRequest来进行ajax异步数据交交互 主要有几个步骤 1 创建XMLHTTPRequest对象 最复杂的一步 if window XMLHttpRequest code for IE7 Firefox Chrom
  • Apache Beam程序向导4

    今天在集群上实验Beam On Spark的时候 遇到一个坑爹的问题 这个问题总结起来是一个java lang NoClassDefFoundError 错误 具体错误如下图1所示 图1 错误提示 该错误提示SparkStreamingCo
  • cesium中定位方法使用

    cesium中定位到位置 在cesium中viewer flyTo和Camera flyTo的区别挺大 我们通常会用camera来定位 但当需要加上一个倾斜角的时候 可能定位的结果就和预想的区别很大 需求 矩形的中心点位置 110 0 35
  • CSDN竞赛第35期题解

    CSDN竞赛第35期题解 1 题目名称 交换后的or 给定两组长度为n的二进制串 请问有多少种方法在第一个串中交换两个不同位置上的数字 使得这两个二进制串 或 的 结果发生改变 int n cin gt gt n string a b ci
  • Python GUI 设计(三)---Widget组件详解

    1 1 Canvas画布组件 Tkinter模块中的Canvas组件主要用于绘制图形 文字 设计动画等甚至也可以将其他小部件放在画布上 比如视频 它的语法格式如下 Canvas 父窗口 options 第一个参数是父窗口 表示这个画布建立在