python图形界面化编程GUI(一)窗口管理和常用的组件(Label、Button、Entry)

GUI

GUI(Graphics User Interface)图形用户界面编程。我们可以通过 python 提供的丰富的组件,快速的实现使用图形的界面和用户交互。 GUI 编程类似于“搭积⽊”,将⼀个个组件(Widget)放到 窗⼝中。
如下是 windows 中的画板工具,就是典型的GUI程序:
在这里插入图片描述
官方工具包Tkinter,是python的一个标准库,内置在python解释器环境里,无需安装就可以直接使用,python自带的IDLE就是用Tkinter来开发的窗口程序。Tkinter是建立在Tk技术上的,通过Tkinter做出的程序在Unix和windows平台上都可以使用,直接进行展示。GUI自带的、可以编辑的界面,可以实现很多直观的功能,图像、登录的窗口等等,比如开发计算器、画板工具、创建记事本的应用程序等都可以实现,可以实现键盘输入、输出窗口以及跟用户的交互体验。
界面上的各种按钮、菜单、编辑区域等都是⼀个个组件组成,对组件进行搭配组合放置到窗口中来执行相应的功能,并通过增加对事件处理成为一个完整的程序,点击相应的按钮实现对应的功能。

在这里插入图片描述.

常用的GUI库

Tkinter

Tkinter是python标准的GUI库,支持跨平台的GUI程序开发,适合小型的GUI程序编写,适合初学者学习。

Tk + interface = Tkinter

wxpython

wxpython是比较流行的GUI库,适合进行大型程序的开发,功能比较强大,整体设计框架类似于MFC(Microsoft Foundation Classes 微软基础类库)。

PyQt

Qt 是⼀种开源的 GUI 库,适合⼤型 GUI 程序开发,PyQT是 Qt ⼯具包跟交互式语言python结合的来实现Qt界面,即是跟标准的 Python 语言结合的实现。我们也可以使⽤自带的 Qt Desginer 界⾯设计器快速开发 GUI 应⽤程序。

GUI 编程的核心步骤和第一个GUI程序

在这里插入图片描述

窗口会一直停留在界面,等待用户点击tk上的叉号,程序才能运行结束。
可以在导入的时候 起个别名,方便调用。

import tkinter as tk # 调用的时候直接用tk就可以了
from tkinter import * # 不建议使用,好比工具箱里由很多工具,
而我们使用的时候只用其中的一项,全部取出的化会导致内存的占用

图形化编程要求首先要有窗口(画板、容器),command是Button里的一个配置项(option)用来指定调用的函数,点击按钮触发事件;也可以添加 高度,字体等

# 导入
import tkinter
from tkinter import messagebox  # 消息框

# 1.创建应用程序主窗口
# 通过Tk()类创建一个窗口
root = tkinter.Tk() # 运行完就关闭了,需要加入停留让窗口一直停留

# callback 回掉函数---事件
def massage_1():
    # 显示消息框
    messagebox.showinfo('Message','文档说明信息,点击关闭')
# 2.在主窗口中,添加各种可视化的组件(菜单、按钮)
# 4.事件处理

bt =tkinter.Button(root, text='按钮说明',command=massage_1)
# 创建按钮,放在主窗口对象上面,此时函数是用按钮调用,不加后面的小括号

# 3.通过几何布局管理器,管理组件的大小及组件的位置,
bt.pack()

bt1 =tkinter.Button(root, text='按钮说明1') # 创建按钮,放在主窗口对象上面
bt1.pack() # 按钮从上至下排列,此时的按钮没有功能,需要绑定事件

# 需要加入消息循环,让窗口停留在界面上
root.mainloop()

在这里插入图片描述
第二种事件绑定的方法

import tkinter
from tkinter import messagebox  # 消息框

# 1.创建应用程序主窗口

root = tkinter.Tk()

def massage_1(event): # 此方法下函数必须加形参
    messagebox.showinfo('Message','文档说明信息,点击关闭')
# 2.在主窗口中,添加各种可视化的组件(菜单、按钮)

bt =tkinter.Button(root, text='按钮说明')

