文件操作:
基础操作:
创建/打开文件:
#语法
file=open(filename,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,openr=None)
filename 创建或打开的文件名称(在同一个文件夹内时),绝对路径(不在同一个文件夹内时)
mode 文件的打开方式,默认打开方式只读(r)
buffering 设置缓冲模式
-1 :自动设置缓冲区,通常为4096或8192个字节
0 :关闭缓冲区直接写入文件中
Encoding 打开文件的编码方式
errors 编码错误时的处理方式
newline 换行方式
closefd 文件描述时使用
opener 文件描述时使用
#例子:
file = open('test.txt','w')
file.write('第一次写入')
file = open('test.txt','r+')
file.write('第二次写入覆盖第一次写入')
file = open('test.txt','w')
file.write('第一次写入。')
print(file)
file = open('test.txt','a+')
file.write('第二次追加写入。')
print(file)
mode常用的打开方式:
关闭文件:
#语法
file.close()
读取文件:
常用方法 | 说明 |
file.read([number]) | 这种方式用于读取文本的指定字符串长度 |
file.readline() | 这种方式读取文本的第一行内容 |
flie.readlines() | 这种方式读取了文本的所有内容,并把每一行内容放到一个list中 |
file.flush() | 刷新缓冲区,立即写到磁盘上 |
file.seek(index) | 移动文件到指定的索引处,从此位置开始读取,但写入从最后开始 |
with open | 使用完自动关闭,省去file.close()操作 |
encoding='utf-8' | 读写的文件含中文时添加 |
# file.read([number]) 读写指定字符串
file = open('test.txt','w')
file.write('第一次写入的内容。')
file = open('test.txt','a+')
file.write('第二次追加写入的内容。')
print(file.read(8))
file.close()
#file.readline() 读取一行内容
file = open('test.txt','w')
file.write('第一次写入的内容。')
file = open('test.txt','a+')
file.write('\n')
file.write('第二次追加写入的内容。')
print(file.readline())
file.close()
#file.readlines() 按行全部读取,返回列表的形式
file = open('test.txt','w')
file.write('第一次写入的内容。')
file = open('test.txt','a+')
file.write('\n')
file.write('第二次追加写入的内容。')
print(file.readlines())
file.close()
file = open('test.txt','r')
print(file.readlines())
file.close()
#file.seel(index) 按照索引读取
管理文件:
os模块:
常用方法 | 功能 |
os.access(path, name) | 特权模式 |
os.chdir(path) | 改变当前工作目录 |
os.chflags(path, flags) | 设置路径的标记为数字标记 |
os.chmod(path, name) | 更改权限 |
os.chown(path, uid, gid) | 更改文件所有者 |
os.chroot(path) | 改变当前进程的根目录os.close(x) |
os.close(x) | 关闭文件 |
os.fchdir(x) | 通过文件描述符改变当前工作目录 |
os.getcwd() | 返回当前工作目录 |
os.listdir(path) | 返回当前目录下的所有文件及文件夹的列表 |
os.mkdir(path[,name]) | 创建一个名字为name的文件夹名 |
os.open(file) | 打开一个文件 |
os.remove(path) | 删除path路径的文件 |
os.rename(src,dst) | 修改文件名,src为源文件,dst为目标文件 |
os.rmdir(path) | 删除path对应的目录 |
import os
os.name#返回nt为windows,posix为Linux、Unix或mac os。
os.linesep#当前系统的换行符
os.sep#当前系统的分隔符
os.name
print(os.name,os.linesep,os.sep,os.name)
os.path模块:
常用方法 | 功能 |
os.path.abspath(path) | 返回路径名路径的规范化绝对化版本 |
os.path.basename(path) | 返回路径名路径的基名称 |
os.path.commonprefix(list) | 返回序列路径中每个路径名的最长公共子路径 |
os.path.dirname(path) | 返回路径名路径的目录名 |
os.path.exists(path) | 如果路径引用现有路径或打开的文件描述符,则返回True,中断的符号链接返回Flase |
os.path.lexists | 如果路径引用现有路径,则返回True |
os.path.expanduser(path) | 返回参数,初始组件为~或~user替换为该用户的主目录 |
os.path.expandvars(path) | 返回环境变量展开的参数 |
os.path.getatime(path) | 返回路径的最后访问时间 |
os.path.getmtime(path) | 返回上次修改路径的时间 |
os.path.getctime(path) | 返回文件 path 的创建时间 |
os.path.getsize(path) | 返回路径的大小,以字节为单位 |
os.path.isabs(path) | 如果路径是绝对路径名,则返回True |
os.path.isfile(path) | 如果路径是文件,则返回True |
os.path.isdir(path) | 如果路径是目录,则返回True |
os.path.islink(path) | 如果路径是链接,则返回True |
os.path.ismount(path) | 如果路径是挂载点,则返回True |
os.path.join(path1[, path2[, ...]]) | 把目录和文件名合成一个路径 |
os.path.normcase(path) | 转换path的大小写和斜杠 |
os.path.normpath(path) | 规范path字符串形式 |
os.path.realpath(path) | 返回path的真实路径 |
os.path.relpath(path[, start]) | 计算相对路径 |
os.path.samefile(path1, path2) | 判断目录或文件是否相同 |
os.path.sameopenfile(fp1, fp2) | 判断fp1和fp2是否指向同一文件 |
#os.path模块:针对路径的模块,模块内提供对文件、目录和路径管理的函数
最常用:
abspath() 返回路径名路径的规范化绝对化版本
exists(path) 如果路径引用现有路径或打开的文件描述符,则返回True,中断的符号链接返回Flase
join(path,name) 把目录和文件名合成一个路径
basename(path) 返回路径名路径的基名称
dirname(path) 返回路径名路径的目录名
isdir(path) 如果路径是目录,则返回True
import os
print('当前目录:',os.getcwd())
print('判断当前目录是否存在,存在的话返回True',os.path.exists(os.getcwd()))
目录管理:
创建一级目录:
#语法:
os.mkdir(path)
#例子:
import os
if not os.path.exists('一级目录'):
os.mkdir('一级目录')
print('创建完成')
else:
print('目录已存在')
创建多级目录:
#语法:
os.makedirs(path)
#例子:
import os
now = os.getcwd()
os.makedirs('one\two\three')
print('创建成功')
删除目录:
#语法:
os.rmdir(path) 删除的目录中不存在子目录或者文件
#例子:
import os
os.rmdir('一级目录')
print('删除完成')
项目管理:
重命名:
#语法:
os.rename(src,dst)
src 更改的文件或者目录名
dst 新的名字
#例子:
import os
print(os.getcwd())#如果不知道当前的目录,先输出找到当前的目录。
os.mkdir(r'C:\Users\轻烟\PycharmProjects\untitled1\teach\new')
#注意这个r,如果存在\t,\n这种内容,在前面加r。
import os
os.rename(r'C:\Users\轻烟\PycharmProjects\untitled1\teach\new',r'C:\Users\轻烟
\PycharmProjects\untitled1\teach\newname')
删除文件:
#语法:
os.remove(path)
path 删除文件的路径,使用相对路径或者绝对路径,最好使用绝对路径
#例子:
#相对路径
import os
os.remove('tst.py')
#绝对路径
import os
os.remove(r'C:\Users\轻烟\PycharmProjects\untitled1\venv\tst.py')
获取文件信息:
#语法:
os.stat() 获取文件相关信息
#例子:
import os
file = os.stat('test.py')
print(os.path.abspath('test.py'))#先访问路径
print(file.st_dev)#设备号
print(file.st_size)#文件大小
print(file.st_atime)#最后一次访问
print(file.st_mtime)#最后一次修改时间
模块导入:
方法:
import 模块名
form 模块名 import 模块/类/函数/变量/*(全部导入)
import 模块名 as 别名
form 模块名 import 模块/类/函数/变量/*(全部导入) as 别名
GUI编程:
含义:
图形用户界面,又称图形用户接口,简称GUI
是指采用图形方式显示的计算机操作用户界面
常用的GUI模块:
模块名 | 说明 |
Tkinker | Tkinter是一种标准的接口,这个模块存在于Python内部中供我们使用,它是一个轻量级的跨平台工具 |
wxPython | wxPython是一种较为流行的GUI模块 |
Flexx | 倾向于web方面的模块 |
Kivy | Kivy是开源Python函式库,用于开发行动应用程序和其它采用自然用户界面的多点触控应用软件 |
PyQt | PyQt 是 KDE 的底层 GUI 库的 Python 封装 |
PyGTK | PyGTK 是 Gnome 的底层 GUI 库 GTK+ 的 Python 封装 |
最常用的:
模块名 | 说明 | 下载 |
Tkinker | Tkinter是一种标准的接口,这个模块存在于Python内部中供我们使用,它是一个轻量级的跨平台工具 | 内置,无序安装 |
wxPython | wxPython是一种较为流行的GUI模块 | pip - - default - timeout = 100 install - U wxPython |
注意:python一定要使用3.9版本以及以下版本
下载时间很长,建议这个时间追个剧或者刷个视频
下载wxPython成功 :
黄色内容是提示你要更新pip,不是报错信息
python -m pip install --upgrade pip 更新pip即可
Tkinter模块:
常用控件:
常用控件 | 控件作用 |
Button | 按钮,点击触发事件 |
Canvas | 画布,即GUI界面的大小 |
Tk | 创建应用程序主窗口 |
Checkbutton | 可选择的多个按钮 |
Entry | 输入框 |
Frame | 窗口,可承载其他控件 |
Label | 标签,可显示文字或者图片 |
Listbox | 列表框,可从列表框中选择一个 |
Menu | 菜单栏,可以选择一个 |
Menubutton | 菜单按钮 |
Message | 消息文本框 |
Radiobutton | 单选按钮 |
Scale | 滑动条 |
Scrollbar | 滚动条 |
Text | 文本供使用者输入信息 |
Toplevel | 创建一个弹出式窗口 |
创建窗口:
#语法:
window = tkinter.Tk()
window.mainloop() #启动窗口
#例子:
import tkinter
window = tkinter.Tk()
window.minsize(366, 366) #设置最小尺寸
window.maxsize(566, 566) #设置最大尺寸
window.mainloop()
Label控件:
#语法
组件名 = tkinter.Label(放置的窗口,文本或图片,附加内容)
组件名.pack(side = ‘位置’)
side取值:
不设置 默认设置,居中对齐
left 左对齐
right 右对齐
top 上对齐
bottom 下对齐
import tkinter
def main():
win = tkinter.Tk()
win.minsize(366, 366)#最小尺寸
win.maxsize(888, 888)#最大尺寸
area_one = tkinter.Label(win,text='This is area_one',font=("华文行楷", 20), fg="red")
area_one.pack(side = 'left')
area_two = tkinter.Label(win,text='This is area_two',font=("黑体", 20), fg="blue")
area_two.pack(side = 'right')
area_three = tkinter.Label(win,text='This is area_three',font=("宋体", 20), fg="black")
area_three.pack()
win.mainloop()
if __name__ == '__main__':
main()
Frame控件:
#作用:可在窗口内存放管理控件的容器
side取值:
不设置 默认设置,居中对齐
left 左对齐
right 右对齐
top 上对齐
bottom 下对齐
import tkinter
def main():
win = tkinter.Tk()
win.minsize(366, 366)#最小尺寸
win.maxsize(888, 888)#最大尺寸
frame_one = tkinter.Frame(win)#使用Frame控件
area_one = tkinter.Label(frame_one,text = 'dotcpp',font = ("华文行楷", 20), fg="red")
area_one.pack(side = 'top')#放在上边
area_two = tkinter.Label(frame_one,text = 'Python',font = ("黑体", 20), fg="blue")
area_two.pack(side = 'bottom')#放在下面
frame_one.pack(side = 'left')#放在左边
#分界线 上面为左边的容器,下面为右边的容器
frame_two = tkinter.Frame(win)
area_one = tkinter.Label(frame_two,text = 'dotcpp',font = ("华文行楷", 20), fg = "red")
area_one.pack(side = 'top')#放在上面
area_two = tkinter.Label(frame_two,text = 'Python',font = ("黑体", 20), fg = "blue")
area_two.pack(side = 'bottom')#放在下面
frame_two.pack(side = 'right')#放在右边
win.mainloop()
if __name__ == '__main__':
main()
Button控件:
import tkinter
import tkinter.messagebox
win = tkinter.Tk()
win.minsize(166, 40) # 最小尺寸
def button_event():
tkinter.messagebox.showinfo("Button事件", "学习很快乐!!!!!!!!!!")
button_one = tkinter.Button(win, text = "www.dotcpp.com", command = button_event)
button_one.pack()
win.mainloop()
Entry控件:
#语法:
my_entry = Entry(容器,可选项) 在键盘输入的文本信息
容器:内容存放位置
可选项:如下表
可选项样式 | 作用 |
bg和bd | 背景颜色和边框大小 |
cursor | 光标的形状 |
font | 文本字体 |
exportselection | 文本框内容是否复制功能 |
fg | 文字颜色 |
highlightcolor | 边框高亮的颜色 |
justify | 对齐方式 |
relief | 边框样式 |
selectbackground | 选择的文本背景颜色 |
selectborderwidth | 选择的文本背景边框宽度 |
selectforeground | 选择的文字颜色 |
state | 只读或可写控制 |
textvariable | 文本框的值 |
width | 文本框宽度 |
xscrollcommand | 水平方向滚动条 |
常用方法:
常用方法 | 作用 |
delete(first,last=None) | 删除first-last中的所有内容 delete(0,END)删除输入框所有内容 |
get() | 获取输入框内的所有内容 |
icursor(index) | 移动光标到index参数的位置 |
index(index) | 返回index参数对应的序号 |
insert(index, text) | 把text参数中的内容插入到索引为index的位置 |
Select_clear() | 清空文本框 |
xview(index) | 设置文本框链接的水平滚动条 |
#例子
import tkinter as tk
import tkinter.messagebox
win = tk.Tk()
frame_name = tk.Frame(win)#创建容器来存放登陆的Label(文本框)与Entry(输入框)
frame_name.pack(side="top")#使该容器在页面的顶部
label_name = tk.Label(frame_name, text="Your Name : ")
label_name.pack(side="left")
entry_name = tk.Entry(frame_name, bd=5)
entry_name.pack(side="right")#在容器内创建Label与Entry,并使label在左,entry在右
# 下面的同理:
frame_password = tk.Frame(win)
frame_password.pack()
label_password = tk.Label(frame_password, text="Your Password : ")
label_password.pack(side="left")
entry_password = tk.Entry(frame_password, bd=5)
entry_password.pack(side="right")
def login():
if entry_name.get() == "ll":
if entry_password.get() == "lll":
print(tkinter.messagebox.showinfo("login", "Success!"))
else:
print(tkinter.messagebox.showerror("login", "Failed!"))
entry_name.delete(0, "end")
entry_password.delete(0,"end")
else:
print(tkinter.messagebox.showerror("login", "Failed!"))
entry_name.delete(0, "end")
entry_password.delete(0,"end")
def signin():
print(tkinter.messagebox.showerror("signin", "Without Code!"))#必须先定义函数,否则点击按钮调用函数时会报函数不存在的错误
frame_button = tk.Frame(win)#创建容器以存放按钮
frame_button.pack(side="bottom")#使该容器位于页面最下方
button_login = tk.Button(
frame_button,
text="login",
activeforeground="red",
activebackground="yellow",
width="7",
command=login
# command的意思是执行已定义的函数,不可执行下文中出现的函数(未定义的函数)
)
button_login.pack(side="left")
# 下面的同理:
button_signin = tk.Button(
frame_button,
text="signin",
activeforeground="blue",
activebackground="pink",
width="7",
command=signin,
)
button_signin.pack(side="right")
win.mainloop()
Radio控件:
import tkinter
win = tkinter.Tk()
win.title("Python教程")#给窗口取一个标题
win.minsize(366, 50) # 定义一个最小尺寸
def get_data():
print('选择的为第%d项'%x.get())
x = tkinter.IntVar()# 在这里我们把一组单选框绑定为同一个变量
radio_one = tkinter.Radiobutton(win, text="选项1", value=1, variable=x,
command=get_data)
radio_one.pack()
radio_two = tkinter.Radiobutton(win, text="选项2", value=2, variable=x,
command=get_data)
radio_two.pack()
win.mainloop()
Check控件:
import tkinter
win = tkinter.Tk()
win.title("Python教程")
win.minsize(200,200)
def get_data():
my_str = ''
if x.get() == True:
my_str += "已选择选项1\n"
if y.get() == True:
my_str += "已选择选项2\n"
if z.get() == True:
my_str += "已选择选项3\n"
text.delete(0.0, tkinter.END) # 清除text文板框中的内容
text.insert(tkinter.INSERT, my_str) #把上面的信息插入到文本框中
x = tkinter.BooleanVar()
ckbutton_one = tkinter.Checkbutton(win, text="选项1", variable=x,
command=get_data)
ckbutton_one.pack()
y = tkinter.BooleanVar()
ckbutton_two = tkinter.Checkbutton(win, text="选项2", variable=y,
command=get_data)
ckbutton_two.pack()
z = tkinter.BooleanVar()
ckbutton_three = tkinter.Checkbutton(win, text="选项3", variable=z,
command=get_data)
ckbutton_three.pack()
text = tkinter.Text(win, width=50, height=5)
text.pack()
win.mainloop()
Canvas控件:
#语法:
my_canvas = Canvas ( 父类, 可选项 )
父类 一层窗口名,
可选项 有bd、bg、continue、cursor、height、width、highlightcolor、relief、scrollregion
绘制图形的方法:
- create_line − 创建线条
#语法:
canvas.create_line(x1, y1, x2, y2, ..., xn, yn, options)
左上角 右下角的坐标(x1,y1)(x2,y2)
#例子:
import tkinter
class TK:
def __init__(self):
self.window = tkinter.Tk()
self.canvas = tkinter.Canvas(self.window,width = 300,height = 300,bg = 'pink')
self.canvas.create_line(30,30,100,200,200,200,300,200,300,300)
self.canvas.pack()
tkinter.mainloop()
m = TK()
-
create_rectangle − 创建矩形
#语法:
canvas.create_rectangle(x1,y1,x2,y2,可选项)
左上角 右下角的坐标(x1,y1)(x2,y2)
#例子:
import tkinter
class TK:
def __init__(self):
self.window = tkinter.Tk()
self.canvas = tkinter.Canvas(self.window,width = 300,height = 300,bg = 'pink')
self.canvas.create_rectangle(100,100,200,200)
self.canvas.pack()
tkinter.mainloop()
m = TK()
-
create_oval − 创建椭圆
#语法
canvas.create.oval(x1,y1,x2,y2,可选项)
左上角 右下角的坐标(x1,y1)(x2,y2)
-
create_arc − 创建弧形
#语法:
canvas.create_arc(x1,y1,x2,y2,start = angle,extent = width,可选项)
左上角 右下角的坐标(x1,y1)(x2,y2)
start 弧形的起始角度
extent 弧形逆时针角度范围
#例子:
import tkinter
class TK:
def __init__(self):
self.window = tkinter.Tk()
self.canvas = tkinter.Canvas(self.window,width = 300,height = 300,bg = 'pink')
self.canvas.create_arc(60,60,220,220,start =0,extent = 120,fill ='blue')
self.canvas.pack()
tkinter.mainloop()
m = TK()
-
create_polygon − 创建多边形
#语法:
canvas.create_polygon(x1,y1,x2,y2,.....xn,yn,可选项)
#例子:
import tkinter
class TK:
def __init__(self):
self.window = tkinter.Tk()
self.canvas = tkinter.Canvas(self.window,width = 300,height = 300,bg = 'pink')
self.canvas.create_polygon(150,0,200,100,300,100,200,185,280,280,150,230,20,280,100,185,
0,100,100,100,fill ='red')
self.canvas.pack()
tkinter.mainloop()
m = TK()
wxPython模块:
基础:
#OnInit() 初始化这个子类
#Frame框架 容器,存放主程序的标题和功能
wx.Frame(parent,id=-1,title=’’,style=’’,name=’’,pos=wx.DefaultPositon,size=wx.DefaultSize)
parent 框架所处的位置,父窗口的名字,顶级窗口:None,
id 新窗口的ID号,通常设置为-1,
title 窗口名称
size 窗口大小
style 窗口的类型
name 框架的内部名字
pos 对象,指定新窗口在界面中的位置
Default 默认参数
import wx
class App(wx.App):
def OnInit(self):
window = wx.Frame(parent = None,title = '初始化')
window.Show()
return True
if __name__ == '__main__':
app = App()
app.MainLoop()
文本控件:
静态文本控件:
#静态文本:屏幕显示的静态文字
#语法:
wx.StaticText(parent,id,label=’’,pos=wx.DefaultPositon,size=wx.DefaultSize,style=’’,name=’’)
style取值:
wx.ALIGN_CENTER 静态文本位于静态文本控件的中心
wx.ALIGN_LEFT 文本在窗口部件中左对齐。这是默认的样式
wx.ALIGN_RIGHT 文本在窗口部件中右对齐
wx.ST_NO_AUTORESIZE 使用这个样式,在使用SetLabel()改变文本之后,静态文本控件不
将自我调整尺寸
#修饰文本信息
wx.Font(pointSize,fimily,style,weight,underline=True,faceName=’’,encoding=wx.FONTENCODING_DEFAULT)
pointSize 字体的尺寸
family 字体的名字
style 倾斜
weight 宽度
underline 下划线,True有,False为无
faceName 字体名
encoding 编码方式
#例子:
import wx
class Frame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY,"静态文本", size =(200, 170))
panel = wx.Panel(self, -1) #创建一个容器
wx.StaticText(panel, wx.ID_ANY, "春夜喜雨 ——杜甫。", (0, 10),(145, -1),wx.ALIGN_RIGHT)
text = wx.StaticText(panel, wx.ID_ANY, "好雨知时节,当春乃发生。", (0, 30),(160, -1),wx.ALIGN_RIGHT)
text = wx.StaticText(panel, wx.ID_ANY, "随风潜入夜,润物细无声。", (0,50), (160, -1),wx.ALIGN_RIGHT)
text =wx.StaticText(panel, wx.ID_ANY, "野径云俱黑,江船火独明。", (0,70),(160, -1),wx.ALIGN_RIGHT)
text =wx.StaticText(panel, wx.ID_ANY, "晓看红湿处,花重锦官城。", (0,90),(160, -1),wx.ALIGN_RIGHT)
if __name__ == '__main__':
app = wx.App()
frame = Frame()
frame.Show(True)
app.MainLoop()
文本输入控件:
#语法:
wx.TextCtrl(parent,id,value=’’,pos=wx.DefaultPositon,size=wx.DefaultSize,style,validator=wx.DefaultValidator,name=’’)
validator 过滤数据
style取值:
wx.TE_CENTER 控件中的文本居中
wx.TE_LEFT 控件中的文本左对齐。
wx.TE_NOHIDESEL 文本始终高亮显示,只适用于Windows
wx.TE_PASSWORD 不显示所键入的文本,代替以星号显示
wx.TE_PROCESS_ENTER 使用该样式,用户在控件内按下回车键时,一个文本输入事件被触发
否则,按键事件内在的由该文本控件或该对话框管理
wx.TE_PROCESS_TAB 指定该样式,通常的字符事件在Tab键按下时创建
否则,Tab由对话框来管理,通常是控件键的切换
wx.TE_READONLY 文本控件为只读,用户不能修改其中的文本。
wx.TE_RIGHT 控件中的文本右对齐
#例子:
import wx
class Frame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY,"登陆", size =(300, 300))
panel = wx.Panel(self, -1)
wx.StaticText(panel, wx.ID_ANY, "登录界面", (0, 10),(150, -1),wx.ALIGN_RIGHT)
text = wx.StaticText(panel, wx.ID_ANY, "账户", (0, 50),(80, -1),wx.ALIGN_RIGHT)
text = wx.StaticText(panel, wx.ID_ANY, "密码", (0, 90),(80, -1),wx.ALIGN_RIGHT)
text = wx.TextCtrl(panel, wx.ID_ANY, "", (100,50),(100, 20),wx.ALIGN_LEFT)
text = wx.TextCtrl(panel, wx.ID_ANY, "", (100,90),(100, 20),wx.TE_PASSWORD)
if __name__ == '__main__':
app = wx.App()
frame = Frame()
frame.Show(True)
app.MainLoop()
按钮控件:
#语法:
wx.Button(parent,id,label,pos,size,style,validator,name)
#例子:
import wx
class Frame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY,"登陆", size =(300, 250))
panel = wx.Panel(self, -1)
wx.StaticText(panel, wx.ID_ANY, "登录界面", (0, 10),(150, -1),wx.ALIGN_RIGHT)
self.text = wx.StaticText(panel, wx.ID_ANY, "账户", (0, 50),(80, -1),wx.ALIGN_RIGHT)
self.text = wx.StaticText(panel, wx.ID_ANY, "密码", (0, 90),(80, -1),wx.ALIGN_RIGHT)
self.text = wx.TextCtrl(panel, wx.ID_ANY, "", (100,50),(100, 20),wx.ALIGN_LEFT)
self.text = wx.TextCtrl(panel, wx.ID_ANY, "", (100,90), (100, 20), wx.ALIGN_LEFT)
self.button = wx.Button(panel, wx.ID_ANY, "登陆", (70,120),(50, 20),wx.ALIGN_LEFT)
self.button = wx.Button(panel, wx.ID_ANY, "注册", (140,120), (50, 20), wx.ALIGN_LEFT)
if __name__ == '__main__':
app = wx.App()
frame = Frame()
frame.Show(True)
app.MainLoop()
复选框控件:
import wx
class Frame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY,"复选框", size =(300, 250))
panel = wx.Panel(self, -1)
self.box = wx.CheckBox(panel, -1, "Checkbox1", pos=(50, 50), size=(80, 20)) # 创建控件
self.box = wx.CheckBox(panel, -1, "Checkbox2", pos=(50, 70), size=(80, 20)) # 创建控件
self.box = wx.CheckBox(panel, -1, "Checkbox3", pos=(50, 90), size=(80, 20)) # 创建控件
if __name__ == '__main__':
app = wx.App()
frame = Frame()
frame.Show(True)
app.MainLoop()
单选框控件:
import wx
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "选择一种喜欢的运动方式", size=(300, 100))
panel = wx.Panel(self)
wx.StaticText(panel, wx.ID_ANY, "选择一种喜欢的运动方式", (0, 10), (200, -1), wx.ALIGN_RIGHT)
self.check1 = wx.RadioButton(panel, -1, "打篮球", pos=(60, 40), size=(50, 20), style=wx.RB_GROUP)
self.check2 = wx.RadioButton(panel, -1, "打乒乓球", pos=(130, 40), size=(50, 20))
self.check3 = wx.RadioButton(panel, -1, "跑步", pos=(200, 40), size=(50, 20))
if __name__ == "__main__":
app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop(
布局方法:
绝对布局:
固定位置,窗口大小变化,不会影响控件的位置
Sizer管理布局:
分类:Sizer、WrapSizer、BoxSizer、GridSizer、FlexGridSizer、GridBagSizer和 StaticBoxSzer、StdDialogButtonSizer
BoxSizer布局:
BoxSizer布局排布方式垂直或水平,一般是在创建的时候指定布局的方向
my_box = wx.BoxSizer(wx.HORIZINTAL) #水平布局,括号为空默认是水平布局
My_box = wx.BoxSizer(wx.VERTICAL) #垂直布局
#添加控件:
Add(parent,proportion=0,flag=0,border=0,userData=None)
#添加到父窗口
Add(AnotherSizer,proportion=0,flag=0,border=0,userData=None)
#添加到另一个布局,创建了新的空间
Add(AnotherSizer,proportion=0,flag=0,border=0,userData=None)
flag:
flag:对齐、边框和尺寸参数
对齐标志 | 作用 |
ALIGN_TOP | 顶对齐 |
wx.ALIGN_LEFT | 左对齐 |
wx.ALIGN_BOTTOM | 底对齐 |
wx.ALIGN_RIGHT | 右对齐 |
wx.ALIGN_CENTER | 居中对齐 |
wx.ALIGN_CENTER_VERTIAL | 垂直居中对齐 |
wx.ALIGN_CENTER_HORIZONTAL | 水平居中对齐 |
边框标志 | 作用 |
wx.TOP | 设置有顶部边框,边框的宽度需要通过Add()方法的border参数设置 |
wx.BOTTOM | 设置有底部边框 |
wx.LEFT | 设置有左边框 |
wx.RIGHT | 设置有右边框 |
wx.ALL | 设置4面全有边框 |
尺寸标志 | 作用 |
wx.EXPAND | 调整子窗口(或控件)完全填满有效空间 |
wx.SHAPED | 调整子窗口(或控件)填充有效空间,但保存高宽比 |
wx.FIXED_MINSIZE | 调整子窗口(或控件)为最小尺寸 |
wx.RESERVE_SPACE_EVEN_IF_HIDDEN | 设置此标志后,子窗口(或控件)如果被隐藏,所占空间保留 |
#例子:
import wx
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "登录界面", size=(300, 300))
panel = wx.Panel(self)#创建一个画布,然后创建功能区并放到画布上
self.title = wx.StaticText(panel,label = '登陆界面')
self.username = wx.StaticText(panel,label = '用户:')
self.user_name = wx.TextCtrl(panel,style = wx.TE_LEFT)
self.userpassword = wx.StaticText(panel,label = '密码:')
self.user_password = wx.TextCtrl(panel,style = wx.TE_PASSWORD)
self.button_login = wx.Button(panel,label = '登陆')
self.button_register = wx.Button(panel,label = '注册')
container_one = wx.BoxSizer(wx.HORIZONTAL) # 创建一个box容器并控制水平排列
container_one.Add(self.username,proportion = 0,flag = wx.ALL,border = 7)
container_one.Add(self.user_name,proportion = 1,flag = wx.ALL,border = 7)
container_two = wx.BoxSizer(wx.HORIZONTAL) # 创建一个box容器并控制水平排列
container_two.Add(self.userpassword,proportion = 0,flag = wx.ALL,border = 7)
container_two.Add(self.user_password,proportion = 1,flag = wx.ALL,border = 7)
container_three = wx.BoxSizer(wx.HORIZONTAL) # 创建一个box容器并控制水平排列
container_three.Add(self.button_login,proportion = 0,flag = wx.ALIGN_CENTER,border = 4)
container_three.Add(self.button_register,proportion =0,flag = wx.ALIGN_CENTER,border = 4)
sizers = wx.BoxSizer(wx.VERTICAL)
sizers.Add(self.title,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=10)
sizers.Add(container_one,proportion = 0,flag =wx.EXPAND|wx.LEFT|wx.RIGHT,border=40)
sizers.Add(container_two, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=40)
sizers.Add(container_three, proportion=0, flag=wx.ALIGN_CENTER|wx.TOP, border=10)
panel.SetSizer(sizers)
if __name__ == "__main__":
app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop()
事件管理:
事件:用户执行的动作,分为点击和松开
#事件绑定:
Button_login.Bind(wx.EVT_BUTTON,OnclickEventName)
wx.EVT_BUTTON 事件类型选择了按钮类型
OnclickEventName 点击按钮时执行的方法名
#例子:
import wx
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "登录界面", size=(300, 300))
panel = wx.Panel(self)#创建一个画布,然后创建功能区并放到画布上
self.title = wx.StaticText(panel,label = '登陆界面')
self.username = wx.StaticText(panel,label = '用户:')
self.user_name = wx.TextCtrl(panel,style = wx.TE_LEFT)
self.userpassword = wx.StaticText(panel,label = '密码:')
self.user_password = wx.TextCtrl(panel,style = wx.TE_PASSWORD)
self.button_login = wx.Button(panel,label = '登陆')
self.button_login.Bind(wx.EVT_BUTTON,self.OnclickEventname)
...和上一节一致,在这里省略....
def OnclickEventname(self,event):
ms = ''
urnm = self.user_name.GetValue()
pwd = self.user_password.GetValue()
if urnm == '' or pwd == '':
ms = '用户或密码不能为空'
elif urnm == 'qy' and pwd == '123456':
ms = '登陆成功'
else:
ms = '用户或密码错误'
wx.MessageBox(ms)
if __name__ == "__main__":
app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop()
下拉菜单:
#
wx.ComboBox 文本框,选择框内容不固定的
wx.Choice 选择框内容固定的
select_one = wx.ComboBox(panel, -1, value='足球', choices=sports, style=wx.CB_SORT)
select_two = wx.Choice(panel, -1, choices=phones, style=wx.CB_SORT)
import wx
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "下拉列表", size=(300, 300))
self.Centre()
panel = wx.Panel(self)#创建一个容器
box_one = wx.BoxSizer(wx.HORIZONTAL)
text_one = wx.StaticText(panel,label='你喜欢的运动为:')
sports = ['篮球','足球','排球']
select_one = wx.ComboBox(panel,-1,value = '足球',choices = sports,style = wx.CB_SORT)
box_one.Add(text_one,1,flag=wx.LEFT|wx.RIGHT|wx.FIXED_MINSIZE,border = 7)
box_one.Add(select_one,1,flag = wx.ALL|wx.FIXED_MINSIZE)
box_two = wx.BoxSizer(wx.HORIZONTAL)
text_two = wx.StaticText(panel,label='你喜欢的手机品牌为:')
phones = ['小米','华为','苹果']
select_two = wx.Choice(panel,-1,choices = phones,style = wx.CB_SORT)
box_two.Add(text_two,1,flag=wx.LEFT|wx.RIGHT|wx.FIXED_MINSIZE,border = 7)
box_two.Add(select_two,1,flag = wx.ALL|wx.FIXED_MINSIZE)
bbox = wx.BoxSizer(wx.VERTICAL)
bbox.Add(box_one,1,flag = wx.ALL|wx.EXPAND,border = 7)
bbox.Add(box_two, 1, flag=wx.ALL | wx.EXPAND, border=7)
panel.SetSizer(bbox)
if __name__ == "__main__":
app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop()
菜单:
menuBar = wx.MenuBar() 创建一个菜单栏
fileMenu = wx.Menu() 创建菜单
newItem = wx.MenuItem() 创建菜单项
fileMenu.AppendItem(newItem) 添加菜单项到菜单中
menuBar.Append(fileMenu, title = "File")添加菜单到菜单栏
self.SetMenuBar(menuBar) 把菜单栏设置为界面的菜单栏
self.Bind(wx.EVT_MENT, self.menuHandler)绑定菜单事件
#例子:
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title="wxPython", size=(400, 300))
self.Center()
self.text = wx.TextCtrl(self, -1, style=wx.TE_MULTILINE)
vbox = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(vbox)
vbox.Add(self.text, 1, flag=wx.EXPAND | wx.ALL, border=1)
menubar = wx.MenuBar()#对应步骤1
self.SetMenuBar(menubar)
file_menu = wx.Menu()#对应步骤2
menubar.Append(file_menu, '菜单')#对应步骤4
file_menu.Append(id=wx.ID_NEW, item='新建', helpString='new file')
file_menu.AppendSeparator()
edit_menu = wx.Menu()
file_menu.AppendSubMenu(edit_menu, "编辑")
copy_item = wx.MenuItem(edit_menu, 100, text="复制", kind=wx.ITEM_NORMAL)#对应步骤3
edit_menu.Append(copy_item)
cut_item = wx.MenuItem(edit_menu, 101, text="剪切", kind=wx.ITEM_NORMAL)
edit_menu.Append(cut_item)
paste_item = wx.MenuItem(edit_menu, 102, text="粘贴", kind=wx.ITEM_NORMAL)
edit_menu.Append(paste_item)
if __name__ == "__main__":
app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop()