项目的第一步就是编写需要的界面,我们使用 Python 标准的 GUI 库 Tkinter 来实现。这一节就快速学习该库中将会用到的控件,为搭建图形界面做准备。
- 主窗口
- 主菜单
- 文本控件
- 其他控件
1. 主窗口
tk.Tk
是 Tkinter
中的主窗口类,它是创建图形用户界面(GUI)应用程序的起点。Tk
表示 “ToolKit”,是一个跨平台的图形用户界面工具包,用于创建窗口、按钮、文本框、标签等 GUI 元素,并为它们添加事件处理、布局管理等功能。
import tkinter as tk # 主窗口 def test(): # 实例化窗口对象 window = tk.Tk() # 参数为 str 类型,格式为: '宽x高+X坐标+Y坐标' window.geometry('500x300+200+200') # 设置窗口标题 window.title('主窗口') # 设置固定大小,width=None, height=None window.resizable(False, False) # 窗口主循环 window.mainloop() if __name__ == '__main__': test()
2. 菜单控件
tk.Menu
是 Tkinter 中用于创建菜单的类,它允许你在图形用户界面(GUI)应用程序中添加菜单栏和菜单项,以提供用户导航和选择功能。菜单可以包含各种命令、选项和子菜单,用于组织和执行不同的操作。菜单控件要了解的内容包括:
- 普通菜单
- 多级菜单
- 单选菜单
- 多选菜单
- 分割线
import tkinter as tk # 主窗口 def test(): window = tk.Tk() window.geometry('500x300+200+200') # 初始化主菜单控件 main_menu = tk.Menu() # 1. 添加普通菜单 main_menu.add_command(label='文件', command=lambda : print('文件菜单点击')) main_menu.add_command(label='编辑', command=lambda : print('编辑菜单点击')) # 2. 添加多级菜单 cascade_menu = tk.Menu(tearoff=False) # tearoff 从主窗口剥离 cascade_menu.add_command(label='子菜单1', command=lambda : print('子菜单1')) cascade_menu.add_command(label='子菜单2', command=lambda : print('子菜单2')) cascade_menu.add_command(label='子菜单3', command=lambda : print('子菜单3')) main_menu.add_cascade(label='多级菜单', menu=cascade_menu) # 3. 添加单选菜单 radio_menu = tk.Menu(tearoff=False) radio_value = tk.StringVar() def on_radio_button_click(): print('选中的值:', radio_value.get()) radio_menu.add_radiobutton(label='中国', variable=radio_value, value='中国', command=on_radio_button_click) radio_menu.add_radiobutton(label='美国', variable=radio_value, value='美国', command=on_radio_button_click) radio_menu.add_radiobutton(label='德国', variable=radio_value, value='德国', command=on_radio_button_click) main_menu.add_cascade(label='单选菜单', menu=radio_menu) # 4. 添加多选菜单 checkbox_menu = tk.Menu(tearoff=False) state1 = tk.BooleanVar(value=False) state2 = tk.BooleanVar(value=False) state3 = tk.BooleanVar(value=False) def on_checkbox_button_click(): if state1.get(): print('足球选中') if state2.get(): print('篮球选中') if state3.get(): print('冰球选中') print('-' * 10) checkbox_menu.add_checkbutton(label='足球', variable=state1, command=on_checkbox_button_click) checkbox_menu.add_checkbutton(label='篮球', variable=state2, command=on_checkbox_button_click) checkbox_menu.add_checkbutton(label='冰球', variable=state3, command=on_checkbox_button_click) main_menu.add_cascade(label='多选菜单', menu=checkbox_menu) # 5. 添加分割线 seperator = tk.Menu(tearoff=False) seperator.add_command(label='子菜单1') seperator.add_command(label='子菜单2') seperator.add_separator() seperator.add_command(label='子菜单3') main_menu.add_cascade(label='菜单分割线', menu=seperator) # 将菜单设置到主窗口上 window.config(menu=main_menu) window.mainloop() if __name__ == '__main__': test()
3. 文本控件
文本控件需要了解的内容如下:
- 无滚动条 Text 控件
- 带滚动条 ScrolledText 控件
- 用于组合分割效果的 PanedWindow 控件
import tkinter as tk from tkinter.scrolledtext import ScrolledText # 1. Text def test01(): window = tk.Tk() window.geometry('500x300+200+200') text_area = tk.Text() # 1. 跟随父控件伸缩 TOP、BOTTOM、LEFT、RIGHT # text_area.pack(side=tk.RIGHT) # 2. 跟随父控件伸缩 X、Y、BOTH text_area.pack(fill=tk.BOTH, expand=True) # 3. 设置其他属性 # wrap: 是否自动换行 NONE、WORD # bg: 背景颜色,例如:red # fg: 前景颜色,例如: white # font: 字体样式 (字体, 大小, 样式) 样式: normal bold italic underline overstrike # state: 控件的状态 NORMAL、DISABLED text_area.config(bg='red', fg='white', font=('楷体', 20, 'underline')) # 4. 添加内容 # 4.1 尾部添加内容 text_area.insert(tk.END, '我是中国人\n') text_area.insert(tk.END, '我是中国人\n') text_area.insert(tk.END, '我是中国人\n') # 4.2 指定位置添加内容 # 在光标位置插入,# '2.0' 表示第 2 行的第 0 个字符位置 text_area.mark_set('insert', '2.0') text_area.insert(tk.INSERT, '《接着插入》') text_area.insert('2.0', '新的一行内容\n') # 4.3 预定义字体颜色 text_area.tag_configure("font1", font=("宋体", 10, 'overstrike'), foreground="yellow") text_area.tag_configure("font2", font=("楷体", 12, 'underline'), foreground="black") text_area.insert(tk.END, '根据字体插入文本\n', 'font1') text_area.insert(tk.END, '根据字体插入文本\n', 'font2') # 5. 获得文本框内容 # 参数为开始位置 结束位置 my_text = text_area.get('1.0', tk.END) print('文本框内容:\n', my_text) window.mainloop() # 2. ScrolledText def test02(): window = tk.Tk() window.geometry('500x300+200+200') text_area = ScrolledText() text_area.pack(fill=tk.BOTH, expand=True) window.mainloop() # 3. PanedWindow def test03(): window = tk.Tk() window.geometry('500x300+200+200') # window.resizable(False, False) # orient: VERTICAL、HORIZONTAL paned = tk.PanedWindow(orient=tk.HORIZONTAL) paned.pack(fill=tk.BOTH, expand=True) text1 = tk.Text() text2 = ScrolledText() # 添加 text1 控件,并设置 text1 控件宽度 paned.add(text1, width=250) paned.add(text2) window.mainloop() if __name__ == '__main__': test03()
4. 其他控件
TKinter 中还提供了很多其他的控件,例如:标签控件、按钮控件等等
import tkinter as tk # 1. 标签控件 def test01(): window = tk.Tk() window.geometry('500x300+200+200') # 创建标签对象 label = tk.Label(master=window, text='准备就绪', bg='#bdc3c7') label.pack(side=tk.BOTTOM) # 修改标签文字 label['text'] = 'Hello World' window.mainloop() # 2. 按钮控件 def test02(): window = tk.Tk() window.geometry('500x300+200+200') # 创建按钮对象 button = tk.Button(text='按钮', command=lambda : print('按钮点击了')) button.pack(side=tk.BOTTOM) window.mainloop() # 3. 容器控件 def test03(): window = tk.Tk() window.geometry('500x300+200+200') # 创建一个容器控件 frame = tk.Frame(window, width=300, height=200) frame.configure(borderwidth=0, bg='#bdc3c7') # 在 Frame 中创建两个子控件 button1 = tk.Button(frame, text='按钮1', command=lambda : print('按钮点击了')) button1.place(x=10, y=10) button2 = tk.Button(frame, text='按钮2', command=lambda: print('按钮点击了')) button2.place(x=100, y=100) frame.pack(side=tk.BOTTOM) window.mainloop() if __name__ == '__main__': test03()