# 3.通过几何布局管理器,管理组件的大小及组件的位置,
bt.pack()

# 4.事件处理,通过事件绑定,Button-1 鼠标左键
bt.bind('<Button-1>', massage_1)  # 绑定(bind)比按钮命令(command)应用广泛

root.mainloop()

在这里插入图片描述

tkinter主窗口

主窗口的位置和大小以及参数设置

genometry(wxh±x±y)  w 为宽度,h 为⾼度,中间用x。
 +x 表示距屏幕左边的距离;-x 表示距屏幕右边的距离;
+y 表示距屏幕上边的距离;-y 表示距屏幕下边的距离。
import tkinter
from tkinter import messagebox  # 消息框

root = tkinter.Tk() # 默认窗口比较小,位置在左上方
# 标题
root.title('标题')

# 设置窗口的大小以及出现的位置
# 300x300是窗口大小,900是距离屏幕左侧的距离,300是距上方的距离
root.geometry('300x300+900+300')

# 更改默认的图标
root.iconbitmap('images/favicon.ico')
# 设置界面的背景色,可以用英文单词,也可以用十六进制
# root['background'] = 'red'
root['background'] = '#00ffff'

# 设置外形
# 设置透明度 范围0-1,0是完全透明,1是完全不透明
root.attributes('-alpha', 0.5)
# 设置工具栏样式,窗口的最大、最小化等等
# True 只有关闭按钮,没有图标,False为正常窗体的样式
root.attributes('-toolwindow', True)

# 设置全屏,慎用
# root.attributes('-fullscreen',True)

# 窗口置顶,运行时窗口永远在程序的最上方
root.attributes('-topmost', True)

# 设置脱离工具栏,True没有上面的工具栏按钮,False正常显示,一般不用
# root.overrideredirect(True)

def massage_1(event):
    messagebox.showinfo('Message','文档说明信息,点击关闭')

bt =tkinter.Button(root, text='按钮说明')
bt.pack()
bt.bind('<Button-1>', massage_1)
root.mainloop()

设置默认图标的时候 images文件夹和代码在同一文件夹下。设置背景颜色的时候可以用十六进制颜色表进行对照。
在这里插入图片描述
在这里插入图片描述

用面向对象的方法写代码

GUI项目最好用面向对象来写程序逻辑,方便修改、拓展及调试。

Frame是组件,在此为画纸,我们可以直接在画板上作画,也可以先写到画纸上,然后再把画纸放到画板上,画板上可以容纳多张画纸相互重叠,使得布局和程序更加合理和方便。在画图工具中的各个组件(如剪贴板,图像,工具,形状等)都写在画纸上,然后再把画纸写到窗口的画板上,这样编程搭配会比较方便。
在这里插入图片描述

import tkinter
from tkinter import messagebox,Frame,Button

#定义类继承于画纸对象,然后把画纸放到画板上
class Application(Frame):
    '''经典的GUI程序类的写法'''
    def __init__(self,master=None):# master模板容器,画纸放到哪
        # 继承方法,父类的重新定义
        super().__init__(master) # 定义属性
        self.master = master
        self.pack() # 画纸几何布局,默认摆放
        self.CreatWidget() # 创建示例对象时,自动进行调用

    def CreatWidget(self):
    	'''创建组件'''
        self.bt = Button(self)
        # self.bt = Button(self,text='按钮说明')
        self.bt['text'] = '按钮说明' # 与上一行代码等同
        self.bt.pack()  # 默认布局
        # 事件绑定
        self.bt.bind('<Button-1>', self.massage_1) # 绑定,方法里必须的有形参
        # self.bt['command'] = self.massage_1  # 用此方法的时候massage_1内不能有形参
        # 如果有形参,调用时候得进行传参,否则方法里就不能有形参 def massage_1(self)

    def massage_1(self,event):
        messagebox.showinfo('Message', '文档说明信息,点击关闭')

if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到
    root = tkinter.Tk() # 创建主窗口
    root.title('标题-经典GUI程序类的测试')
    root.geometry('300x300+900+300')

    # 创建画纸对象放到root画板上
    Application(master=root)
    root.mainloop()  # 消息循环

