TKinter使用

简单使用

基本框架

import tkinter as tk
# 创建窗口
window = tk.Tk()

# 设置窗口标题
window.title("This is demo")
# 设置窗口尺寸
window.geometry("500x300")  # 设置窗口尺寸 长x宽
# window.resizable(width=False, height=False) # 设置窗口大小无法改变


# 窗口主循环
window.mainloop()
(Label)添加文本显示
import tkinter as tk
# 创建窗口
window = tk.Tk()

# 设置窗口标题
window.title("This is demo")
# 设置窗口尺寸
window.geometry("500x300")  # 设置窗口尺寸 长x宽
##### 新增
l = tk.Label(window, text="This is a demo",bg="green", font=("Arial", 12), width=20, height=3)
l.pack()
#####
# 窗口主循环
window.mainloop()
(Button)添加按钮
import tkinter as tk

# 创建主窗口
window = tk.Tk()

# 设置窗口标题
window.title("This is demo1")
# 设置窗口尺寸
window.geometry("500x300")
##### 变化
var = tk.StringVar()
count = 0
l = tk.Label(window, textvariable=var,bg="green", font=("Arial", 12), width=20, height=3)
l.pack()

def hit_me():
    global count
    count += 1
    var.set(f"you hit me {count}")
    print(count)


b = tk.Button(window, text="hit me", font=("Arial",12), width=10, height=1, command=hit_me)
b.pack()
####
window.mainloop()
(Entry)添加单行文本输入
import tkinter as tk

window = tk.Tk()
window.title("This is demo2")
window.geometry("500x300")

# 显示明文
e1 = tk.Entry(window, show=None, font=("Arial", 14))  
# 显示密文
e2 = tk.Entry(window, show="*", font=("Arial", 14))

e1.pack()
e2.pack()

window.mainloop()

(Text)多行文本区域
import tkinter as tk

window = tk.Tk()

window.title("This is demo3")
window.geometry("500x300")

e = tk.Entry(window, show=None)
e.pack()

def insert_point():
    var = e.get()
    t.insert("insert", var)

def insert_end():
    var = e.get()
    t.insert("end", var)
    # 插入文本后是窗口聚焦到末尾
    t.see("end")

b1 = tk.Button(window, text="insert", width=10, height=1, command=insert_point)
b2 = tk.Button(window, text="insert end", width=10, height=1, command=insert_end)

b1.pack()
b2.pack()

# 创建并放置一个多行文本框text用以显示,指定height=3为文本框是三个字符高度
t = tk.Text(window, height=3)
t.pack()


window.mainloop()
(Listbox)列表框部件
import tkinter as tk


window = tk.Tk()

window.title("This is demo4")
window.geometry("500x300")

var_l = tk.StringVar()
l = tk.Label(window, textvariable=var_l, font=("Arial", 14), width=10, height=3)
l.pack()

def show():
    select = lb.curselection()
    print("select",select, type(select))
    if not select:
        return 
    value = lb.get(select)
    print("value", value, type(value))
    var_l.set(value)


b = tk.Button(window, text="show select", command=show)
b.pack()
##### 新增
var = tk.StringVar()
var.set((1,2,3,4))
lb = tk.Listbox(window, listvariable=var)
'''
插入选项
lb.insert(1, "s1")
lb.insert(2, "s2")
lb.insert("end", "se")
'''
lb.pack()
#####
window.mainloop()
Radiobutton窗口部件

Radiobutton:代表一个变量,它可以有多个值中的一个。点击它将为这个变量设置值,并且清除与这同一变量相关的其它radiobutton

import tkinter as tk

window = tk.Tk()

window.title("radio button")
window.geometry("500x300")

var = tk.StringVar()  # 获取选项值

def select():
    print(f'get {var.get()}')

r1 = tk.Radiobutton(window, text="A",variable=var,value=1,command=select)
r1.pack()
r2 = tk.Radiobutton(window, text="B",variable=var,value=2,command=select)
r2.pack()


window.mainloop()
check button 勾选
import tkinter as tk

window = tk.Tk()

window.title("check button")
window.geometry("500x300")

def check_selection():
    print(f"value {var1.get()}")

