Python简单的GUI程序示例详解
作者:软件开发技术爱好者软件开发技术爱好者 发布时间:2021-04-10 20:17:16
标签:Python,GUI,程序
一、记事本
源码
#python简易记事本
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
import os
filename='' #文件名,全局变量
def about():
messagebox.showinfo('提示','这是一个消息框')
def openFile():
global filename #使用全局变量
filename=filedialog.askopenfilename(defaultextension='.txt') #打开文件,默认扩展名是xtxt
if filename=='': #如果没有选择
filename=None
else:
root.title('FileName:'+os.path.basename(filename)) #将文件名显示在标题栏中
textPad.delete(1.0,END) #删除文本框中原有内容
f=open(filename,'r',encoding='UTF-8') #获取文件中内容
textPad.insert(1.0,f.read()) #显示到文本框
f.close()
def saveOtherFile():
global filename
f=filedialog.asksaveasfilename(initialfile='未命名.txt',defaultextension='.txt') #保存文件
filename=f
root.title('FileName:' + os.path.basename(filename))
fh=open(f,'w',encoding='UTF-8') #只写方式打开文件
msg=textPad.get(1.0,END) #从文本框中获取内容
fh.write(msg)
fh.close()
root=Tk() #设置菜单栏
root.title('记事本')
root.geometry('500x500+100+100') #widthxheight+x+y
menubar=Menu(root)
root.config(menu=menubar)
filemenu=Menu(menubar) #第一个菜单栏
filemenu.add_command(label='打开',accelerator='Ctrl+N',command=openFile)
filemenu.add_command(label='保存',accelerator='Ctrl+T',command=saveOtherFile)
menubar.add_cascade(label='文件',menu=filemenu)
aboutmenu=Menu(menubar)
aboutmenu.add_command(label='关于',accelerator='Ctrl+Y',command=about)
menubar.add_cascade(label='帮助',menu=aboutmenu)
status=Label(root,text='Ln20',bd=1,relief=SUNKEN,anchor=W) #底部状态栏
status.pack(side=BOTTOM,fill=X)
lnlabel=Label(root,width=2,bg='antique white') #左边边界栏
lnlabel.pack(side=LEFT,fill=Y)
textPad=Text(root,undo=True) #设置文本框
textPad.pack(expand=YES,fill=BOTH)
scroll=Scrollbar(textPad) #右边进度条栏
textPad.config(yscrollcommand=scroll.set)
scroll.config(command=textPad.yview)
scroll.pack(side=RIGHT,fill=Y)
root.mainloop()#python简易记事本
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
import os
filename='' #文件名,全局变量
def about():
messagebox.showinfo('提示','这是一个消息框')
def openFile():
global filename #使用全局变量
filename=filedialog.askopenfilename(defaultextension='.txt') #打开文件,默认扩展名是xtxt
if filename=='': #如果没有选择
filename=None
else:
root.title('FileName:'+os.path.basename(filename)) #将文件名显示在标题栏中
textPad.delete(1.0,END) #删除文本框中原有内容
f=open(filename,'r',encoding='UTF-8') #获取文件中内容
textPad.insert(1.0,f.read()) #显示到文本框
f.close()
def saveOtherFile():
global filename
f=filedialog.asksaveasfilename(initialfile='未命名.txt',defaultextension='.txt') #保存文件
filename=f
root.title('FileName:' + os.path.basename(filename))
fh=open(f,'w',encoding='UTF-8') #只写方式打开文件
msg=textPad.get(1.0,END) #从文本框中获取内容
fh.write(msg)
fh.close()
root=Tk() #设置菜单栏
root.title('记事本')
root.geometry('500x500+100+100') #widthxheight+x+y
menubar=Menu(root)
root.config(menu=menubar)
filemenu=Menu(menubar) #第一个菜单栏
filemenu.add_command(label='打开',accelerator='Ctrl+N',command=openFile)
filemenu.add_command(label='保存',accelerator='Ctrl+T',command=saveOtherFile)
menubar.add_cascade(label='文件',menu=filemenu)
aboutmenu=Menu(menubar)
aboutmenu.add_command(label='关于',accelerator='Ctrl+Y',command=about)
menubar.add_cascade(label='帮助',menu=aboutmenu)
status=Label(root,text='Ln20',bd=1,relief=SUNKEN,anchor=W) #底部状态栏
status.pack(side=BOTTOM,fill=X)
lnlabel=Label(root,width=2,bg='antique white') #左边边界栏
lnlabel.pack(side=LEFT,fill=Y)
textPad=Text(root,undo=True) #设置文本框
textPad.pack(expand=YES,fill=BOTH)
scroll=Scrollbar(textPad) #右边进度条栏
textPad.config(yscrollcommand=scroll.set)
scroll.config(command=textPad.yview)
scroll.pack(side=RIGHT,fill=Y)
root.mainloop()
运行效果:
二、简单画图
# 画图程序
import os
import tkinter
import tkinter.simpledialog
import tkinter.colorchooser
import tkinter.filedialog
from PIL import Image
from PIL import ImageGrab
def openItem():
global img
filename=tkinter.filedialog.askopenfilename(title="Open",filetypes=[('Image','*.png *.gif')])
if filename:
img=tkinter.PhotoImage(file=filename)
canvas.create_image(400,300,image=img)
def saveItem():
saveX=int(root.winfo_rootx())
saveY=int(root.winfo_rooty())
saveW=root.winfo_width()
saveH=root.winfo_height()
im=ImageGrab.grab((saveX,saveY,saveX+saveW,saveY+saveH))
filename=tkinter.filedialog.asksaveasfilename(title='Save',filetypes=[('Image','*.png *.gif')])
if not filename:
return
try:
if filename[filename.index('.'):] in ['.png','.gif']==False:
filename+='.png'
except:
filename+='.png'
im.save(filename)
def clearItem():
for i in canvas.find_all():
canvas.delete(i)
def curveType():
penType.set(1)
def lineType():
penType.set(2)
def rectangleType():
penType.set(3)
def textType():
global userText
userText=tkinter.simpledialog.askstring(title="Please input your words", prompt='')
penType.set(4)
def eraseType():
penType.set(5)
def chooseForeColor():
global foreColor
foreColor=tkinter.colorchooser.askcolor()[1]
def chooseBackColor():
global backColor
backColor=tkinter.colorchooser.askcolor()[1]
def onClickLeft(event):
global userText
canDraw.set(1)
X.set(event.x)
Y.set(event.y)
if penType.get()==4:
canvas.create_text(event.x,event.y,text=userText)
def onMoveLeft(event):
global lastPaint,foreColor,backColor
if canDraw.get()==0:
return
if penType.get()==1: #绘制曲线
canvas.create_line(X.get(),Y.get(),event.x,event.y,fill=foreColor)
X.set(event.x)
Y.set(event.y)
elif penType.get()==2: #绘制直线(预览)
try:
canvas.delete(lastPaint)
except:
pass
lastPaint=canvas.create_line(X.get(),Y.get(),event.x,event.y,fill=foreColor)
elif penType.get()==3: #绘制矩形(预览)
try:
canvas.delete(lastPaint)
except:
pass
lastPaint=canvas.create_rectangle(X.get(),Y.get(),event.x,event.y,fill=backColor,outline=foreColor)
elif penType.get()==5: #橡皮擦
canvas.create_rectangle(event.x-5,event.y-5,event.x+5,event.y+5,fill=backColor,outline=backColor)
def onReleaseLeft(event):
global lastPaint,foreColor,backColor
lastPaint=0
if penType.get()==2: #抬起左键画直线
canvas.create_line(X.get(),Y.get(),event.x,event.y,fill=foreColor)
elif penType.get()==3: #抬起左键就画矩形
canvas.create_rectangle(X.get(),Y.get(),event.x,event.y,fill=backColor,outline=foreColor)
canDraw.set(0)
def onReleaseRight(event):
menu.post(event.x_root, event.y_root)
root=tkinter.Tk()
root.title("Paint")
root.geometry("800x600+280+50")
lastPaint=0
userText=""
foreColor='black'
backColor='white'
X=tkinter.IntVar(value=0)
Y=tkinter.IntVar(value=0)
canDraw=tkinter.IntVar(value=0) #能否画图,1:能,0:不能
penType=tkinter.IntVar(value=1) #画笔类型,1:曲线,2:直线,3:矩形,4:文本,5:橡皮擦
menu=tkinter.Menu(root,tearoff=0)
subMenu=tkinter.Menu(menu,tearoff=0)
img=tkinter.PhotoImage()
canvas=tkinter.Canvas(root,bg='white',width=800,height=600)
canvas.create_image(800,600,image=img)
menu.add_command(label='Open',command=openItem)
menu.add_command(label='Save as',command=saveItem)
menu.add_separator()
subMenu.add_command(label='Curve',command=curveType)
subMenu.add_command(label='Line',command=lineType)
subMenu.add_command(label='Rectangle',command=rectangleType)
subMenu.add_command(label='Text',command=textType)
subMenu.add_command(label='Erase',command=eraseType)
menu.add_cascade(label='Pen Type',menu=subMenu)
menu.add_separator()
menu.add_command(label='Foreground Color',command=chooseForeColor)
menu.add_command(label='Bakckground Color',command=chooseBackColor)
menu.add_separator()
menu.add_command(label='Clear',command=clearItem)
canvas.bind('<Button-1>', onClickLeft)
canvas.bind('<B1-Motion>',onMoveLeft)
canvas.bind('<ButtonRelease-1>',onReleaseLeft)
canvas.bind('<ButtonRelease-3>',onReleaseRight)
canvas.pack(fill=tkinter.BOTH,expand=tkinter.YES)
root.mainloop()
运行效果:
来源:https://blog.csdn.net/cnds123/article/details/122903311


