十、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")
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
如下完结
十、GUI编程的更多相关文章
- 实验十五 GUI编程练习与应用程序部署
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 一:理论部分 1.Java 程序的打包:编译完成后,程序员将.class 文件压缩打包为 .jar 文件后,GUI 界面序就可以 ...
- Python GUI编程--Tkinter
今天看到了GUI编程,书上推荐用wxPython,去官网上看了看,发现Windows的最高支持到2.7,我用的是3.4版本,咋办,用自带的库--Tkinter呗,它是Python的默认GUI库,几乎是 ...
- 初次踏上GUI编程之路(有点意思,详细介绍了菜鸟的学习之路)
初次踏上GUI编程之路 —— 我的Qt学习方法及对Qt认识的不断转变 -> 开始接触GUI与开始接触Qt: 话说,我第一次看见“Qt”这一个名词,好像是在CSDN网站的主页上吧,因为CSDN好像 ...
- GUI编程与CLI编程
作为一名多年的iOS开发人员,多次触发我思酌“GUI编程与CLI编程”各自的优劣,尤其是在当我为界面交互花费大占比时间时,时常怀疑自己的工作性质,我终究还是为互联网工作的码农,而不是让互联网为我所用的 ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- 1.JAVA之GUI编程概述
下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式: ...
- 2.JAVA之GUI编程布局
布局管理器 容器中的组件排放方式,就是布局 常见的布局管理器: **************************************************** 1.FlowLayout(流式 ...
- 3.JAVA之GUI编程Frame窗口
创建图形化界面思路: 1.创建frame窗体: 2.对窗体进行基本设置: 比如大小.位置.布局 3.定义组件: 4.将组件通过add方法添加到窗体中: 5.让窗体显示,通过setVisible(tur ...
- 4.JAVA之GUI编程事件监听机制
事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...
随机推荐
- idea创建同名的maven工程时报错:Failed to create a Maven project 'xxx/pom.xml' already exists in VFS
1.说明 原先有个 xxx 的 maven 工程,然后删掉了,又重新建了个同名的工程,而且目录也一样,结果报错: 可以在 Help ==> Show Log in Explorer 查看到以下具 ...
- php.laravel.csrf
概念请自己查 在全局帮助函数库Illuminate\Foundation\helpers.php中有以下几个函数定义,在看过前两个函数实现可以在使用中多少有点帮助. function csrf_fie ...
- 152-PHP htmlspecialchars函数
<?php //定义一个HTML代码字符串 $str=<<<HTM <a href=#><b><i>到一个网址的链接<>< ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 异常处理
异常是程序在执行期间产生的问题.C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作. 异常提供了一种转移程序控制权的方式.C++ 异常处理涉及到三个关键字:try.catch.throw ...
- POJ 2182&& POJ 2828:Lost Cows 从后往前 线段树
Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10544 Accepted: 6754 Descri ...
- 由于找不到msvcp100.dll无法继续执行代码
最近重装系统之后安装mysql, 执行 mysqld install 命令时出现 : 由于找不到msvcp100.dll无法继续执行代码... 解决办法 下载 Microsoft Visual C++ ...
- 深度理解js中var let const 区别
首先要理解js中作用域的概念 作用域:指的是一个变量的作用范围 1.全局作用域 直接写在script中的js代码,在js中,万物皆对象,都在全局作用域,全局作用域在页面打开时创建,在全局作用域中有一个 ...
- 第二届中国“AI+”创新创业大赛完美收官,京东云赛道硕果累累
聚焦南京产业发展核心诉求,京东云携手南京政府构建的"平台+生态+赋能"的产业体系,搭建产业创新云平台,以人工智能产业创新链要素补齐为核心,围绕"研.产.供.销.服&quo ...
- DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
客户端当发送空的json字符串时,请求RestController时,报错: DefaultHandlerExceptionResolver : Failed to read HTTP message ...
- STM32速度---网页讲解
1. ① USART串口,若最大波特率只需115.2k,那用2M的速度就够了,既省电也噪声小. ② I2C接口,若使用400k波特率,若想把余量留大些,可以选用10M的GPIO引脚速度. ③ SPI接 ...