在这里插入图片描述

简单组件

Label标签

Label标签主要用于显示文本信息,也可以显示图像。

1. width,height:
用于指定区域大小,如果显示是文本,则以单个英文字符大小为单位(⼀个汉字宽	度占 2 个字符位置,⾼度和英⽂字符⼀样);
如果显示是图像,则以像素为单位。默认值是根据具体显示的内容动态调整。
2. font
指定字体和字体大小,如:font = (font_name,size)
3. image:
显示在 Label 上的图像,⽬前 tkinter 只⽀持 gif 格式。
4. fg 和 bg
fg(foreground):前景⾊、bg(background):背景⾊
5. justify
针对多行文字的对齐,可设置 justify 属性,可选值"left", "center" or "right""
属性说明
text标签显示的文本
font设置文本的字体和大小
fg(foreground)字体的颜色
bg(background)标签的背景色
width标签的宽度(一个中文字体的宽为单位)
height标签的高度(一个中文字体的高为单位)
padx文字到边框的距离,水平方向
pady文字到边框的距离,垂直方向
bd(bordenwidth)边框的宽度
relief边框的样式
justify文本对齐方式,默认居中
image图片
compound图片与文字的混搭
anchor方位
import tkinter
from tkinter import Frame,Label,PhotoImage

'''测试Label组件的基本使用'''
#定义类继承于画纸对象
class Application(Frame):

    def __init__(self,master=None):# master模板容器,画纸放到哪
        # 继承方法,父类的重新定义
        super().__init__(master) # 定义属性
        self.master = master
        self.pack() # 画纸几何布局,默认摆放
        self.CreatWidget() # 创建示例对象时,自动进行调用

    def CreatWidget(self):
        '''创建标签组件,显示文字和图像'''
        self.label01 = Label(self, text='图形编程',width=10,height=2,bg='black',fg='white')
        self.label01['text'] = '替换文字'
        self.label01.pack()  # 默认布局

        self.label02 = Label(self, text='图形编程', width=10, height=2, bg='blue', fg='white',font=('黑体',30))
        self.label02.pack()  # 默认布局

        # 显示图像,gif,png均可
        global photo
        photo = PhotoImage(file='images/shou.gif')
        self.label03 = Label(self,image=photo)
        self.label03.pack()

        # borderwidth为边框宽度,relief为边框样式,justify默认居中
        self.label04 = Label(self, text='图形编程\n 非常简单可视化的编程', borderwidth=5,relief='groove',justify='right')
        self.label04.pack()  # 默认布局

if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到
    root = tkinter.Tk() # 创建主窗口
    root.title('标题-经典GUI程序类的测试')
    root.geometry('300x300+900+300')

    # 创建画纸对象放到root画板上
    Application(master=root)
    root.mainloop()  # 消息循环

在这里插入图片描述

Button按钮组件

Button(按钮)⽤来执⾏⽤户的单击操作。Button 可以包含 ⽂本,也可以包含图像。按钮被单击后会⾃动调⽤对应事件 绑定的⽅法。

from tkinter import *
from tkinter import messagebox

#定义类继承于画纸对象
class Application(Frame):
    '''经典的GUI程序类的写法'''
    def __init__(self,master=None):# master模板容器,画纸放到哪
        # 继承方法,父类的重新定义
        super().__init__(master) # 定义属性
        self.master = master
        self.pack() # 画纸几何布局,默认摆放
        self.CreatWidget() # 创建示例对象时,自动进行调用

    def CreatWidget(self):
        '''创建组件'''
        # NE 文字在按钮上的方位,东北角
        self.btn01 = Button(root,text='登录',width=6,height=3,anchor=NE,command=self.login)
        self.btn01.pack()

        global photo
        photo = PhotoImage(file='images/start.gif')
        # 直接把按钮放在画板root上
        self.btn02 = Button(root,image=photo,command=self.login)
        self.btn02.pack()
        # 也可以设置按钮禁用,比如会员可以点击,非会员禁用
        self.btn02.config(state='disable')  # 设置按钮禁用

    def login(self):
        messagebox.showinfo('学习系统', '登录成功,开始学习')

