Python | GUI模块入门

如果对tk模块已经有了一定的了解了,可以浏览我用tk模块写的一个小项目

GUI小项目_数据库批量处理器

tk是Python自带的GUI模块,相对于 Pyqt5 等其他界面模块,简单快捷,如对界面美观无需求,直接使用 tk 模块即可

tk:母不嫌子丑系列

  • 主界面
import tkinter as tk

root = tk.Tk()
# 设置窗口标题
root.title('Python GUI')
# 设置主界面大小
root.geometry('400x300')
# 禁止调节框体大小
root.resizable(0 ,0)
root.mainloop()

下面介绍基本的widgets,部分实例源自 《Python GUI Programming》

1-7、Label, Entry, Button, Combobox, Checkbutton, Radiobutton, ScrolledText
效果图

Python | GUI模块入门_第1张图片
widgets实例.PNG

from tkinter import scrolledtext
from tkinter import ttk
import tkinter as tk

root = tk.Tk()
root.title('Python GUI')
root.resizable(0, 0)

# Label 实例
alabel = tk.Label(root, text='Enter a name:')
alabel.grid(row=0, column=0)

# 调用的方法要写在button前,即recall要写widget前
def clickMe():
    abutton.configure(text='Hello, ' + name.get() + '_' + number.get())

# Button 实例
abutton = tk.Button(root, text='Click Me!', command=clickMe)
abutton.grid(row=1, column=2)

# Entry 实例
name = tk.StringVar()
name_entered = tk.Entry(root, textvariable=name)
name_entered.grid(row=1, column=0)
# focus使运行时,焦点在name_entered输入框
name_entered.focus()

blabel = tk.Label(root, text='Enter a number')
blabel.grid(row=0, column=1)

# Combobox 组合框实例
number = tk.StringVar()
# readonly使此框中的数值不能被修改, ttk是tk模块下另一个包,增加了一些额外的功能,有兴趣可以去看标准库
numberchosen = ttk.Combobox(root, textvariable=number, state='readonly')
numberchosen['values'] = (1, 2, 3, 4)
# current使运行时numberchosen框出现的值是第一个值
numberchosen.current(0)
numberchosen.grid(row=1, column=1)

# Checkbutton 实例
chVarDis = tk.IntVar()
check1 = tk.Checkbutton(root, text='Disabled', variable=chVarDis, state='disabled')   # disabled 使运行时不可被操作
check1.select()    # select 表示被选择
check1.grid(row=2, column=0, sticky=tk.W)

chVarUn = tk.IntVar()
check2 = tk.Checkbutton(root, text='UnChecked', variable=chVarUn)
check2.deselect()  # deselect 表示未被选择
check2.grid(row=2, column=1, sticky=tk.W)

chVarEn = tk.IntVar()
check3 = tk.Checkbutton(root, text='Enabled', variable=chVarEn)
check3.select()
check3.grid(row=2, column=2, sticky=tk.W)

# Radiobutton 单选框实例
color_1 = 'Blue'
color_2 = 'Gold'
color_3 = 'Red'

def radCall():
    radSel = radVar.get()
    if radSel == 1: root.configure(background=color_1)
    if radSel == 2: root.configure(background=color_2)
    if radSel == 3: root.configure(background=color_3)
    
radVar = tk.IntVar()
rad1 = tk.Radiobutton(root, text=color_1, variable=radVar, value=1, command=radCall)
rad1.grid(row=3, column=0, sticky=tk.W)

rad2 = tk.Radiobutton(root, text=color_2, variable=radVar, value=2, command=radCall)
rad2.grid(row=3, column=1, sticky=tk.W)

rad3 = tk.Radiobutton(root, text=color_3, variable=radVar, value=3, command=radCall)
rad3.grid(row=3, column=2, sticky=tk.W)

# ScrolledText 实例

scrolW = 40
scrolH = 4

# scrolledtext 也是tk模块的一个包,集合了text和scollbar两个功能,使用更方便
# tk.WORD 在换行时,保留一个完整的单词,默认值是 tk.CHAR
scr = scrolledtext.ScrolledText(root, width=scrolW, height=scrolH, wrap=tk.WORD)
# columnspan=3 类似与excel中把3个相邻的空格合并
scr.grid(column=0, columnspan=3)

root.mainloop()

8、LabelFrame
(LabelFrame一般可有可无,如果说root是一块画布,LF就是画布中的分块画布,在界面比较复杂的时候可以使用,进行分块分布)
效果图

LabelFrame.PNG

import tkinter as tk

root = tk.Tk()
root.title('Python GUI')

