Python GUI 整理

GUI

GUI的概念

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。

图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象,应用的是计算机图形学的技术。

GUI:

  • GUI概念
  • GUI程序的组成:界面,菜单,按钮,输入框,显示框等
  • GUI程序用户交互

图形界面应用程序 GUI

  • 是一种 基于消息驱动模型 的可执行程序
  • 程序的执行 依赖于用户的交互过程
  • 程序执行过程中 实时响应用户操作
  • 一般情况下程序执行后 不会主动退出

图形界面应用程序的运行模式

在这里插入图片描述

图形界面应用程序的消息处理模型

在这里插入图片描述

图形界面应用使用场合

  • 多任务
  • 强用户交互
  • 非专业计算机用户

命令行应用程序和图形界面应用程序比较

在这里插入图片描述

tkinter的基本概念

tkinter是python中自带的用于GUI编程的模块,tkinter是对图形库TK的封装,tkinter是跨平台的,既在linux下编写的程序可以不加修改地在windows下运行,它的优势在于可移植性。

使用tkinter可以创建完整的GUI程序,在tkinter中可以直接使用文本框、按钮、标签等组件进行GUI编程,换句话说,要实现某个界面元素,只要调用对应的组件即可。tkinter是python中的一个模块,可以像其他模块在python的交互式shell中被导入tkinter模块被导入即可使用tkinter中的模块方法等。

tkinter 编程常用组件

GUI的样式

在这里插入图片描述

常用的组件

  1. Button:按钮。点击时执行一个动作
  2. Canvas:画布。绘制图表或图形(直线、 椭圆、多边形、矩形)
  3. Checkbutton:允许用户选择或反选一个选项,一组方框
  4. Entry:单行输入框。用来收集键盘输入的单行文本
  5. Frame:框架。用来承载放置其他GUI组件,一个容器
  6. Label:标签。用来显示不可编辑的文本或图标
  7. LabelFrame:容器组件。常用于复杂的窗口布局。
  8. Listbox:列表框。选择列表,用户可从中选择
  9. Menu:菜单条。用来实现下拉和弹出式菜单
  10. Menubutton:菜单按钮。用来挂载菜单的组件
  11. Message:消息框。类似Label但可 显示多行文本
  12. OptionMenu:选择菜单。下拉菜单的一 个改进版本
  13. PanedWindow:窗口布局管理。可以包含一个或多个组件
  14. Radiobutton:单选框。从多个选项中选取一个
  15. Scale:滑块组件。允许你通过滑块来设置一个数字值
  16. Scrollbar:滚动条。对其支持的组件提供滚动功能
  17. Spinbox:输入框。类似Entry,但可指定输入范围值
  18. Text:多行文本框。用来收集键盘输入的多行文本
  19. Toplevel:容器窗口,作为一个单独的、最上面的窗口显示

tkinter 界面布局

  • place绝对布局,根据坐标设置组件位置
  • pack相对布局,根据相对参数设置组件位置 (用的最多)
  • grid表格布局,根据行和列设置组件位置

pack相对布局

  • side:停靠方式,取值上、下、左、右
  • fll:填充方式,X为填充水平方向,Y为垂直方向,BOTH为X+Y
  • anchor:对齐方式,取值东、西、南、北、中间

Button按钮

按钮组件用于在Python应用程序中添加按钮,按钮上可以放.上文本或图像,按钮可用于监听用户行为,能够与一个Python函数关联,当按钮被按下时,自动调用该函数。

Canvas画布

画布(Canvas) 组件。用来绘图的。您可以将图形,文本小部件或框架放置在画布上

Checkbutton复选框

复选框用来选取我们需 要的选项,它前面有个小正方形的方块,如果选中则有一个对号,也可以再次点击以取消该对号来取消选中

Entry单行输入框

文本框用来让用户输入- -行文本字符串

Frame框架

在屏幕上显示一个矩形区域,多用来作为容器

Label标签

用来显示不可编辑的文本或图标。常和Entry输入框配合使用。

Listbox列表框

列表框组件。在Listbox窗 口小部件是用来显示一-个字符串列表给用户选择。

Menu菜单

菜单组件。显示菜单栏,用于下拉菜单和弹出菜单。

Menubutton菜单按钮

菜单按钮控件,用于显示菜单项。

Message消息组件

消息组件。用来显示多行文本,与labe比较类似。

Radiobutton单选按钮

单选按钮组件。显示一-组 单选的按钮,每次只有一-个被选中。

Scale组件

范围组件。显示一-个数值刻度, 通过滑动选择一个数字。

Scrollbar组件

滚动条组件。当内容超过可视化区域时使用,如列表框。

Text组件

文本组件。用于显示多行文本。

