zoukankan      html  css  js  c++  java
  • 十、GUI编程

    GUI图形用户界面编程

          GUI编程类似“搭积木”,将一个个组件放到窗口中,并通过增加“事件处理”,完成一个个程序。例如:记事本、word、画图工具等.

    tkinter模块

          tkinter是Python的标准GUI库,支持跨平台GUI开发,tkinter适合小型的GUI程序编写。

    wxPython

         wxPython是比较流程的GUI库,适合大型应用程序,功能强,类似C++的MFC库。

    PyQT

         类似wxPython

    但是,我们还是介绍tkinter,tkinter是基础,学会后,其他就很轻松。

    tkinter编程四个步骤:

      1.创建应用程序主窗口对象(根窗口)--等所有的组件准备好了后,最后创建此对象,表示监听所有的对象,顺序不能反了

      2. 在主窗口中增加可视化组件,比如:按钮button,文本框label

      3.通过几何布局管理器,管理组件的大小和位置

      4.事件处理,通过绑定事件处理程序,相应用户操作所触发的事件。

    第一个程序:

    from tkinter import *
    from tkinter import messagebox

    root = Tk()
    btn01=Button(root)
    btn01["text"]="我叫党京伟"
    btn01.pack()

    def niShi(e): #e就是事件对象
    messagebox.showinfo("姓名","网友:djw")
    btn01.bind("<Button-1>",niShi)

    root.mainloop() # 设置mainloop方法,则面板激活,
    # 所有在面板事件都会被监听,比如按钮点击,就会调用对应的事件
    # 所以事件应该首先被设置好,最后调用面板

    主窗口的标题和大小定义: root.title(“我的第一个GUI程序”) 、root.genmetry("500x300+100+200")

     
    Tkinter 的 GUI 组件关系图如下:

    GUI应用程序类的经典写法:面向对象

            通过类Application组织整个GUI程序,类Application继承了Frame及通过继承拥有了父类的特征。

             Frame 框架是一个tkinter组件,表示一个矩形的区域。Frame一般作为容器使用,可以放置其他组件,从而实现复杂的布局。---个人理解就是第一个程序的进化版,通过Application这个组件或者叫容器,将各个组件组合到一起,放到Tk()这个主窗口上,完成一个程序。之所以要用application,就是体现面向对象编程。

     第一个程序的进化版:

    """写一个经典的,面向对象的第一个GUI程序"""
    from tkinter import *
    from tkinter import messagebox


    class Application(Frame):
    """一个经典的GUI程序的类的写法"""
    def __init__(self, master=None):
    super().__init__(master) # super()代表的是父类的定义,而不是父类对象
    self.master = master
    self.pack()
    self.createWidget()

    def createWidget(self):

    self.bt01 = Button(self)
    self.bt01["text"] = "请点击我"
    self.bt01["command"] = self.biaobai
    self.bt01.pack()
    #创建退出按钮
    self.btQuit = Button(self, text="退出", command=root.destroy)

    self.btQuit.pack()

    def biaobai(self):
    messagebox.showinfo("表白", "I love you")


    if __name__ == '__main__':
    root = Tk()
    root.geometry("400x100+200+300")
    root.title("一个经典的GUI程序类的测试")
    app = Application(master=root)
    root.mainloop()

    Label(标签)主要用于显示文本信息,不可编辑,也可以显示图片

     常见属性:

     1.width,height:用于指定区域大小,默认值是根据具体显示的内容动态调整。

     2.font:字体大小

     3.image:支持gif格式

     4.fg和bg:前景色和背景色

     5.justify:针对多行文字的对齐,left、right、center

     测试代码:

    """写一个经典的,面向对象的第一个GUI程序"""
    from tkinter import *
    from tkinter import messagebox


    class Application(Frame):
    """一个经典的GUI程序的类的写法"""
    def __init__(self, master=None):
    super().__init__(master) # super()代表的是父类的定义,而不是父类对象
    self.master = master
    self.pack()
    self.createWidget()


    def createWidget(self):
    self.label01 = Label(self, text="北京你好", width=10, height=2,
    bg="black", fg="white",font=("楷体",30),)
    self.label01.pack()

    global photo
    photo = PhotoImage(file="imgs/logo.gif")
    self.label03 = Label(self,image=photo)
    self.label03.pack()

    self.label04 = Label(self, text="北京你好 中国你好 世界你好!!!!!",
    borderwidth=5, relief="groove", justify="right")
    self.label04.pack()



    if __name__ == '__main__':
    root = Tk()
    root.geometry("400x300+200+300")
    root.title("一个经典的GUI程序类的测试")
    app = Application(master=root)
    root.mainloop()

    Option 选项:

          Option设置组件的属性。三种方式设置option选项。

    1.关键字参数:比如:self.lable=Lable(self, fg=“red”,bg="blue")

    2.创建对象后,使用字典索引方式:self.lable["fg"]="red"]

    3.创建对象后,使用config()方法:self.lable.config("fg"="red',bg="blue")

    Button:用来执行用户的单击操作。Button可以包含文本,也可以包含图像,按钮被单机后会自动调用对应事件绑定的方法。

    Entry:用来接收一行字符串的控件,文字长,会自动回滚。

    Text: IDLE就是Text组件构成的。功能异常强大,用于接收多行字符长的控件。

    Radiobutton:单选按钮     Checkbutton:复选按钮。

    Canvas:是一个矩形区域。可以放置图形、图像、组件等。

    布局管理器:pack(垂直管理器)、grid(网格管理器)、piace(像素管理器)

    设计一个计算机界面:

    """写一个经典的,计算机界面"""
    from tkinter import *
    class Application(Frame):
    """一个经典的GUI程序的类的写法"""
    def __init__(self, master=None):
    super().__init__(master) # super()代表的是父类的定义,而不是父类对象
    self.master = master
    self.pack()
    self.createWidget()
    def createWidget(self):
    """通过grid布局实现计算器的界面"""
    btnText = (("MC", "M+", "M-", "MR"),
    ("C", "±", "/", "✖️"),
    (7, 8, 9, "-"),
    (4, 5, 6, "+"),
    (1, 2, 3, "="),
    (0, "."))
    Entry(self).grid(row=0, column=0, columnspan=4, pady=10)
    for windex,w in enumerate(btnText):
    for nindex,n in enumerate(w):
    if n == "=":
    Button(self, text=n, width=2).grid(row=windex + 1, rowspan=2,column=nindex, sticky=NSEW)

    elif n == 0:
    Button(self, text=n, width=2).grid(row=windex + 1, columnspan=2, column=nindex, sticky=NSEW)
    elif n == ".":
    Button(self, text=n, width=2).grid(row=windex + 1, column=nindex+1, sticky=NSEW)
    else:
    Button(self, text=n, width=2).grid(row=windex + 1, column=nindex, sticky=NSEW)

    if __name__ == '__main__':
    root = Tk()
    root.geometry("200x250+200+300")
    root.title("一个经典的GUI程序类的测试")
    app = Application(master=root)
    root.mainloop()

        

     

    设计一个扑克游戏界面:

    """写一个经典的,计算机界面"""
    from tkinter import *
    class Application(Frame):
    """一个经典的GUI程序的类的写法"""
    def __init__(self, master=None):
    super().__init__(master) # super()代表的是父类的定义,而不是父类对象
    self.master = master
    self.pack()
    self.createWidget()
    def createWidget(self):

    self.photoimages=[PhotoImage(file="imgs/puke/puke"+str(i+1)+".gif") for i in range(10)]
    self.pukes=[Label(self.master, image=self.photoimages[i]) for i in range(10)]
    for i in range(10):
    self.pukes[i].place(x=10+i*40, y=50)

    self.pukes[1].bind_class("Label","<Button-1>",self.dabai)
    def dabai(self,event):
    print(event.widget.winfo_geometry())
    if event.widget.winfo_y() == 50:
    event.widget.place(y=30)
    else:
    event.widget.place(y=50)



    if __name__ == '__main__':
    root = Tk()
    root.geometry("600x250+200+300")
    root.title("一个经典的GUI程序类的测试")
    app = Application(master=root)
    root.mainloop()

    事件处理;一个GUI应用整个生命周期都处在一个消息循环(event loop)中。它等待事件的发生,并作出相应的处理。

             Tkinter 提供了用以处理相关事件的机制,处理函数可被绑定给各个控件的各种事件,

              widget.bind(event,handler),如果相关事件发生,handler函数会被触发,事件对象event会传递handler函数。

    Lambda表达式就是一个函数,是匿名的,适合简单传参,返回结果。(不需要反复调用),功能简单,不需要调用。也可以在按钮里面进行传参使用。

         lambda  参数列表:表达式

    三种事件绑定方式总结:

       1.command :绑定不需要的event事件

       2. bind()方式,给一个对象,但是比较复杂

       3.给一类对象绑定:w.bind_class("类型",'event','func')

    OptionMenu:下拉选项菜单

    Scale:指定区间的滑块

    模块:simpledialog

    askcolor:颜色选择框 ,askopenfilename:文本选择框,文件名 ,askopenfile,返回对应的文件

    askinterger/askstring/askfloat:简单对话框

    messagebox:消息对话框

          askokcancel,askquestion,askretrycancel,showerror,showinfo,showwarnning

    python程序打包exe文件:

       我们使用pyinstaller模块实现将python项目打包成exe文件

    安装:

        

     打开终端,输入命令,变成可执行文件:pyinstaller -F xxx.py

     如下完结

     

  • 相关阅读:
    转载: RAID详解[RAID0/RAID1/RAID10/RAID5]
    用户交互式命令:read
    linux下fdisk分区管理、文件系统管理、挂载文件系统等
    linux文件系统下的特殊权限
    find命令详解
    python3中 getpass模块使用
    个人shell积累
    手把手教你利用爬虫爬网页(Python代码)
    数通HCIP-ospf知识点
    HCIE之路--超全ospf思维导图
  • 原文地址:https://www.cnblogs.com/dangjingwei/p/12263629.html
Copyright © 2011-2022 走看看