猜你喜欢
- 一、ini文件介绍INI文件格式是某些平台或软件上的配置文件的非正式标准,以节(section)和键(key)构成,常用于微软Windows
- 保存文件名太长OSError: [Errno 36] File name too lon问题描述安装pip install python-d
- 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字
- 现在的离线浏览器很多,可是多数都是共享软件,或是英文软件,这给我们的操作带来了很大的不便。其实微软的网页制作工具FrontPage XP有一
- 以前写代码时,都是直接将程序绑定到唯一端口提供http/https服务,在外层通过反向代理(nginx/caddy)来实现http和http
- 代码如下:--Begin Index(索引) 分析优化的相关 Sql -- 返回当前数据库所有碎片率大于25%的索引 -- 运行
- 传递函数创建传递函数有两种方式:import control as ctrl# 方式 1s = ctrl.tf('s')sy
- Python程序的注释感觉很不合群,对于习惯了使用/**/多行注释的人来说,到Python中只能使用#号进行单行注释很痛苦。# 这里是单行注
- 一、匹配目标文件中所有以https?://开头,以.jpg|.png|.jpeg结尾的字符串二、尝试过程1) &n
- 这篇文章主要介绍了python被修饰的函数消失问题解决(基于wraps函数),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 导言:当向类型化的数据集(Typed DataSet)添加一个TableAdapter时,相应的DataTable的构架已经由TableAd
- 遇到一个很实际的问题:由于不想增加目录的深度,减少磁盘寻址的时间,需要减少一些目录层级。大家都知道建立文件夹是为了让文件管理更加的方便,现在
- os.Rename()这个函数的原型是func Rename(oldname, newname string) error,输入的是旧文件名
- 前言这篇文章给大家讲解的是在vue-cli脚手架中如何配置vue-router前端路由的相关内容,分享出来供打击参考学习,下面来一起看看详细
- 一、标准的数据集流程梳理分为几个步骤数据准备以及加载数据库–>数据加载器的调用或者设计–>
- 在项目中遇到后台数据还没有加载完毕,但是页面上调用了后台数据中的字段,这样就会报undefined。例如:一进入页面直接回显数据。我在cre
- SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研
- 一、避免Firefox 背景图不显示的兼容问题,定义background 属性,先后顺序不能随意变动。background : backgr
- MySQL在5.1引入了一个rename database操作,但在MySQL5.1.23后又不支持这个命令。可以说是一个实验性的功能,没有
- 本文实例为大家分享了vue仿写下拉菜单功能,带有过渡效果(移动端),供大家参考,具体内容如下效果图clickOutside.js 点击目标之