1、一个通用对的GUI模板界面
from tkinter import *
from tkinter import messagebox
# frame 组件是一个容器,可以用来放置其他的组件
class Application(Frame):
def __init__(self, master):
super().__init__(master=master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
pass
if __name__ == '__main__':
root = Tk()
root.geometry('300x400+100+100')
app = Application(root)
app.mainloop()
2、组件继承关系与字符尺寸&字符尺寸
3、 button组件的通用写法
# 导入配置文件;
# in-config: text = 'text'
import config
# 第一种写法
b1 = Button(self)
b1[config.text] = 'HelloWorld'
b1[config.command] = self.say_hai
b1.pack(side='top')
# 第二种写法
q = Button(self, text='Quit', fg='red', command=self.master.destroy)
q.pack(side='bottom')
# 利用anchor属性可以实现对组件内部的样式控制
# 主要由 英语单词 东南西北 首字母进行控制的 'eswn'
# 也就是说,当组件的尺寸过大时,我们可以控制组件内部的样式
self.master.destroy 指向的是自己的父级窗口被销毁的函数。
如果是父级窗口被销毁,那么子窗口也会被销毁
在tkinter里面,任意一个组件都可以被认为是一个‘窗口’, 也就是意味着其他的窗口组件也可以添加到这个窗口上。
pack布局如果不传入参数,默认的是center居中布局 pack的其他参数 side=‘left’,这个有点像css里面的:display:flex;justfy-content:start;样式。
4、label组件的通用写法
# 换一种写法,自己想怎么写都随意
# 先定义一个样式列表
l2c = {
config.text: '高旗老师\n哈哈哈\nbui',
config.width: 10,
config.height: 3,
config.bg: 'white',
config.foreground: config.color_orange,
config.font: ('黑体', 14),
config.justify: config.justify_right,
config.relief: config.relief_groove,
config.borderwidth: 1,
}
# 创建一个label组件
l2 = Label(self)
l2.config(**l2c)
l2.pack()
# 将photo定义为全局变量
global photo
photo = PhotoImage(file='path/to/your/photo/img')
l3 = Label(self, image=photo)
l3.pack()
label组件的中可以传入一张 tkinter-img 的tk图片对象,然后将图片对象渲染到label组件。图片对象必须要借助PhotoImage类来实例化,然后将label标签里面的image属性的值设置为该实例对象,要注意的是传入的图片大小和宽度不能修改,但是可以借助PIL图像处理库帮助完成,其方法是先将图片转化大小,然后再进行tk图像实例化。
实例化的图片对象必须是一个全局变量,因为mainloop事件循环里面在不断的进行更新事件
5、Entry单行文本输入框
e1 = Entry(self)
self.v1 = StringVar()
self.v1.set('admin')
# 双向关联绑定
e1[config.textvariable] = self.v1
e1.pack()
首先要设置一个StringVar()对象,这个是tk内置的一个字符类,里面设置了setter以及getter方法,也就是只可以通过这两种方法来设置和访问属性
其次将label组件中的textvariable属性绑定到字符的实例对象上,然后实现数据的双向绑定
6、多行文本输入框Text
# 创建一个多行文本的输入框
self.t1 = Text(self, width=40, height=12, bg=config.color_gray)
self.t1.pack()
# 普通文本通过索引值的插入
# 行的索引值是从1开始的,列的索引值是从0开始的
self.t1.insert(1.0, '0123456789\n9876543210')
# 从第二行,第四列开始的
self.t1.insert(2.3, '楚河日耽误,旱地和下图,谁知盘中惨,丽丽姐幸苦')
# 普通文本通过特殊的方式插入
# INSERT 表示在光标插入的地方输入
self.t1.insert(INSERT, ' Gaoqi')
# END 表示在段落结束的地方插入
self.t1.insert(END, '[sxt]')
# 文本的获取
# 核心,行号是从 1 开始的, 列号是从 0 开始的
text = self.t1.get(1.2, 1.6)
texts = self.t1.get(1.2, END)
# 向输入框中添加一个图片(图片的本质也是文本)
self.photo = PhotoImage(file='./unit.png')
self.t1.image_create(END, image=self.photo)
# 向text文本框中添加一个按钮组件
b1 = Button(self.t1, text='这是动态添加的按钮')
self.t1.window_create(INSERT, window=b1)
# 删除文本
self.t1.delete(1.0, END)
# 段落标记
# 选定段落。创建一个标记
self.t1.tag_add('good', 1.0, 1.9)
# 给标记绑定相关的样式
self.t1.tag_config('good', background=config.color_yellow, foreground=config.color_red)
# 给标记的样式绑定一个事件
self.t1.tag_bind('good', '<Button-1>', callback)
多行文本输入框获取文