2024.6.11

PythonGUI编程

我们一般满足简单需求的话用python自带的tkinter库

import tkinter as tk
from tkinter import *

因为tk这个名字很长,为了方便我们这样导入tk库

坐标系和颜色
tk中的坐标系和我们常见的笛卡尔系不同,它以屏幕最左上角为原点,x向右y向下为正方向延申,单位是像素点

而当我们在tkinter中设置颜色时,可以用两种表示颜色的方式:一种是颜色的名称,比如"green", “brown”;
另一种是颜色的十六进制形式,比如"#00ffff"。
如果需要使用颜色RGB形式,需要把它转换成十六进制形式。
这种十六进制形式相当于:“#”+R的十六进制+G的十六进制+B的十六进制。比如(255, 255, 255)是纯白,转换成十六进制形式就变成了#ffffff。

Root窗口
我们所有的组件都需要放在一个容器中,被放进容器的称为子组件(窗口),容纳的称为父窗口
最外层的这个容器我们一般称之为根窗口,毕竟它是所有组件的根基.
当然,我们一般也只使用一个根窗口
子窗口父窗口的生命周期不同,当父窗口关闭后,所有的子窗口会跟着关闭,但是子窗口关闭,父窗口不会关闭。

from tkinter import *
 
root = Tk()
root.mainloop()

我们在创建完窗口后为了使窗口一直保持,我们需要用到的mainloop方法,不然窗口闪一下就消失了

这样创建的窗口什么都是默认的,我们想要改变窗口属性的话,需要以下几个方法来修改:

title(string=“tk”) 设置窗口的标题,同时返回窗口标题,默认名字就是tk
config() 设置样式的函数,后面组件部分会讲
iconbitmap() 设置窗口的图标,传递的参数就是指定图标文件(*.ico)的位置
resizable(width=None, height=None) 设定是否能够改变窗口的宽和高尺寸,默认是True
geometry(string=’ 宽 x 高+x偏移+y偏移’) 设置窗口的尺寸大小,同时返回当前窗口尺寸,这里参数需要传一个字符串

root.geometry(“300x100+20+50”)代表的就是把root窗口设置为300x100的尺寸,与屏幕最左边相隔20像素,与屏幕最上方相隔50像素。
可以只设置窗口的尺寸,即宽 x 高;也可以只设置窗口的位置,即+x+y。

组件

tkinter支持很多组件,可以帮助你完成一些功能。
组件根据坐标被排列在容器中,窗口的界面是该窗口中最大的容器。

组件被创建时有许多参数可以传递
master 组件的父容器,一般必选
name 组件在Tk内部的名称
bg(background) 改变组件的背景
fg(foreground) 改变组件的前景色,一般是文本颜色
width 组件的宽,单位是像素(在文本输入类组件中,单位是字符数量)
height 组件的高,单位是像素(在文本输入类组件中,单位是字符数量)
takefocus 组件是否能获取焦点
state 三种状态:normal, disabled, active。

所有组件都需要指定它的父容器,这决定了这个组件被容纳在哪个窗口
而很多时候,我们在开始创建组件时还未想好它需要的样式等等,那么我们就可以使用组件的config()方法,来使这个组件二次设置

布局管理

我们创建好了组件后,还需要决定这个组件摆放在什么位置
一共有三种摆放的方式:pack, grid, place。
注意:在同一个容器中,只能使用一种布局方式,要么组件都用pack,要么都用grid,要么都用place。

这里我比较习惯用place方法,一般只需要传入两个参数,一个是x一个是y
而组件安放时也是默认把组件最左上角当作点位与xy匹配

import tkinter as tk
from tkinter import *
 
root = Tk()
lab1 = Label(root, text="Hello, Tkinter!")
lab1.place(x=100, y=100)

Label

label是默认无边框样式的那个,可以容纳文字和图片的组件,可以看作是一个展示框
我们创建一个Label

import tkinter as tk
from tkinter import *
 
root = Tk()
lab1 = Label(root, text="Hello, Tkinter!",font=("黑体", 20, "bold"))
lab1.place(x=100, y=100)

可以看到我们需要给它指定父容器,不然它不知道它应该放在哪里
我们解释几个常用的参数:
text 显示的文本
font 文本的字体,格式控制为前字体后字号
image 显示的图片
bitmap 显示的位图,和image只能指定一个
textvariable 绑定的文本变量

我们先来理解一下tkinter提供的一些变量对象,它们都可以绑定到组件,并设置,获取,更改它们的值。
绑定的组件会随着设置而刷新。这些对象有StringVar()文本变量,IntVar()整数变量,DoubleVar()浮点数变量,BooleanVar()布尔值变量。

#建立一个tkinter变量的方法是:
var = tkinter.StringVar(value='Hellow')

#然后就可以设置变量的值:
var.set("Byebye")

#也可以获取变量的值:
sth = var.get()

而textvariable参数只需要传入一个变量textvariable=var,后期如果想要更改Label中的内容,可以执行var.set(value)来更改。
不设置的话是
需要注意的是,当设置了textvariable之后,text属性就不起作用了
需要注意的是,基本所有能显示文本的组件都可以绑定textvariable属性

Button
Button即按钮,可以绑定一个回调函数,用户点击时将会执行这个函数。
button与label都是带文本的组件,参数基本相同
但是button多了一个command参数
它需要传入一个函数来与button进行绑定
如果需要禁用这个按钮,我们则需要将state属性设置为disabled,此时按钮将无法点击触发

Entry
Entry是一个文本框组件,用户可以在里面输入文本。

import tkinter as tk
from tkinter import *
 
