消息框:tkinter.messagebox

一、tkinter 简介

Tkinter 是 Python 标准库中的一个模块,用于创建图形用户界面 (GUI)。 它是最早的也是最常用的 GUI 工具包之一,因其易用性和直接与 Python 绑定而广受欢迎。

  • 基于Tcl/Tk(Tk 是 Tcl 语言开发的跨平台 GUI 工具包)。Tkinter 提供了与 Tk 的接口,使得 Python 程序员能够创建 GUI 应用程序。
  • 跨平台支持:支持在Windows、macOS和Linux上运行,且发行版一致。
  • Tkinter 是 Python 标准库的一部分,无需额外安装。

二、tkinter 基础(部件 + 布局管理器)

  • 根窗口(Root Window):是所有Tkinter应用程序的主窗口,通常由Tk()类实例化。它是其他所有窗口部件的父窗口。
  • 部件(Widgets):是指应用程序中的各种界面元素,是用户与应用程序交互的主要方式。
    • 标签(Label):用于显示文本或图像的静态控件。标签常用于显示提示信息或标题。
    • 按钮(Button):用户可以点击按钮来触发某些动作。可以为按钮设置文本或图像,并指定点击时调用的回调函数。
    • 文本框(Entry):单行文本输入控件,用户可以在其中输入和编辑文本。
    • 文本控件(Text):多行文本输入控件,允许用户输入和编辑多行文本。它支持丰富的文本样式和颜色。
    • 列表框(Listbox):显示列表项的控件,用户可以从中选择一个或多个项目。
    • 复选框(Checkbutton):允许用户选择或取消选择的按钮。常用于表示布尔选项。
    • 单选按钮(Radiobutton):一组选项中只能选择一个的按钮。常用于从多个互斥的选项中选择一个。
    • 框架(Frame):用于组织其他部件的容器。框架可以嵌套,用于创建复杂的布局。
    • 画布(Canvas):强大的绘图区域,用于绘制图形、图像和其他复杂的自定义界面元素。
  • 布局管理器(Geometry Managers):负责组织和排列部件在窗口中的位置。Tkinter提供了几种布局管理器,每种管理器有不同的布局方式。
    • 顺序-布局管理器 pack按照添加顺序将部件放置在窗口中。可以通过side参数指定部件排列的方向(如top、bottom、left、right)。
    • 网格-布局管理器 grid使用行和列来精确定位部件。可以通过row和column参数指定部件的位置。
    • 坐标-布局管理器 place使用x和y坐标来精确定位部件
  • 主循环 root.mainloop():(1)启动Tkinter的主事件循环,使应用程序保持运行并处理所有用户交互(如:鼠标点击、键盘输入等)和窗口更新。(2)没有它,窗口不会响应用户输入或显示任何内容。(3)当用户关闭窗口时,自动结束事件处理循环并关闭程序,而不需要显示调用 root.destroy()。
  • 手动摧毁窗口 root.destroy():用于完全销毁 tkinter 主窗口。它不仅关闭窗口并终止应用程序的运行,包括停止所有与窗口相关的事件处理循环,并清理相关的资源(如:内存或文件句柄)。

三、项目实战

3.1、主循环:root.mainloop()

在这里插入图片描述
点击(右)确定,(右)界面摧毁,(左)界面不会摧毁

import tkinter as tk
from tkinter import messagebox

def close_application():
    messagebox.showinfo("Info", "Closing the application...")

if __name__ == '__main__':
    root = tk.Tk()  # 创建主窗口
    root.title("Simple Tkinter App")  # 设置主窗口标题
    tk.Button(root, text="Click Me", command=close_application).pack(pady=20)  # 添加一个按钮
    root.mainloop()  # 启动主循环

3.2、手动摧毁窗口:root.destroy()

在这里插入图片描述
点击(右)确定,(右)界面摧毁,(左)界面同时摧毁

import tkinter as tk
from tkinter import messagebox

def close_application():
    messagebox.showinfo("Info", "Closing the application...")
    root.destroy()  # 手动关闭窗口并退出程序

