一.简易登录界面的实现
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self, master=None):
super().__init__(master) # super()代表的是父类的定义,而不是父类对象
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
"""创建登录界面的组件"""
self.label01 = Label(self,text="用户名")
self.label01.pack()
# StringVar变量绑定到指定的组件。
# StringVar变量的值发生变化,组件内容也变化;
# 组件内容发生变化,StringVar变量的值也发生变化。
v1 = StringVar()
self.entry01 = Entry(self,textvariable=v1)
self.entry01.pack()
v1.set("admin")
print(v1.get());print(self.entry01.get())
# 创建密码框
self.label02 = Label(self,text="密码")
self.label02.pack()
v2 = StringVar()
self.entry02 = Entry(self,textvariable=v2, show="*")
self.entry02.pack()
Button(self,text="登陆",command=self.login).pack()
def login(self):
username = self.entry01.get()
pwd = self.entry02.get()
print("去数据库比对用户名和密码!")
print("用户名:"+username)
print("密码:"+pwd)
if username=="gaoqi" and pwd=="123456":
messagebox.showinfo("学习系统","登录成功!欢迎开始学习!")
else:
messagebox.showinfo("学习系统","登录失败!用户名或密码错误!")
if __name__ == '__main__':
root = Tk()
root.geometry("400x130+200+300")
app = Application(master=root)
root.mainloop()
最终效果如下
二.计算器软件界面的设计
这个案例中主要是利用button按钮进行布局
from tkinter import *
class Application(Frame):
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 rindex,r in enumerate(btnText):
for cindex,c in enumerate(r):
if c == "=":
Button(self,text=c,width=2)\
.grid(row=rindex+1,column=cindex,rowspan=2,sticky=NSEW)
elif c == 0:
Button(self,text=c,width=2)\
.grid(row=rindex+1,column=cindex,columnspan=2,sticky=NSEW)
elif c == ".":
Button(self,text=c,width=2)\
.grid(row=rindex+1,column=cindex+1,sticky=NSEW)
else:
Button(self,text=c,width=2)\
.grid(row=rindex+1,column=cindex,sticky=NSEW)
if __name__ == '__main__':
root = Tk()
root.geometry("200x240+200+300")
app = Application(master=root)
root.mainloop()
最终效果图如下
三.模拟钢琴游戏的界面设计
因为这个案例比较简单,就没有采用面向对象的写法
from tkinter import *
root = Tk();root.geometry("700x220")
# Frame是一个矩形区域,就是用来放置其他子组件
f1 = Frame(root)
f1.pack()
f2 = Frame(root);f2.pack()
btnText = ("流行风","中国风","日本风","重金属","轻音乐")
for txt in btnText:
Button(f1,text=txt).pack(side="left",padx="10")
for i in range(1,13):
Label(f2,width=5,height=10,borderwidth=1,relief="solid",
bg="black" if i%2==0 else "white").pack(side="left",padx=2)
root.mainloop()
最终效果图
四.简易记事本的界面设计及功能开发
from tkinter import *
from tkinter.filedialog import *
from tkinter.colorchooser import *
class Application(Frame):
def __init__(self, master=None):
super().__init__(master) # super()代表的是父类的定义,而不是父类对象
self.master = master
self.textpad = None # textpad表示Text文本框对象
self.pack()
self.createWidget()
def createWidget(self):
# 创建主菜单栏
menubar = Menu(root)
# 创建子菜单
menuFile = Menu(menubar)
menuEdit = Menu(menubar)
menuHelp = Menu(menubar)
# 将子菜单加入到主菜单栏
menubar.add_cascade(label="文件(F)", menu=menuFile)
menubar.add_cascade(label="编辑(E)", menu=menuEdit)
menubar.add_cascade(label="帮助(H)", menu=menuHelp)
# 添加菜单项
menuFile.add_command(label="新建", accelerator="ctrl+n", command=self.newfile)
menuFile.add_command(label="打开", accelerator="ctrl+o", command=self.openfile)
menuFile.add_command(label="保存", accelerator="ctrl+s",command=self.savefile)
menuFile.add_separator() # 添加分割线
menuFile.add_command(label="退出", accelerator="ctrl+q",command=self.exit)
# 将主菜单栏加到根窗口
root["menu"] = menubar
# 增加快捷键的处理
root.bind("<Control-n>",lambda event:self.newfile())
root.bind("<Control-o>",lambda event:self.openfile())
root.bind("<Control-s>",lambda event:self.savefile())
root.bind("<Control-q>",lambda event:self.exit())
#文本编辑区
self.textpad = Text(root, width=50, height=30)
self.textpad.pack()
# 创建上下菜单
self.contextMenu = Menu(root)
self.contextMenu.add_command(label="背景颜色", command=self.openAskColor)
#为右键绑定事件
root.bind("<Button-3>",self.createContextMenu)
def newfile(self):
self.textpad.delete("1.0", "end") # 把text控件中所有的内容清空
self.filename= asksaveasfilename(title="另存为",initialfile="未命名.txt",
filetypes=[("文本文档","*.txt")],
defaultextension=".txt")
self.savefile()
def openfile(self):
self.textpad.delete("1.0","end") # 把text控件中所有的内容清空
with askopenfile(title="打开文本文件") as f:
self.textpad.insert(INSERT,f.read())
self.filename = f.name
def savefile(self):
with open(self.filename,"w") as f:
c = self.textpad.get(1.0,END)
f.write(c)
def exit(self):
root.quit()
def openAskColor(self):
s1 = askcolor(color="red",title="选择背景色")
self.textpad.config(bg=s1[1])
def createContextMenu(self,event):
# 菜单在鼠标右键单击的坐标处显示
self.contextMenu.post(event.x_root, event.y_root)
if __name__ == '__main__':
root = Tk()
root.geometry("450x300+200+300")
root.title("我的简易记事本")
app = Application(master=root)
root.mainloop()
最终效果如下
五.自制画图软件的界面开发及功能设计
from tkinter import *
from tkinter.filedialog import *
from tkinter.colorchooser import *
#窗口的宽度和高度
win_width=900
win_height=450
class Application(Frame):
def __init__(self, master=None,bgcolor="#000000"):
super().__init__(master) # super()代表的是父类的定义,而不是父类对象
self.master = master
self.bgcolor = bgcolor
self.fgcolor = "#ff0000"
self.x = 0
self.y = 0 # 鼠标坐标
self.startDrawFlag = False # 是否开始画画
self.lastDraw = 0 # 最后绘制图形的id
self.drawpad = None #绘图区canvas对象
self.pack()
self.createWidget()
def createWidget(self):
#绘图区
self.drawpad = Canvas(root, width=win_width, height=win_height*0.8, bg=self.bgcolor)
self.drawpad.pack()
# 创建操作按钮
btn_start = Button(root, text="开始", name="start")
btn_start.pack(side="left", padx="10")
btn_pen = Button(root, text="画笔", name="pen")
btn_pen.pack(side="left", padx="10")
btn_rect = Button(root, text="画矩形", name="rect")
btn_rect.pack(side="left", padx="10")
btn_clear = Button(root, text="清屏", name="clear")
btn_clear.pack(side="left", padx="10")
btn_eraser = Button(root, text="橡皮擦", name="eraser")
btn_eraser.pack(side="left", padx="10")
btn_line = Button(root, text="直线", name="line")
btn_line.pack(side="left", padx="10")
btn_lineArrow = Button(root, text="直线(箭头)", name="lineArrow")
btn_lineArrow.pack(side="left", padx="10")
btn_color = Button(root, text="颜色", name="chooseColor")
btn_color.pack(side="left", padx="10")
# 给所有按钮处理事件
btn_pen.bind_class("Button", "<1>", self.myEventManager)
#为右键绑定事件
root.bind("<Button-3>",self.createContextMenu)
#程序一进来默认就处理鼠标拖动事件,默认使用画笔画画
self.drawpad.bind("<B1-Motion>", self.myDrawPen)
self.drawpad.bind("<ButtonRelease-1>", self.stopDraw)
#增加快捷键处理
root.bind("<KeyPress-r>", self.kuaijiejian)
root.bind("<KeyPress-g>", self.kuaijiejian)
root.bind("<KeyPress-y>", self.kuaijiejian)
def myEventManager(self,event):
name = event.widget.winfo_name()
self.drawpad.bind("<ButtonRelease-1>", self.stopDraw)
if name == "rect":
self.drawpad.bind("<B1-Motion>", self.myDrawRect)
elif name == "clear":
self.drawpad.delete("all")
elif name == "eraser":
self.drawpad.bind("<B1-Motion>", self.myEraser)
elif name == "line":
self.drawpad.bind("<B1-Motion>", self.myLine)
elif name == "lineArrow":
self.drawpad.bind("<B1-Motion>", self.myLineArrow)
elif name == "chooseColor":
c = askcolor(color=self.fgcolor, title="选择画笔颜色")
#print(c) # ((225.87890625, 3.01171875, 30.1171875), '#e1031e')
self.fgcolor = c[1]
else: # 画笔
self.drawpad.bind("<B1-Motion>", self.myDrawPen)
def createContextMenu(self,event):
# 菜单在鼠标右键单击的坐标处显示
self.contextMenu.post(event.x_root, event.y_root)
def myDrawPen(self,event):
#print("鼠标位置(相对于父容器):({0},{1})".format(event.x, event.y))
if not self.startDrawFlag:
self.startDrawFlag=True
self.x = event.x; self.y=event.y
self.lastDraw = self.drawpad.create_line(self.x,self.y,event.x,event.y,fill=self.fgcolor)
self.x = event.x
self.y = event.y
def stopDraw(self,event):
self.startDrawFlag = False
print("不能画")
self.lastDraw = 0
def myDrawRect(self,event):
self.drawpad.delete(self.lastDraw)
if not self.startDrawFlag:
self.startDrawFlag=True
self.x = event.x; self.y=event.y
self.lastDraw = self.drawpad.create_rectangle(self.x,self.y,event.x,event.y,outline=self.fgcolor)
def myEraser(self,event):
if not self.startDrawFlag:
self.startDrawFlag = True
self.drawpad.create_rectangle(event.x - 4, event.y - 4, event.x + 4, event.y + 4,
outline=self.bgcolor,fill=self.bgcolor)
def myLine(self,event):
self.drawpad.delete(self.lastDraw)
if not self.startDrawFlag:
self.startDrawFlag=True
self.x = event.x; self.y=event.y
self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y,
fill=self.fgcolor)
def myLineArrow(self,event):
self.drawpad.delete(self.lastDraw)
if not self.startDrawFlag:
self.startDrawFlag=True
self.x = event.x
self.y=event.y
self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y,
fill=self.fgcolor,arrow=LAST)
#处理快捷键
def kuaijiejian(self,event):
if event.char == "r":
self.fgcolor = "#ff0000"
elif event.char =="g":
self.fgcolor = "#00ff00"
elif event.char == "y":
self.fgcolor = "#ffff00"
if __name__ == '__main__':
root = Tk()
root.geometry(str(win_width)+"x"+str(win_height)+"+400+400")
root.title("我的画图软件")
app = Application(master=root)
root.mainloop()
最终效果图如下
好啦,以上五个案列全部奉上,喜欢的记得点点赞啦