python从入门到实践————图形界面(上)

简介: python从入门到实践————图形界面(上)

前言


图形用户接口(Graphical User Interface,GUI)是人机交互的重要技术手段,在Python中利用tkinter模块就可以方便地实现图形界面。

在你python中,除了本次要讲的tkinter模块,还有wxPython,PyQt5模块,以及与Java图形界面组件衔接的Jpython模块。由于图形编程一般都是单机版程序,而Python技术的发展重点并不在此,所以这里就只简单的介绍tkinter模块。


窗体组件


序号

组件

描述

1

Button

按钮组件,在界面中显示一个按钮

2

Canvas

画布组件,在界面中显示一个画布,而后在此画布上进行绘画

3

Checkbutton

多选框组件,可以实现多个选项的选定

4

Entry

输入控件,用于显示简单的文本内容

5

Frame

框架控件,在进行排版时实现子排版模型

6

Label

标签组件,可以显示文字或图片信息

7

Listbox

列表框组件,可以显示多个列表项

8

Menu

菜单组件,在界面上端显示菜单栏,下拉菜单或弹出菜单

9

Menubutton

菜单按钮组件,为菜单定义菜单项

10

Message

消息组件,用来显示提示信息

11

Radiobutton

单选按钮组件,可以实现单个菜单项的选定

12

Scale

滑动组件,设置数值的可用范围,通过滑动切换数值

13

Scrollbar

滑动条组件,为外部包装组件,当有多个内容显示不下时,可以出现滚动条

14

Text

文本组件,可以实现文本或图片信息的提示

15

Toplevel

容器组件,可以实现对话框

16

Spinbox

输入组件,与Entry对应,可以设置数据输入访问

17

PanedEindow

窗口布局组件,可以在内部提供一个子容器实现子窗口定义

18

LabelFrame

容器组件,实现复杂组件布局

19

tkMessageBox

消息组件,可以进行提示框的显示


窗体显示


任何一个图形界面都会包含有一个主窗体,在主窗体内可以设置不同的组件,在tkinter模块中提供了Tk类,该类可以负责窗体的创建以及相关的属性定义。tkinter.Tk类中提供的常用方法如表


序号

方法

描述

1

def title(self,string=None)

设置窗体显示标题

2

def iconbitmap(self,bitmap=None,default=None)

设置窗体LOGO

3

def geometry(self,newGeometry=None)

设置窗体大小

4

def minsize(self,width=None,height=None)

设置窗体最小化尺寸

5

def maxsize(self,width=None,height=None)

设置窗体最大化尺寸

6

def mainloop(self,n=0)

界面循环及时显示窗体变化


显示窗体


import tkinter
import os
LOGO_PATH='./123.png'
IMAGE_PATH='./123.png'
class MainForm:
    def __init__(self) -> None:
        root=tkinter.Tk() #创建窗体;
        root.title('one.py')
        root.iconbitmap(LOGO_PATH) #设置窗体图标
        root.geometry("500x600")  #设置窗体大小,这里的x是小写的x,不是乘号;
        root.maxsize(1000,400)
        root.minsize(200,50)
        root['background']='LightSlateGray' #设置背景颜色;
        label_text=tkinter.Label(root,text='2023继续加油;',width=200,height=100,bg='#223011',
            font=('宋体',20),justify='right')
        photo=tkinter.PhotoImage(file=IMAGE_PATH)
        label_photo=tkinter.Label(root,image=photo)
        label_photo.pack()#图片标签展示;
        label_text.pack()
        root.mainloop()  #界面循环监听;
def main():
    MainForm()
if __name__=='__main__':
    main()


 


结果显示:


e16b9ad3433816e434a1e37e08998712_deffa0931173420a831b284e7602128a.png



文本显示