root = Tk()
lab1 = Entry(root,font=("黑体", 20, "bold"),show='*',textvariable=var)
lab1.place(x=100, y=100)

几个常用参数
font 输入文本字体
show 输入文本被显示为什么字符
textvariable 绑定的StringVar,同步Entry输入的内容

一般只用到一个方法
get() 获取文本框的值

Checkbutton
Checkbutton即多选框,用户可以勾选或取消勾选。Checkbutton可以绑定一个variable,一般是BooleanVar。Checkbutton拥有Button的参数之外,还可以有一些别的参数。

variable 与Checkbutton选择相关的Variable
onvalue 多选框选中时variable的值,默认为1
offvalue 多选框未选中时variable的值,默认为0

root = Tk()
root.title("我的窗口")
root.geometry("500x900")
root.resizable(False, False)
var=StringVar()

cb = Checkbutton(root, text="toogle", command=hanshu(), variable=var, onvalue="on", offvalue="off")
cb.pack()

这里就是创建了一个多选框,它显示的文本是’toogle’,当然,也可以办绑定一个字符变量
后面的表示,多选框的值传给var这个变量,选中时传递字符串on,未选中就是off
command表示多选框绑定了一个函数,被选中时默认调用相关函数,不设置就无事发生

多选框有以下几个方法
select() 选中多选框
deselect() 取消选中选框
toogle() 切换选框的选中状态(反选选框)
invoke() 调用Checkbutton的command(disabled无效)

RadioButton
Radiobutton
与多选框相对应,Radiobutton是单选框。多个单选框可以绑定一个variable,这个variable的值是选中的单选框的值。

root = Tk()
root.title("我的窗口")
root.geometry("500x900")
root.resizable(False, False)
var=StringVar()

cb = Radiobutton(root, text="toogle", command=hanshu(), variable=var, value=1)
cb.pack()

Radiobutton的参数和Checkbutton几乎完全一样,不同的是Radiobutton没有onvalue和offvalue这两个参数,而是由value这个参数代替。value参数的作用是:指定单选框选中时绑定的Var的值。

常用方法和Checkbutton介绍的几个基本一样,但是没有toogle方法。

Text
Text是多行文本输入框,和Entry不同的是,Entry只有单行。并且Text里面不仅能够插入文本,还可以插入图片、组件等,还可以有标记功能,对于特殊的内容改变颜色。

root = Tk()
root.title("我的窗口")
root.geometry("500x900")
root.resizable(False, False)
var=StringVar()

cb = Text(root,width=100,height=100)
cb.pack()

它没有text和textvariable属性
width Text的宽,以字符数量为单位
height Text的高,以行数为单位

wrap
设置Text的换行方式,可以是"none"(不自动换行), “char”(按字符换行), “word”(按单词换行)

设置为"none"时,如果字符数量超过Text的宽,不会进行换行,Text会进行滚动,以适应光标位置。

设置为"char"时,字符数量超过Text的宽,会换到下一行。

设置为"word"时,字符同样会换行,但是换到下一行的是一个完整的单词。

和Entry一样,我们用get()返回text中的字符串

Listbox

width 组件的宽,单位是字母的平均宽度
height 组件的高,单位是项目的数量

selectmode 组件的选择模式:
“browse”(单选,可用鼠标拖动或方向键改变选择,默认模式)
“single”(单选,只能鼠标点击改变选择)
“extended”(多选,需拖动鼠标或结合Shift或Ctrl键才能多选),
“multiple”(多选,点击多个选项就能多次选择)

from tkinter import *
 
root = Tk()
 
lb = Listbox(root)
lb.pack()
 
mainloop()

主要用到几个方法
curselection() 返回被选中选项的索引的元组
delete(first, last=None) 删除first到last的选项
insert(位置, 插入元素) 在列表框中添加单或多个选项,位置可以是’end’表示从尾部插入,也可以是’active’从头部插入
selection_includes(index) 返回位于index位置的项目的选中状态,1表示选中,0表示未选中
size() 返回列表框中选项数量

当Listbox中有项目选中时会产生一个虚拟事件<>,可以被bind捕捉到。
我们用bind绑定这个触发的虚拟事件和函数,使得被选中后可以调用函数

from tkinter import *
 
root = Tk()
 
lb = Listbox(root)
lb.pack()
 
for n in range(20):
    lb.insert("end", n)
 
def select(event):
    print(lb.curselection()) #打印选中项的索引
    
lb.bind("<<ListboxSelect>>", select)
 
mainloop()

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 03:32:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 03:32:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 03:32:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 03:32:02       18 阅读

热门阅读

  1. 爬虫案例实战

    2024-06-12 03:32:02       6 阅读
  2. 6、Spring之Bean生命周期~创建Bean(2)

    2024-06-12 03:32:02       7 阅读
  3. python-Bert(谷歌非官方产品)模型基础笔记0.1.099

    2024-06-12 03:32:02       8 阅读
  4. 游戏心理学Day11

    2024-06-12 03:32:02       11 阅读
  5. 【Python】(一)复习重点——控制流

    2024-06-12 03:32:02       10 阅读
  6. C++杂记

    2024-06-12 03:32:02       12 阅读
  7. 主题切换之CSS文件篇

    2024-06-12 03:32:02       6 阅读
  8. Android 上层的View透传/不透传 点击事件 到下层

    2024-06-12 03:32:02       11 阅读
  9. Python深度学习代码简介

    2024-06-12 03:32:02       11 阅读
  10. 【自我学习】圣多纳释放&莱斯特

    2024-06-12 03:32:02       11 阅读
  11. redis分布式锁话术

    2024-06-12 03:32:02       7 阅读