十、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="北京你好\n中国你好\n世界你好!!!!!",
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

 如下完结

 

 

posted @ 2020-02-05 14:21  小熊尤里  阅读(597)  评论(0编辑  收藏  举报