if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到
    root = Tk() # 创建主窗口
    root.title('标题-经典GUI程序类的测试')
    root.geometry('300x300+900+300')

    # 创建画纸对象放到root画板上
    Application(master=root)
    root.mainloop()  # 消息循环

在这里插入图片描述

Entry

单行文本框 Entry ⽤来接收一行字符串的控件。如果用户输⼊的文字长度长于 Entry 控件的宽度时, ⽂字会自动向后滚动。如果想输入多行文本, 需要使用 Text 控件。通常用户账号密码输入的登录框,比对后台的数据库,对的话显示登录成功,不正确显示输入错误。

from tkinter import *
from tkinter import messagebox

#定义类继承于画纸对象
class Application(Frame):
    '''经典的GUI程序类的写法'''
    def __init__(self,master=None):# master模板容器,画纸放到哪
        # 继承方法,父类的重新定义
        super().__init__(master) # 定义属性
        self.master = master
        self.pack() # 画纸几何布局,默认摆放
        self.CreatWidget() # 创建示例对象时,自动进行调用

    def CreatWidget(self):
        '''创建组件'''
        self.label01 = Label(self,text='用户名')
        self.label01.pack()

        # 获取输入框的信息,输入框的内容是可变的
        # v1是可变的,创建变量StringVar绑定到组件上,StringVar发生变化,组件内容entry01的值也会发生变化
        v1 = StringVar()
        self.entry01 = Entry(self,textvariable=v1)
        self.entry01.pack()
        v1.set('admin') # 设置默认值为admin
        print(v1.get()) # 获取变量的信息
        print(self.entry01.get())  # 获取输入框的信息

        self.label02 = Label(self, text='密码')
        self.label02.pack()
        v2 = StringVar()
        self.entry02 = Entry(self,textvariable=v2)
        self.entry02.pack()
        
        Button(self,text='登录',command=self.login).pack()

    def login(self):
    	# 用组件接受用户输入的信息
        username = self.entry01.get()
        psd = self.entry02.get()
        print('去数据库比对账号和密码')
        print('用户名' + username)
        print('密码' + psd)
        if username == 'xuexi001' and psd == '123456':
            messagebox.showinfo('学习系统', '登录成功,开始学习')
        else:
            messagebox.showinfo('学习系统', '登录失败,用户名或密码错误!')


if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到
    root = Tk() # 创建主窗口
    root.title('标题-经典GUI程序类的测试')
    root.geometry('300x300+900+300')

    # 创建画纸对象放到root画板上
    Application(master=root)
    root.mainloop()  # 消息循环