Toplevel组件

顶层窗口组件。用于创建独立与主窗口的顶层窗口组件。

PanedWindow组件

窗口布局管理组件,可以包含- -个或者多个子组件。用户可以用鼠标移动分割线来改变布局大小。

LabelFrame组件

带标题的Frame组件。LabelFrame 会在其子组件的周围绘制一个边框以及- -个标题。

MessageBox组件

弹出消息框组件。提示、警告、出错信息或询问弹框。

编程实例1

import tkinter as tk


class MainWindow:
    def __init__(self):
        # 创建主窗口
        self.windows = tk.Tk()
        self.windows.minsize(300, 300)  # 窗口最小值
        self.windows.title("示例")

        # 添加组件
        self.add_components()

        # 进入消息循环
        self.windows.mainloop()

    def add_components(self):
        my_frame = tk.Frame(self.windows)
        my_frame.pack(side=tk.TOP)

        # 创建按钮
        my_button = tk.Button(my_frame, text="点我", command=self.button_clicked)
        my_button.pack(side=tk.LEFT)

        # 创建canvas
        my_canvas = tk.Canvas(my_frame, bg="white")
        my_canvas.create_rectangle(50, 50, 150, 150, outline="red", fill="blue", width=5)
        my_canvas.pack(side=tk.RIGHT)

        # 创建复选框
        my_apple = tk.Checkbutton(my_frame, text="苹果")
        my_apple.pack(side=tk.TOP)

        # 创建单行文本
        name = tk.Label(my_frame, text="姓名")
        name.pack(side=tk.LEFT)
        name_value = tk.Entry(my_frame, bd=5)
        name_value.pack(side=tk.RIGHT)

    def button_clicked(self):
        print("按钮被点击了!")

if __name__ == '__main__':
    MainWindow()

最终效果!
在这里插入图片描述

编程实例2

import tkinter as tk


class MainWindow:
    def __init__(self):
        # 创建主窗口
        self.windows = tk.Tk()
        self.windows.minsize(300, 300)  # 窗口最小值
        self.windows.title("示例")

        # 初始化列表数据
        self.list_data = ['苹果', '梨子', '葡萄', '西瓜']

        # 添加组件
        self.add_components()

        # 进入消息循环
        self.windows.mainloop()

    def add_components(self):
        my_frame = tk.Frame(self.windows)
        my_frame.pack(side=tk.TOP)

        # 创建Label
        name = tk.Label(my_frame, text="请选择水果:")
        name.pack(side=tk.TOP)

        # 创建listbox
        self.my_listbox = tk.Listbox(my_frame)
        self.my_listbox.pack(side=tk.LEFT)
        for item in self.list_data:
            self.my_listbox.insert("end", item)

        my_button = tk.Button(my_frame, text="选择", command=self.button_clicked)
        my_button.pack(side=tk.RIGHT)

        # 创建菜单
        self.menubar = tk.Menu(self.windows, bg="lightgrey", fg="black")  # 主菜单
        self.file_new = tk.Menu(self.menubar, bg="lightgrey", fg="black")  # 子菜单

        self.menubar.add_cascade(label="文件", menu=self.file_new)
        self.file_new.add_command(label="新建", command=self.file_new_command, accelerator="Ctrl+N")
        self.windows.configure(menu=self.menubar)

        # 创建第二个Frame容器
        my_frame2 = tk.Frame(self.windows)
        my_frame2.pack(side=tk.BOTTOM)

        # 创建菜单按钮
        menubutton = tk.Menubutton(my_frame2, text="菜单按钮", relief=tk.RAISED)  # relief 按钮样式  tk.RAISED 突出显示
        menubutton.pack(side=tk.TOP)
        file_menu = tk.Menu(menubutton)
        file_menu.add_command(label="新建", command=self.file_new_command)
        menubutton.configure(menu=file_menu)

        # 创建Message消息
        my_message = tk.Message(my_frame2, text="这是一册可以自动换行很长很长的文本消息", width=150)
        my_message.pack()


    def button_clicked(self):
        index = self.my_listbox.curselection()  # 当前选项
        if index:
            print(self.list_data[index[0]])  # 选出水果名称
        else:
            print("未选择")

    def file_new_command(self):
        print("新建文件")


if __name__ == '__main__':
    MainWindow()

在这里插入图片描述

编程实例3

import tkinter as tk