var1 = tk.IntVar()
c1 = tk.Checkbutton(window, text="option1", variable=var1, onvalue=1, offvalue=0, command=check_selection)
c1.pack()

window.mainloop()
Scale 滑块部件
import tkinter as tk

window = tk.Tk()

window.title("scale")
window.geometry("500x300")

def scaleValue(v):
    print(f"scale {v}")

s = tk.Scale(window, label="try me", from_=0, to=10, orient=tk.HORIZONTAL, length=200, showvalue=1, \
    tickinterval=2, resolution=0.01, command=scaleValue
    )
s.pack()
window.mainloop()
Canvas 部件

Canvas:画布,提供绘图功能(直线、椭圆、多边形、矩形) 可以包含图形或位图,用来绘制图表和图,创建图形编辑器,实现定制窗口部件。


import tkinter as tk  # 使用Tkinter前需要先导入

# 第1步,实例化object,建立窗口window
window = tk.Tk()

# 第2步,给窗口的可视化起名字
window.title('My Window')

# 第3步,设定窗口的大小(长 * 宽)
window.geometry('500x300')  # 这里的乘是小x

# 第4步,在图形界面上创建 500 * 200 大小的画布并放置各种元素
canvas = tk.Canvas(window, bg='green', height=200, width=500)
# 说明图片位置,并导入图片到画布上
image_file = tk.PhotoImage(file= "pic.gif")  # 图片位置(相对路径,与.py文件同一文件夹下,也可以用绝对路径,需要给定图片具体绝对路径)
image = canvas.create_image(250, 0, anchor='n',image=image_file)        # 图片锚定点(n图片顶端的中间点位置)放在画布(250,0)坐标处
# 定义多边形参数,然后在画布上画出指定图形
x0, y0, x1, y1 = 100, 100, 150, 150
line = canvas.create_line(x0-50, y0-50, x1-50, y1-50)                   # 画直线
oval = canvas.create_oval(x0+120, y0+50, x1+120, y1+50, fill='yellow')  # 画圆 用黄色填充
arc = canvas.create_arc(x0, y0+50, x1, y1+50, start=0, extent=180)      # 画扇形 从0度打开收到180度结束
rect = canvas.create_rectangle(330, 30, 330+20, 30+20)                  # 画矩形正方形
canvas.pack()

# 第6步,触发函数,用来一定指定图形
def moveit():
    canvas.move(rect, 2, 2) # 移动正方形rect(也可以改成其他图形名字用以移动一起图形、元素),按每次(x=2, y=2)步长进行移动

# 第5步,定义一个按钮用来移动指定图形的在画布上的位置
tk.Button(window, text='move item',command=moveit).pack()

# 第7步,主窗口循环显示
window.mainloop()
Menu 菜单条

Menu:菜单条,用来实现下拉和弹出式菜单,点下菜单后弹出的一个选项列表,用户可以从中选择

import tkinter as tk

window = tk.Tk()

window.title("Menu")
window.geometry("500x300")

def job1():
    print("do job1")
# 创建一个菜单栏,这里我们可以把他理解成一个容器,在窗口的上方
menubar = tk.Menu(window)
# 创建一个File菜单项(默认不下拉,下拉内容包括New,Open,Save,Exit功能项)
filemenu = tk.Menu(menubar, tearoff=0)
# 将上面定义的空菜单命名为File,放在菜单栏中,就是装入那个容器中
menubar.add_cascade(label="File", menu=filemenu)


# 在File中加入New、Open、Save等小菜单,即我们平时看到的下拉菜单,每一个小菜单对应命令操作
filemenu.add_command(label="New", command=job1)
filemenu.add_command(label="Open", command=job1)
filemenu.add_command(label="Save", command=job1)
filemenu.add_separator()  # 添加一条分隔线
filemenu.add_command(label="Exit", command=window.quit)
# 创建第二级菜单,即菜单项里面的菜单
submenu = tk.Menu(filemenu)
filemenu.add_cascade(label="Import", menu=submenu)
submenu.add_command(label="do1", command=job1)

# 创建菜单栏完成后,配置让菜单栏menubar显示出来
window.config(menu=menubar)