labelsFrame = tk.LabelFrame(root, text='Labels in a Frame')
labelsFrame.grid()

tk.Label(labelsFrame, text='Label_1', background='red').grid(row=0, column=0)
tk.Label(labelsFrame, text='Label_2', background='blue').grid(row=0, column=1)
tk.Label(labelsFrame, text='Label_3', background='green').grid(row=0, column=2)

root.mainloop()

9、Menubutton
效果图

Python | GUI模块入门_第2张图片
Menu.png

import tkinter as tk

root = tk.Tk()
root.title('Python GUI')

# 生成一个Menu“画布”在root上
menuBar = tk.Menu(root)

# 把root的menu属性与menuBar“绑定”在一起
root.configure(menu=menuBar)

# 生成小的menu item在menuBar上
fileMenu = tk.Menu(menuBar)

def _quit():
    root.destroy()

# 添加次级元素,label类似于其他widgets的text属性,给属性命名
fileMenu.add_command(label='New')
fileMenu.add_command(label='Exit', command=_quit) # 点击Exit退出

# cascade级联,把menuBar的menu属性与fileMenu绑定
menuBar.add_cascade(label='File', menu=fileMenu) 

# 上图的New上面是不是有一条短横线?设置tearoff=0,即可去除
helpMenu = tk.Menu(menuBar, tearoff=0)
helpMenu.add_command(label='About')
menuBar.add_cascade(label='Help', menu=helpMenu)

root.mainloop()

Menu有点绕,加一个图提升理解,可以配合上述的注释理解


Python | GUI模块入门_第3张图片
Menu个人理解.png

10、Notebook
效果图

Python | GUI模块入门_第4张图片
Notebook.PNG

import tkinter as tk
from tkinter import ttk

root= tk.Tk()
root.title('Python GUI')
root.geometry('400x300')

# Notebook 实例
tabControl = ttk.Notebook(root)

# 分页实例
tab1 = ttk.Frame(tabControl)
tabControl.add(tab1, text='Tab 1')

# 在第一个分页添加 Label
monty = ttk.LabelFrame(tab1, text=' Monty Python ')
monty.grid(row=0, column=0, padx=8, pady=4)
ttk.Label(monty, text='Enter a Name:').grid(row=0, column=0, sticky='W')


# 把Notebook的窗体边界线填充GUI页面
# expand=1 fill属性启用
# expand=0 fill属性无法使用
# fill=x 当GUI窗体大小发生变化时,widget在X方向跟随GUI窗体变化
# fill=y 当GUI窗体大小发生变化时,widget在Y方向跟随GUI窗体变化
# fill=both 当GUI窗体大小发生变化时,widget在X、Y两方向跟随GUI窗体变化
tabControl.pack(expand=1,fill='both')

# 创建第二个分页
tab2 = ttk.Frame(tabControl)
tabControl.add(tab2, text='Tab 2')

root.mainloop()

11、 Frame
效果图

Python | GUI模块入门_第5张图片
Frame.PNG

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry('400x300')

colors = ['red', 'blue', 'white', 'black', 'green']
# Frame 一般作为简单的容器分布
for color in colors:
    tk.Frame(width=400, height=60, bg=color).pack()
# 关于pack()
# pack是按添加顺序排列组件
# grid是按行列形式排列组件
# place则允许程序员指定组件的大小和位置
# 更多了解:https://blog.csdn.net/sinat_41104353/article/details/79321194
root.mainloop()

12、PanedWindow
效果图:

PanedWindow.PNG

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

p1 = tk.PanedWindow()
p1.pack(expand=1, fill='both')

left = tk.Label(p1, text='Left Pane')
p1.add(left)

p2 = tk.PanedWindow(p1, orient='vertical')
p1.add(p2)

top = tk.Label(text='Top Pane')
p2.add(top)

bottom = tk.Label(text='Bottom Pane')
p2.add(bottom)

root.mainloop()

13、Scale
效果图:

Python | GUI模块入门_第6张图片
Scale.PNG

import tkinter as tk

win = tk.Tk()
win.geometry('300x200')

def resize(ev=None):
    label.configure(font='Helvetica -%d bold' % scale.get())

label = tk.Label(win, text='Hi', font='Helvetica -10 bold')
label.pack(expand=1, fill='y')

scale = tk.Scale(win, from_=10, to=40, orient='horizontal', command=resize)
scale.set(10)
scale.pack(expand=1, fill='x')

win.mainloop()

想要了解更多框体,请浏览标准库,那里有你知道的一切o(∩_∩)o

你可能感兴趣的:(Python | GUI模块入门)