if __name__ == '__main__':
	root = tk.Tk()  # 创建主窗口
	root.title("Simple Tkinter App")  # 设置主窗口标题
	tk.Button(root, text="Close", command=close_application).pack(pady=20)  # 添加一个关闭按钮
	root.mainloop()  # 启动主循环

3.3、布局管理器:pack

在这里插入图片描述

import tkinter as tk
from tkinter import messagebox

def submit():
    name = name_entry.get()
    gender = gender_var.get()
    subscribed = subscribe_var.get()

    gender_text = "Male" if gender == 1 else "Female"
    subscribed_text = "Yes" if subscribed == 1 else "No"

    messagebox.showinfo("Information", f"Name: {name}\nGender: {gender_text}\nSubscribed: {subscribed_text}")

if __name__ == '__main__':
	root = tk.Tk()  # 创建主窗口
	root.title("Simple Form with pack()")  # 设置主窗口标题
	
    # 创建部件并使用 pack 布局管理器
	tk.Label(root, text="Name:").pack(anchor='w', padx=10, pady=5)
	name_entry = tk.Entry(root)
	name_entry.pack(padx=10, pady=5)
	
	tk.Label(root, text="Gender:").pack(anchor='w', padx=10, pady=5)
	gender_var = tk.IntVar()
	tk.Radiobutton(root, text="Male", variable=gender_var, value=1).pack(anchor='w', padx=10, pady=2)
	tk.Radiobutton(root, text="Female", variable=gender_var, value=2).pack(anchor='w', padx=10, pady=2)
	
	subscribe_var = tk.IntVar()
	tk.Checkbutton(root, text="Subscribe to newsletter", variable=subscribe_var).pack(anchor='w', padx=10, pady=5)
	
	submit_button = tk.Button(root, text="Submit", command=submit)
	submit_button.pack(pady=10)
	
	root.mainloop()  # 进入主循环

3.4、布局管理器:grid

在这里插入图片描述

import tkinter as tk
from tkinter import messagebox


def submit():
    name = name_entry.get()
    gender = gender_var.get()
    subscribed = subscribe_var.get()

    gender_text = "Male" if gender == 1 else "Female"
    subscribed_text = "Yes" if subscribed == 1 else "No"

    messagebox.showinfo("Information", f"Name: {name}\nGender: {gender_text}\nSubscribed: {subscribed_text}")

if __name__ == '__main__':
    root = tk.Tk()  # 创建主窗口
    root.title("Simple Form")  # 设置主窗口标题
    
    # 创建部件并使用 grid 布局管理器
    tk.Label(root, text="Name:").grid(row=0, column=0, padx=10, pady=5, sticky=tk.W)
    name_entry = tk.Entry(root)
    name_entry.grid(row=0, column=1, padx=10, pady=5)
    
    tk.Label(root, text="Gender:").grid(row=1, column=0, padx=10, pady=5, sticky=tk.W)
    gender_var = tk.IntVar()
    tk.Radiobutton(root, text="Male", variable=gender_var, value=1).grid(row=1, column=1, padx=10, pady=5, sticky=tk.W)
    tk.Radiobutton(root, text="Female", variable=gender_var, value=2).grid(row=1, column=2, padx=10, pady=5, sticky=tk.W)
    
    subscribe_var = tk.IntVar()
    tk.Checkbutton(root, text="Subscribe to newsletter", variable=subscribe_var).grid(row=2, columnspan=3, padx=10, pady=5)
    
    submit_button = tk.Button(root, text="Submit", command=submit)
    submit_button.grid(row=3, columnspan=3, pady=10)

    root.mainloop()  # 进入主循环

3.5、布局管理器:place

在这里插入图片描述

import tkinter as tk
from tkinter import messagebox

def submit():
    name = name_entry.get()
    gender = gender_var.get()
    subscribed = subscribe_var.get()

    gender_text = "Male" if gender == 1 else "Female"
    subscribed_text = "Yes" if subscribed == 1 else "No"

    messagebox.showinfo("Information", f"Name: {name}\nGender: {gender_text}\nSubscribed: {subscribed_text}")