window.mainloop()
Frame 部件

Frame:框架,用来承载放置其他GUI元素,就是一个容器,是一个在 Windows 上分离小区域的部件, 它能将 Windows 分成不同的区,然后存放不同的其他部件. 同时一个 Frame 上也能再分成两个 Frame, Frame 可以认为是一种容器

import tkinter as tk

window = tk.Tk()

window.title("frame")
window.geometry("500x300")
# 创建一个主frame,长在主window窗口上
frame = tk.Frame(window)
frame.pack()
# 创建第二层框架frame,长在主框架frame上面
frame_l = tk.Frame(frame)
frame_l.pack(side="left")

frame_r = tk.Frame(frame)
frame_r.pack(side="right")


tk.Label(window, text='on the window', bg='red').pack()
tk.Label(frame, text='on the frame', bg='pink').pack()
tk.Label(frame, text='on the frame', bg='pink').pack()
tk.Label(frame_l, text='on the frame_l1', bg='green').pack()
tk.Label(frame_l, text='on the frame_l2', bg='green').pack()
tk.Label(frame_l, text='on the frame_l3', bg='green').pack()
tk.Label(frame_r, text='on the frame_r1', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r2', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r3', bg='yellow').pack()

window.mainloop()
messageBox窗口部件

弹出的消息窗口

import tkinter as tk
import tkinter.messagebox
window = tk.Tk()

window.title("messagebox")
window.geometry("500x300")

def hitMe():
    tkinter.messagebox.showinfo(title='Hi', message='你好!')            # 提示信息对话窗
    # tkinter.messagebox.showwarning(title='Hi', message='有警告!')       # 提出警告对话窗
    # tkinter.messagebox.showerror(title='Hi', message='出错了!')         # 提出错误对话窗
    # print(tkinter.messagebox.askquestion(title='Hi', message='你好!'))  # 询问选择对话窗return 'yes', 'no'
    # print(tkinter.messagebox.askyesno(title='Hi', message='你好!'))     # return 'True', 'False'
    # print(tkinter.messagebox.askokcancel(title='Hi', message='你好!'))  # return 'True', 'False'



tk.Button(window, text="hit me", command=hitMe).pack()

window.mainloop()
窗口部件放置的三种方式
grid
import tkinter as tk

window = tk.Tk()

window.title("grid")
window.geometry("500x300")

for i in range(3):
    for j in range(3):
        tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10, ipadx=10, ipady=10)

window.mainloop()

以上的代码就是创建一个三行三列的表格,其实 grid 就是用表格的形式定位的。这里的参数 row 为行,colum 为列,padx 就是单元格左右间距,pady 就是单元格上下间距,ipadx是单元格内部元素与单元格的左右间距,ipady是单元格内部元素与单元格的上下间距。

pack
import tkinter as tk  # 使用Tkinter前需要先导入

# 第1步,实例化object,建立窗口window
window = tk.Tk()

# 第2步,给窗口的可视化起名字
window.title('My Window')

# 第3步,设定窗口的大小(长 * 宽)
window.geometry('500x300')  # 这里的乘是小x

# 第4步,pack 放置方法
tk.Label(window, text='P', fg='red').pack(side='top')    # 上
tk.Label(window, text='P', fg='red').pack(side='bottom') # 下
tk.Label(window, text='P', fg='red').pack(side='left')   # 左
tk.Label(window, text='P', fg='red').pack(side='right')  # 右

# 第5步,主窗口循环显示
window.mainloop()
place
import tkinter as tk

window = tk.Tk()

window.title("place")
window.geometry("500x300")

tk.Label(window, text="P", font=("Arial", 20)).place(x=25, y=100, anchor="nw")

window.mainloop()

再接下来我们来看place(), 这个比较容易理解,就是给精确的坐标来定位,如此处给的(50, 100),就是将这个部件放在坐标为(x=50, y=100)的这个位置, 后面的参数 anchor=‘nw’,就是前面所讲的锚定点是西北角。

自定义关闭窗口按钮

window.protocol("WM_BELETE_WINDOW", quit_func)

import tkinter as tk