在这里插入图片描述

  • 18
    点赞
  • 173
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Table of Contents 1. What is Tkinter?.......................................................................................................................3 2. A minimal application..............................................................................................................3 3. Definitions..............................................................................................................................4 4. Layout management.................................................................................................................5 4.1. The .grid() method....................................................................................................5 4.2. Other grid management methods...................................................................................6 4.3. Configuring column and row sizes.................................................................................7 4.4. Making the root window resizeable................................................................................8 5. Standard attributes...................................................................................................................8 5.1. Dimensions...................................................................................................................9 5.2. The coordinate system...................................................................................................9 5.3. Colors...........................................................................................................................9 5.4. Type fonts...................................................................................................................10 5.5. Anchors......................................................................................................................11 5.6. Relief styles.................................................................................................................12 5.7. Bitmaps.......................................................................................................................12 5.8. Cursors.......................................................................................................................12 5.9. Images........................................................................................................................14 5.10. Geometry strings........................................................................................................14 5.11. Window names...........................................................................................................15 5.12. Cap and join styles.....................................................................................................15 5.13. Dash patterns.............................................................................................................16 5.14. Matching stipple patterns............................................................................................16 6. The Button widget................................................................................................................17 7. The Canvas widget................................................................................................................19 7.1. Canvas coordinates......................................................................................................20 7.2. The Canvas display list................................................................................................20 7.3. Canvas object IDs........................................................................................................21 7.4. Canvas tags................................................................................................................21 1http://www.nmt.edu/tcc/help/pubs/tkinter/ 2http://www.nmt.edu/tcc/help/pubs/tkinter/tkinter.pdf 1 Tkinter reference New Mexico Tech Computer Center 7.5. CanvastagOrId arguments......................................................................................21 7.6. Methods on Canvas widgets........................................................................................21 7.7. Canvas arc objects.......................................................................................................26 7.8. Canvas bitmap objects.................................................................................................28 7.9. Canvas image objects..................................................................................................29 7.10. Canvas line objects.....................................................................................................29 7.11. Canvas oval objects....................................................................................................31 7.12. Canvas polygon objects..............................................................................................32 7.13. Canvas rectangle objects.............................................................................................34 7.14. Canvas text objects.....................................................................................................35 7.15. Canvas window objects..............................................................................................36 8. The Checkbutton widget......................................................................................................37 9. The Entry widget..................................................................................................................40 9.1. Scrolling an Entry widget............................................................................................43 10. The Frame widget................................................................................................................43 11. The Label widget................................................................................................................44 12. The LabelFrame widget......................................................................................................46 13. The Listbox widget............................................................................................................48 13.1. Scrolling a Listbox widget........................................................................................52 14. The Menu widget..................................................................................................................52 14.1. Menu item creation (coption) options.........................................................................55 15. The Menubutton widget......................................................................................................56 16. The Message widget............................................................................................................58 17. The OptionMenu widget.......................................................................................................59 18. The PanedWindow widget....................................................................................................60 18.1. PanedWindow child configuration options...................................................................63 19. The Radiobutton widget....................................................................................................63 20. The Scale widget................................................................................................................66 21. The Scrollbar widget........................................................................................................69 21.1. The Scrollbarcommand callback............................................................................72 21.2. Connecting a Scrollbar to another widget................................................................73 22. The Spinbox widget............................................................................................................73 23. The Text widget..................................................................................................................77 23.1. Text widget indices...................................................................................................80 23.2. Text widget marks....................................................................................................81 23.3. Text widget images...................................................................................................82 23.4. Text widget windows...............................................................................................82 23.5. Text widget tags.......................................................................................................82 23.6. Setting tabs in a Text widget......................................................................................82 23.7. The Text widget undo/redo stack..............................................................................83 23.8. Methods on Text widgets..........................................................................................83 24. Toplevel: Top-level window methods..................................................................................90 25. Universal widget methods.....................................................................................................93 26. Standardizing appearance...................................................................................................100 26.1. How to name a widget class......................................................................................101 26.2. How to name a widget instance.................................................................................101 26.3. Resource specification lines.......................................................................................102 26.4. Rules for resource matching......................................................................................103 27. Connecting your application logic to the widgets...................................................................103 28. Control variables: the values behind the widgets...................................................................104 29. Focus: routing keyboard input.............................................................................................106 30. Events................................................................................................................................107 New Mexico Tech Computer Center Tkinter reference 2 30.1. Levels of binding......................................................................................................107 30.2. Event sequences.......................................................................................................108 30.3. Event types..............................................................................................................109 30.4. Event modifiers........................................................................................................110 30.5. Key names...............................................................................................................110 30.6. Writing your handler: The Event class......................................................................113 30.7. The extra arguments trick..........................................................................................114 30.8. Virtual events...........................................................................................................115 31. Pop-up dialogs....................................................................................................................116 31.1. The tkMessageBox dialogs module..........................................................................116 31.2. The tkFileDialog module.....................................................................................117 31.3. The tkColorChooser module.................................................................................118
好的,我可以帮你讲一下如何用Python实现一个图形化界面的学生管理系统。 首先,你需要安装PythonGUI库,可以选择Tkinter、PyQt等。这里我们以Tkinter为例。 然后,你需要设计你的学生管理系统的功能和界面,比如添加学生、删除学生、修改学生信息、查询学生等功能。可以参考以下代码: ```python import tkinter as tk class StudentManagementSystem: def __init__(self, master): self.master = master self.master.title('学生管理系统') self.master.geometry('500x300') # 添加学生 self.add_frame = tk.Frame(self.master) self.add_frame.pack() tk.Label(self.add_frame, text='添加学生').grid(row=0, column=0) tk.Label(self.add_frame, text='姓名:').grid(row=1, column=0) self.add_name_entry = tk.Entry(self.add_frame) self.add_name_entry.grid(row=1, column=1) tk.Label(self.add_frame, text='年龄:').grid(row=2, column=0) self.add_age_entry = tk.Entry(self.add_frame) self.add_age_entry.grid(row=2, column=1) tk.Button(self.add_frame, text='添加', command=self.add_student).grid(row=3, column=1) # 删除学生 self.delete_frame = tk.Frame(self.master) self.delete_frame.pack() tk.Label(self.delete_frame, text='删除学生').grid(row=0, column=0) tk.Label(self.delete_frame, text='姓名:').grid(row=1, column=0) self.delete_name_entry = tk.Entry(self.delete_frame) self.delete_name_entry.grid(row=1, column=1) tk.Button(self.delete_frame, text='删除', command=self.delete_student).grid(row=2, column=1) # 修改学生信息 self.edit_frame = tk.Frame(self.master) self.edit_frame.pack() tk.Label(self.edit_frame, text='修改学生信息').grid(row=0, column=0) tk.Label(self.edit_frame, text='姓名:').grid(row=1, column=0) self.edit_name_entry = tk.Entry(self.edit_frame) self.edit_name_entry.grid(row=1, column=1) tk.Label(self.edit_frame, text='新年龄:').grid(row=2, column=0) self.edit_age_entry = tk.Entry(self.edit_frame) self.edit_age_entry.grid(row=2, column=1) tk.Button(self.edit_frame, text='修改', command=self.edit_student).grid(row=3, column=1) # 查询学生 self.query_frame = tk.Frame(self.master) self.query_frame.pack() tk.Label(self.query_frame, text='查询学生').grid(row=0, column=0) tk.Label(self.query_frame, text='姓名:').grid(row=1, column=0) self.query_name_entry = tk.Entry(self.query_frame) self.query_name_entry.grid(row=1, column=1) tk.Button(self.query_frame, text='查询', command=self.query_student).grid(row=2, column=1) # 显示学生列表 self.list_frame = tk.Frame(self.master) self.list_frame.pack() tk.Label(self.list_frame, text='学生列表').grid(row=0, column=0) self.student_listbox = tk.Listbox(self.list_frame) self.student_listbox.grid(row=1, column=0) def add_student(self): name = self.add_name_entry.get() age = self.add_age_entry.get() # TODO: 添加学生到数据库 self.student_listbox.insert(tk.END, f'{name}({age})') self.add_name_entry.delete(0, tk.END) self.add_age_entry.delete(0, tk.END) def delete_student(self): name = self.delete_name_entry.get() # TODO: 从数据库删除学生 students = self.student_listbox.get(0, tk.END) for i, student in enumerate(students): if name in student: self.student_listbox.delete(i) self.delete_name_entry.delete(0, tk.END) def edit_student(self): name = self.edit_name_entry.get() age = self.edit_age_entry.get() # TODO: 修改学生信息 students = self.student_listbox.get(0, tk.END) for i, student in enumerate(students): if name in student: self.student_listbox.delete(i) self.student_listbox.insert(i, f'{name}({age})') self.edit_name_entry.delete(0, tk.END) self.edit_age_entry.delete(0, tk.END) def query_student(self): name = self.query_name_entry.get() # TODO: 查询学生信息 students = self.student_listbox.get(0, tk.END) for student in students: if name in student: tk.messagebox.showinfo('查询结果', student) self.query_name_entry.delete(0, tk.END) if __name__ == '__main__': root = tk.Tk() app = StudentManagementSystem(root) root.mainloop() ``` 这段代码实现了一个简单的学生管理系统,包括添加学生、删除学生、修改学生信息、查询学生等功能。你需要把TODO的部分补充完整,实现与数据库的交互。 希望这个例子能够帮到你,如果你有其他问题,可以继续问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值