if __name__ == '__main__':
    root = tk.Tk()  # 创建主窗口
    root.title("Simple Form with place()")  # 设置主窗口标题

    # 创建部件并使用 place 布局管理器
    tk.Label(root, text="Name:").place(x=20, y=20, anchor=tk.W)
    name_entry = tk.Entry(root)
    name_entry.place(x=80, y=20, width=200)

    tk.Label(root, text="Gender:").place(x=20, y=60, anchor=tk.W)
    gender_var = tk.IntVar()
    tk.Radiobutton(root, text="Male", variable=gender_var, value=1).place(x=80, y=60, anchor=tk.W)
    tk.Radiobutton(root, text="Female", variable=gender_var, value=2).place(x=140, y=60, anchor=tk.W)

    subscribe_var = tk.IntVar()
    tk.Checkbutton(root, text="Subscribe to newsletter", variable=subscribe_var).place(x=20, y=100, anchor=tk.W)

    submit_button = tk.Button(root, text="Submit", command=submit)
    submit_button.place(x=20, y=140)

    root.geometry("300x200")  # 设置窗口大小
    root.mainloop()  # 进入主循环

四、消息框:tkinter.messagebox

官网:tkinter.messagebox— Tkinter 消息提示
源码: Lib/tkinter/messagebox.py
tkinter.messagebox模块:提供了多种弹出消息框的函数,用于在GUI应用程序中显示信息、警告、错误、提示用户进行确认等。消息框是模态的,将根据用户的选择返回 (True、False、OK、None、Yes、No) 的子集。

在这里插入图片描述

import tkinter as tk
from tkinter import messagebox


def show_message_boxes():
    root = tk.Tk()  # 创建主窗口
    root.withdraw()  # 隐藏主窗口
    root.lift()  # 提升窗口在最前面
    root.attributes('-topmost', True)  # 将窗口保持在最前面
    # root.after(0, lambda: root.attributes('-topmost', False))  # 保证消息框显示后可以被其他窗口覆盖

    messagebox.showinfo("信息", "这是一个信息消息框。")
    messagebox.showwarning("警告", "这是一个警告消息框。")
    messagebox.showerror("错误", "这是一个错误消息框。")

    result = messagebox.askquestion("问题", "这是一个问题消息框。")
    print(f"问题消息框:{result}")

    result = messagebox.askretrycancel("重试或取消", "这是一个重试/取消消息框。")
    print(f"重试/取消消息框:{result}")

    result = messagebox.askokcancel("确认", "这是一个确认消息框。")
    print(f"确认消息框:{result}")

    result = messagebox.askyesno("问题", "这是一个是/否消息框。")
    print(f"是否消息框:{result}")

    result = messagebox.askyesnocancel("问题", "这是一个是/否/取消消息框。")
    print(f"是/否/取消消息框:{result}")
    root.destroy()  # 用于销毁主窗口,从而退出程序。


if __name__ == '__main__':
    show_message_boxes()

五、滚动文本:tkinter.scrolledtext

官网:tkinter.scrolledtext— 滚动文本小部件
源码: Lib/tkinter/scrolledtext.py

tkinter.scrolledtext.ScrolledText:是 tkinter 库中的一个文本小部件,它带有一个内置的滚动条,使得可以方便地处理大量文本。这个组件可以用来创建带有垂直滚动条的文本输入或显示区域。

在这里插入图片描述

import tkinter as tk
from tkinter import scrolledtext

def main():
    root = tk.Tk()  # 创建主窗口
    root.title("ScrolledText 示例")  # 设置窗口标题
    root.geometry("400x300")  # 设置窗口大小

    # 创建ScrolledText小部件
    st = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=40, height=10, font=("Times New Roman", 12))
    st.pack(padx=10, pady=10)  # 将小部件放置在主窗口中,并设置外边距

    # 在ScrolledText中插入初始文本
    st.insert(tk.INSERT, "这是一个带滚动条的文本输入框。你可以在这里输入大量的文本内容,而不会超出显示区域。\n\n" \
                         "如果文本超出显示区域,会自动出现滚动条。")

    # 启动主事件循环
    root.mainloop()

if __name__ == "__main__":
    main()

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖墩会武术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值