class MainWindow:
    def __init__(self):
        # 创建主窗口
        self.windows = tk.Tk()
        self.windows.minsize(300, 300)  # 窗口最小值
        self.windows.title("示例")

        # 定义radiobutton相关的变量
        self.list_data = (
            ("苹果", 0), ("梨子", 1), ("葡萄", 2), ("西瓜", 3)
        )
        self.radio_selected = tk.IntVar()  # 用户选择哪个项

        # 定义scale相关变量
        self.scale_value = tk.IntVar()

        # 添加组件
        self.add_components()

        # 进入消息循环
        self.windows.mainloop()

    def add_components(self):
        my_frame = tk.Frame(self.windows)
        my_frame.pack(side=tk.TOP)

        # 创建按钮
        my_button = tk.Button(my_frame, text="点我", command=self.button_clicked)
        my_button.pack(side=tk.LEFT)

        # 创建radiobutton
        for label, value in self.list_data:
            tk.Radiobutton(my_frame, text=label, value=value, variable=self.radio_selected,
                           command=self.radio_clicked).pack()

        # 创建scale
        my_scale = tk.Scale(my_frame, from_=0, to=100, orient=tk.HORIZONTAL, variable=self.scale_value)
        my_scale.pack(side=tk.RIGHT)

        # scrollbar的用法
        my_frame2 = tk.Frame(self.windows)
        my_frame2.pack()
        my_scrollbar = tk.Scrollbar(my_frame2)
        my_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        my_listbox = tk.Listbox(my_frame2, yscrollcommand=my_scrollbar.set)
        # 往listbox里添加数据
        for i in range(0, 100):
            my_listbox.insert("end", i)
        my_listbox.pack()
        my_scrollbar.configure(command=my_listbox.yview)

        # 创建Text
        my_text = tk.Text(my_frame2, width=20, height=3)
        for i in range(100):
            my_text.insert(tk.END, "我是第{}个\n".format(i))
        my_text.pack()

    def radio_clicked(self):
        for item in self.list_data:
            if self.radio_selected.get() == item[1]:
                print("喜欢吃{}".format(item[0]))

    def button_clicked(self):
        print("按钮被点击了!")
        print('scale值:{}'.format(self.scale_value.get()))

        # 创建toplevel
        top = tk.Toplevel()
        top.title("新窗口")

        message = tk.Message(top, text="小叶柏杉")
        message.pack()


if __name__ == '__main__':
    MainWindow()

在这里插入图片描述

编程实例4

import tkinter as tk
import tkinter.messagebox as msg


class MainWindow:
    def __init__(self):
        # 创建主窗口
        self.windows = tk.Tk()
        self.windows.minsize(300, 300)  # 窗口最小值
        self.windows.title("示例")

        # 定义radiobutton相关的变量
        self.list_data = (
            ("苹果", 0), ("梨子", 1), ("葡萄", 2), ("西瓜", 3)
        )
        self.radio_selected = tk.IntVar()  # 用户选择哪个项

        # 添加组件
        self.add_components()

        # 进入消息循环
        self.windows.mainloop()

    def add_components(self):
        my_frame = tk.Frame(self.windows)
        my_frame.pack(side=tk.TOP)

        # 创建spinbox组建
        self.my_spinbox = tk.Spinbox(my_frame, from_=0, to=150)
        self.my_spinbox.pack()
        self.my_spinbox2 = tk.Spinbox(my_frame, values=('苹果', '梨子', '葡萄', '西瓜'))
        self.my_spinbox2.pack()

        # 创建panewindow
        my_panedwindow = tk.PanedWindow(orient=tk.VERTICAL)  # 垂直方向布局
        my_panedwindow.pack(fill=tk.BOTH)
        my_label = tk.Label(my_panedwindow, text="One Paned Windows")
        my_panedwindow.add(my_label)
        my_text = tk.Text(my_panedwindow, width=20, height=10)
        for i in range(0, 100):
            my_text.insert("end", "第{}个\n".format(i))
            my_text.pack()
        my_panedwindow.add(my_text)

        # 创建LabelFrame
        my_frame2 = tk.LabelFrame(self.windows, text="请选择您想吃的水果")
        my_frame2.pack(side=tk.BOTTOM)

        # 创建radiobutton
        for label, value in self.list_data:
            tk.Radiobutton(my_frame2, text=label, value=value, variable=self.radio_selected,
                           command=self.radio_clicked).pack(side=tk.LEFT)

        # 创建MessageBox
        msg.showinfo("提示", "人生苦短我用Python")
        msg.showwarning("警告", "小心代码有问题哦")
        msg.showerror("错误", "你写了一个BUG")

        if msg.askyesno("询问","是否继续执行"):
            print("继续执行")
        else:
            print("终止")

    def radio_clicked(self):
        for item in self.list_data:
            if self.radio_selected.get() == item[1]:
                print("喜欢吃{}".format(item[0]))


if __name__ == '__main__':
    MainWindow()

在这里插入图片描述

  • 7
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小叶柏杉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值