def quit_new():
	global new_w
	windows.remove(new_w)
	new_w.destroy()
	new_w = None
	
def quit_all():
	for w in windows:
		w.destroy()
	

def new_window():
	global new_w
	if not new_w:
		new_w = tk.Tk()
		windows.insert(0, new_w)
		
		new_w.title("new window")
		new_w.geometry("400x300")
		tk.Label(new_w, text="This is new window", bg="red").pack
		new_w.protocol("WM_DELETE_WINDOW", quit_new)
		new_w.mainloop()

windows=[]
window = tk.Tk()
new_w = None
windows.append(window)

window.title("window")
window.geometry("500x300")

tk.Button(window, text="new window", command=new_window)

window.protocol("WM_DELETE_WINDOW", quit_all)
window.mainloop()

主窗口关闭,子窗口随之关闭

Text用作信息显示框
import tkinter as tk
window = tk.Tk()
window.title("window")
window.geometry("500x300")

def show():
	global count
	count += 1
	t.config(state="normal")  # 设置text可编辑
	t.insert("end", f"{count} This is info\n")
	t.config(state="disabled") # 设置text不可编辑
	t.see("end")  # 使text显示末尾
	
count=0
btn = tk.Button(window, text="show info", command=show)
btn.pack()

t = tk.Text(window, height=7)
t.pack(side="bottom")


window.mainloop()
新建子窗口使用Toplevel

Toplevel 组件用来显示额外的窗口

新创建的窗口不需要使用mainloop


from tkinter import *
from time import strftime



def show(to_text, *args, ):
	to_text.config(state="normal")
	to_text.insert("end", f"{strftime('[%m-%d %H:%M:%S]')} {' '.join(map(lambda s:str(s),args))}\n")
	to_text.config(state="disabled")
	to_text.see("end")
	
def insert():
	show(T, "insert", var.get())
	var.set("")

def create():
	global var,T


	top = Toplevel()
	top.title('window2')
	top.geometry("400x300")
	top.resizable(width=False, height=False)

	T = Text(top, height=7)
	T.config(state="disabled")
	T.place(x=0, y=0)
	Entry(top, textvariable=var, width=30).place(x=45,y=100)
	Button(top, text="do", width=5, command=insert).place(x=290,y=100)

if __name__=="__main__":
	window = Tk()
	window.title("window")
	var = StringVar()
	T = None
	Button(window, text='创建顶级窗口', command=create).pack()
	window.mainloop()

如果将top = Toplevel 更换为 top = Tk() 后面创建的组件将无法使用 StringVar 获取和设置 Entry

Tkinter是Python标准库中的一个模块,用于创建图形用户界面(GUI)应用程序。它是Python语言中最常用的GUI工具包之一,基于Tk/Tkinter GUI toolkit,由Tcl/Tk语言发展而来。Tkinter提供了一套简单易用的API,使得开发者能够快速地构建基本的窗口、按钮、文本框、列表框等控件。 使用Tkinter的基本步骤包括: 1. 导入模块:首先需要导入`tkinter`模块,通常写作`import tkinter`或`import tkinter as tk`。 ```python import tkinter as tk ``` 2. 创建窗口:调用`Tk()`函数创建主窗口,通常命名为`root`。 ```python root = tk.Tk() ``` 3. 设计窗口布局:可以使用`pack()`、`grid()`或`place()`方法来组织控件的位置和大小。 ```python button = tk.Button(root, text="Click me!") button.pack() # 使用pack布局 ``` 4. 处理事件:为控件添加回调函数,如点击按钮后执行某个操作。 ```python button.config(command=lambda: print("Button clicked!")) ``` 5. 运行窗口:调用`mainloop()`方法启动事件循环,使窗口保持打开状态,直到关闭。 ```python root.mainloop() ``` 6. 关闭窗口:通常在退出程序时调用`root.destroy()`来关闭窗口。 示例代码: ```python import tkinter as tk def on_click(): label.config(text="You clicked the button!") root = tk.Tk() label = tk.Label(root, text="Hello, Tkinter!") button = tk.Button(root, text="Click me!", command=on_click) label.pack() button.pack() root.mainloop() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值