# coding:用户界面GUI
import tkinter,os
import time
IMAGE_PATH='./123.png'
class MainForm:
    def __init__(self) -> None:
        root=tkinter.Tk()  #创建窗体;
        root.geometry("500x400")  #窗口的大小
        root.title('用户界面的设计')
        root.maxsize(1000,600)
        root['background']='LightSlateGray'
        Text=tkinter.Text(root,width=20,height=50,font=('宋体',20))
        Text.insert('current',"加油!")#在光标处插入数据;
        Text.insert('end',"追梦人")
        photo=tkinter.PhotoImage(file=IMAGE_PATH) #加载图片;
        Text.image_create("end",image=photo)#图片的设置;
        Text.pack() #循环监听;
        root.mainloop()
def main():
    MainForm()
if __name__=='__main__':
    main()




结果显示:


14821edc5590756dd8c7820803941965_9a98a08408c1406fb9509e6c94754c02.png


由于界面编程主要就是函数的使用,没法过多的介绍,函数的使用已经做了注释。这里就简单的对两个函数的使用作了介绍。


项目实践


由于函数太多,每个都介绍所需篇幅过长,这里以一个项目来对函数使用做介绍。项目已经打包成exe文件放在了资源中。有兴趣可以去尝试。

源代码:


#coding:Frame事件
import tkinter,os,tkinter.messagebox
#在同一个界面中,由于我们可能需要不同的组件,不同的组件需要的页面布局也是不一样的
#Frame可以使页面分成多个子页面,每个子页面都可以使用不同的布局方式
import re
#IMAGE_PATH='./123.png'
class MainForm:
    def __init__(self) -> None:
        self.__root=tkinter.Tk() #创建窗体
        self.__root.title('计算器')
        self.__root.geometry('231x280')
        #self.__photo=tkinter.PhotoImage(file=IMAGE_PATH)
        self.__root['background']='Ligh tSlateGray'
        self.input_frame() #显示输入Frame
        self.button_frame() #显示按钮组件
        self.__root.protocol('WM_DELETE_WINDOW',self.close_handle)
        self.__root.mainloop() #循环监听
    def close_handle(self):
        if tkinter.messagebox.askyesnocancel('计算器关闭确认','确定要关闭计算器'):
            self.__root.destroy()
    def input_frame(self): #输入和回显文本
        self.input_frame=tkinter.Frame(self.__root,width=20) #定义Frame
        self.content=tkinter.StringVar() #修改数据
        self.entry=tkinter.Entry(self.input_frame,width=14,font=('微软雅黑',20),textvariable=self.content)#定义输入框
        self.entry.pack(fill='x',expand=1)#文本显示
        self.clean=False  #设置清除标记
        self.input_frame.pack(side='top') #Frame显示
    def button_frame(self):
        self.button_frame=tkinter.Frame(self.__root,width=50)#创建Frame
        self.button_list=[[],[],[],[]]#定义按钮组件
        self.button_list[0].append(tkinter.Button(self.button_frame,text='1',fg='black',width=3,font=('微软雅黑',20)))#计算器按键1
        self.button_list[0].append(tkinter.Button(self.button_frame,text='2',fg='black',width=3,font=('微软雅黑',20))) #计算器按键2
        self.button_list[0].append(tkinter.Button(self.button_frame,text='3',fg='black',width=3,font=('微软雅黑',20))) #计算器按键3
        self.button_list[0].append(tkinter.Button(self.button_frame,text='+',fg='black',width=3,font=('微软雅黑',20))) #计算器按键+
        self.button_list[1].append(tkinter.Button(self.button_frame,text='4',fg='black',width=3,font=('微软雅黑',20))) #计算器按键4
        self.button_list[1].append(tkinter.Button(self.button_frame,text='5',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[1].append(tkinter.Button(self.button_frame,text='6',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[1].append(tkinter.Button(self.button_frame,text='-',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[2].append(tkinter.Button(self.button_frame,text='7',fg='black',width=3,font=('微软雅黑',20))) 
        self.button_list[2].append(tkinter.Button(self.button_frame,text='8',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[2].append(tkinter.Button(self.button_frame,text='9',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[2].append(tkinter.Button(self.button_frame,text='*',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[3].append(tkinter.Button(self.button_frame,text='0',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[3].append(tkinter.Button(self.button_frame,text='.',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[3].append(tkinter.Button(self.button_frame,text='=',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[3].append(tkinter.Button(self.button_frame,text='/',fg='black',width=3,font=('微软雅黑',20)))
        self.row=0#布局行控制
        for group in self.button_list:
            self.column=0#布局列控制
            for button in group:#获取按钮组中的按钮
                button.bind("<Button-1>",lambda event:self.button_handle(event))  #绑定事件
                button.grid(row=self.row,column=self.column)#grid布局
                self.column+=1 #修改布局列
            self.row+=1 #修改布局行
            self.button_frame.pack(side='bottom') #pack布局
    def button_handle(self,event): 
        oper=event.widget['text'] #获得当前操作符
        if self.clean:
            self.content.set("")#删除输入框数据
            self.clean=False#修改清除标记
        if oper !='=':
            self.entry.insert('end',oper)
        elif oper=='=':
            result=0
            exp=self.entry.get()  #获得输入表达式数据
            nums=re.split(r"\+|\-|\*|\\",exp) #获得输入的两个数据
            pattern=r"\+|\-|\*|\\"  #操作符提取准则
            flag=re.findall(pattern,exp)[0]  #获取操作符
            if flag=='+':
                result=float(nums[0])+float(nums[1]) #加法运算
            elif flag=='-':
                result=float(nums[0])-float(nums[1])
            elif flag=='*':
                result=float(nums[0])*float(nums[1])
            elif flag=='/':
                result=float(nums[0])/float(nums[1])
            self.entry.insert('end',"=%s" % result)
            self.clean=True
def main():
    MainForm()
if __name__=='__main__':
    main()


14dda9af7b007ae0c3749fb74dda2a84_1667b47f53904ef489aef1e43db4d65c.png



总结


图形界面编程本身就是一个单机程序,不是Python的重点学习项目,所以博主也只对tkinter模块进行了介绍,GUI编程,后面会继续介绍。

相关文章
|
6天前
|
Python
【python从入门到精通】-- 第五战:函数大总结
【python从入门到精通】-- 第五战:函数大总结
27 0
|
22小时前
|
存储 算法 Python
【10月更文挑战第16天】「Mac上学Python 27」小学奥数篇13 - 动态规划入门
本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。
24 3
|
3天前
|
设计模式 开发者 Python
Python编程中的设计模式:从入门到精通####
【10月更文挑战第14天】 本文旨在为Python开发者提供一个关于设计模式的全面指南,通过深入浅出的方式解析常见的设计模式,帮助读者在实际项目中灵活运用这些模式以提升代码质量和可维护性。文章首先概述了设计模式的基本概念和重要性,接着逐一介绍了几种常用的设计模式,并通过具体的Python代码示例展示了它们的实际应用。无论您是Python初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和实用的技巧。 ####
|
5天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第12天】本文介绍了如何使用Python和Scikit-learn进行机器学习的基础知识和入门实践。首先概述了机器学习的基本概念,包括监督学习、无监督学习和强化学习。接着详细讲解了Python和Scikit-learn的安装、数据处理、模型训练和评估等步骤,并提供了代码示例。通过本文,读者可以掌握机器学习的基本流程,并为深入学习打下坚实基础。
11 1
|
6天前
|
自然语言处理 Python
【python从入门到精通】-- 第三战:输入输出 运算符
【python从入门到精通】-- 第三战:输入输出 运算符
34 0
【python从入门到精通】-- 第三战:输入输出 运算符
|
5天前
|
人工智能 算法 搜索推荐
通义灵码在Python项目开发中的应用实践
通义灵码在Python项目开发中的应用实践
30 0
|
5天前
|
机器学习/深度学习 人工智能 架构师
Python学习圣经:从入门到精通Python,打好 LLM大模型的基础
Python学习圣经:从0到1精通Python,打好AI基础
|
5天前
|
数据可视化 定位技术 Python
Python数据可视化--Matplotlib--入门
Python数据可视化--Matplotlib--入门
12 0
|
5天前
|
数据挖掘 索引 Python
Python数据分析篇--NumPy--入门
Python数据分析篇--NumPy--入门
15 0
|
5天前
|
IDE 开发工具 索引
Python基础知识---入门
Python基础知识---入门
5 0