目录

一、导入模块

二、类的写法

三、各组件的功能

1.Button

2.Label

3.Entry

4.Text && Tag

5.RadioButton && CheckButton

6.Canvas

7.布局管理器

①grid

②pack

③place

8.Event

9.OptionMenu && Scale

10.Color && file choose frame

11.Simpledialog && messagebox

12.Menu

四、实战演练

1.NoteBook

2.DrawingPad


一、导入模块

python中提供tkinter模块进行GUI设计,使用时直接按照import tkinter 或者 import tkinter as tk导入即可。

二、类的写法

类的写法思路应包括:

①导入模块

②类的实现(包括master参数的传入和组件的创建)

③主界面的设置(包括大小、标题、循环等)

具体代码如下:

from tkinter import *class Application(Frame):    #继承Framedef __init__(self,master=None):    #传入master参数super().__init__(master)self.pack()        #界面布局,可以更改self.creatWidge()def creatWidge(self):    #创建组件passroot = Tk()    #设置主界面
root.geometry("500x300+450+250")    #设置大小
root.title("一个经典程序GUI的类的写法")    #设置标题
Application(master=root)root.mainloop()    # 界面循环

三、各组件的功能

tkinter模块中提供多种组件,如下图所示:

 下面文章将介绍主要的几种组件。

1.Button

Button初始化传入参数为:def __init__(self, master=None, cnf={}, **kw)

这意味着需要给Button传入一个master参数。

如果需要对Button属性进行设置,则需要引入Options选项的概念,我们可以通过三种方式设置Options选项,这在各种GUI组件中用法都一致。

①创建对象是,使用命名参数(关键字参数)

fred = Button(self,fg="red",bg="blue")

②创建对象之后,使用字典索引方式

fred["fg"] = "red"

③创建对象后,使用config()方法

fred.coonfig(fg="red",bg="blue")

各种Options选项如下:

对Button属性设置完成之后需要再调用pack()方法将其进行布局。

以下为一种实例:

    def creatWidge(self):self.btn01 = Button(self)self.btn01["text"] = "ButtonOne"self.btn01.pack()self.btn01["command"] = self.ButtonOneself.btnQuit = Button(self,text="退出",command=root.destroy)self.btnQuit.pack()def ButtonOne(self):tk.messagebox.showinfo("Title","Content")    #需要在tkinter模块中导入messagebox

2.Label

Label的常用属性如下所示:

Label的具体配置过程与Button类似。

应注意Label中image参数无法直接传入图片路径,应配合PhotoImage函数使用,具体实例如下:

    def creatWidge(self):self.label01 = Label(self, text="The Cat", width=10, height=2,bg="blue", fg="white",font=("黑体",30),anchor=W)self.label01.pack()self.photo1 = PhotoImage(file="imgs/cat.png")self.label02 = Label(self,image=self.photo1)self.label02.pack()

image参数也可以传入Button中。

3.Entry

Entry用来传入用户输入的字符串,内容需要使用StringVar()来保存在一个变量中,可以通过set方法设置初始值,然后传入到textvariable里面。

以下是一个实例:

    def creatWidge(self):self.NameLable = Label(self,text="用户名")self.NameLable.pack()v1 = StringVar()v1.set("admin")self.NameEntry = Entry(self,textvariable=v1)self.NameEntry.pack()# print(v1.get());print(self.NameEntry.get())   打印输入框内的值self.PasswordLable = Label(self,text="密码")self.PasswordLable.pack()v2 = StringVar()self.PasswordEntry = Entry(self,textvariable=v2,show="*")self.PasswordEntry.pack()self.Login = Button(self,text="登录",command=self.login)self.Login.pack()def login(self):if  self.NameEntry.get() == "Chen" and  self.PasswordEntry.get() == "123456":messagebox.showinfo("系统", "登录成功!")else:messagebox.showinfo("系统", "登录失败!用户名或密码错误!")

4.Text && Tag

Text是多行文本框,可以用来给用户进行文本输入,具体功能如下面的例子所示:

    def creatWidge(self):self.text1 = Text(self,width=70,height=30,bg="gray")self.text1.pack()self.text1.insert(1.0,"请输入文字...",)      #1行0列插入一段文字(Text从1行0列开始)Button(text="重复插入文本",command=self.insertText).pack(side="left")Button(text="返回文本", command=self.returnText).pack(side="left")Button(text="添加图片", command=self.addImage).pack(side="left")Button(text="添加组件", command=self.addWidget).pack(side="left")Button(text="通过tag精确控制文本", command=self.textTag).pack(side="left")def insertText(self):self.text1.insert(INSERT,' Chen ')      #INSERT表示在光标处插入self.text1.insert(END,'[cat]')          #END表示在文本最后插入def returnText(self):print(self.text1.get(1.2,1.5))print(self.text1.get(1.0,END))      #打印全部内容def addImage(self):self.photo = PhotoImage(file="imgs/cat.png")self.text1.image_create(END,image=self.photo)       #添加图片def addWidget(self):b1 = Button(text="Button")self.text1.window_create(INSERT,window=b1)      #添加按钮def textTag(self):self.text1.delete(1.0,END)      #删除全部内容self.text1.insert(INSERT,"There is no word!\n面向CSDN编程!\n百度一下,你就知道!")self.text1.tag_add("word",1.12,1.16)     # 添加一个tag,tag名称为wordself.text1.tag_config("word",background="yellow",foreground="red")     # 对tag进行配置self.text1.tag_add("baidu",3.0,3.4)self.text1.tag_config("baidu",underline=True)       #添加下划线self.text1.tag_bind("baidu","<Button-1>",self.webshow)      # 对tag进行绑定def webshow(self,event):webbrowser.open("http://www.baidu.com")     #需要用到webbrowser模块

5.RadioButton && CheckButton

RadioButton是单选按钮,CheckButton是多选按钮,都需要一个变量储存内容,具体功能如下面例子所示:

    def creatWidge(self):self.v1 = StringVar()self.v1.set("M")self.v2 = IntVar()self.v3 = IntVar()self.Radio1 = Radiobutton(text="男性",value="M",variable=self.v1)     #单选按钮配置self.Radio2 = Radiobutton(text="女性", value="F", variable=self.v1)self.Radio1.pack(side="left");self.Radio2.pack(side="left")Button(text="确认",command=self.confirm_one).pack(side="left")self.Check1 = Checkbutton(text="敲代码",variable=self.v2,onvalue=1,offvalue=0)     #多选按钮配置self.Check2 = Checkbutton(text="睡觉",variable=self.v3,onvalue=1,offvalue=0)self.Check1.pack(side="right");self.Check2.pack(side="right")Button(text="确认",command=self.confirm_two).pack(side="right")def confirm_one(self):messagebox.showinfo("Confirm","性别为:"+self.v1.get())def confirm_two(self):if self.v2.get()==1:messagebox.showinfo("Confirm","赶紧敲代码!")if self.v3.get()==1:messagebox.showinfo("Confirm","碎觉碎觉~")elif self.v2.get()!=1:messagebox.showinfo("Confirm","为什么什么都不选?")

6.Canvas

Canvas用于图形绘制,具体功能如下面例子所示:

    def creatWidge(self):self.canvas = Canvas(self,width=300,height=200,bg="gray")self.canvas.pack()line = self.canvas.create_line(10,10,30,20,40,50)   # 画一条折线rect = self.canvas.create_rectangle(50,50,100,100)  # 画一个矩形oval = self.canvas.create_oval(50,50,100,100)    # 画一个椭圆self.photo = PhotoImage(file="imgs/Reimu.png")self.canvas.create_image(120,170,image=self.photo)      #导入一个图片Button(self,text="画十个矩形",command=self.draw10Rect).pack(side="left")def draw10Rect(self):for i in range(10):x1 = random.randrange(int(self.canvas["width"])/2)      #生成一个0到width的数字y1 = random.randrange(int(self.canvas["height"])/2)x2 = x1 + random.randrange(int(self.canvas["width"]) / 2)y2 = y1 + random.randrange(int(self.canvas["height"]) / 2)self.canvas.create_rectangle(x1,y1,x2,y2)

7.布局管理器

tkinter中提供了三种布局管理器:grid、pack、place。

①grid

grid表格布局,采用表格结构组织组件,子组件的位置由行和列的单元格来确定,grid方法提供的选项如下所示:

具体实例如下:

    def creatWidge(self):btnText = (("MC","M+","M-","MR"),("C","±","/","×"),(7,8,9,"-"),(4,5,6,"+"),(1,2,3,"="),(0,"."))         #计算器内容Entry().grid(row=0,column=0,columnspan=4,pady=10)for rindex,r in enumerate(btnText):     #enumerate(btnText)将btnText变成枚举对象for cindex,c in enumerate(r):if c == "=":Button(text=c, width=2).grid(row=rindex + 1, column=cindex, sticky=NSEW,rowspan=2)elif c == 0:Button(text=c, width=2).grid(row=rindex + 1, column=cindex, sticky=EW,columnspan=2)elif c == ".":Button(text=c, width=2).grid(row=rindex + 1, column=cindex+1, sticky=EW)else:Button(text=c,width=2).grid(row=rindex+1,column=cindex,sticky=EW)

②pack

pack是最简单的布局管理器,只能实现水平或者垂直的布局,pack方法提供的选项如下:

具体实例如下:

root = Tk();root.geometry("700x200")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(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()

③place

place位置管理器,可以通过像素控制组件位置,place方法提供的选项如下:

具体实例如下:

    def creatWidge(self):self.photos = [PhotoImage(file=f"imgs/puke/puke{i+1}.png") for i in range(10)]self.pukes = [Label(root,image=self.photos[i]) for i in range(10)]for i in range(10):self.pukes[i].place(x=10+i*40,y=50)self.pukes[0].bind_class("Label","<Button-1>",self.chupai)  # 为所有的Label增加事件处理def chupai(self,event):if event.widget.winfo_y() == 50:event.widget.place(y=30)else:event.widget.place(y=50)

8.Event

Event常用事件:

具体实例如下:

root = Tk();root.geometry("530x300")
c1 = Canvas(root,width=200,height=200,bg="blue")
c1.pack()def mouseTest(event):print("鼠标左键单击位置(相对于父容器):{0}{1}".format(event.x,event.y))print("鼠标左键单击位置(相对于屏幕):{0}{1}".format(event.x_root,event.y_root))print("事件绑定的组件:{0}".format(event.widget))def testDrag(event):c1.create_oval(event.x,event.y,event.x+1,event.y+1)def keyboardTest(event):print("键的keycode:{0},键的char:{1},键的keysym:{2}".format(event.keycode,event.char,event.keysym))def press_a_test(event):print("press a")
def release_a_test(event):print("release a")c1.bind("<Button-1>",mouseTest)
c1.bind("<B1-Motion>",testDrag)
root.bind("<KeyPress>",keyboardTest)
root.bind("<KeyPress-a>",press_a_test)
root.bind("<KeyRelease-a>",release_a_test)
root.mainloop()

9.OptionMenu && Scale

OptionMenu 和 Scale 分别为选择菜单和滑条,具体例子如下:

root = Tk();root.geometry("200x100")
v = StringVar()
v.set("选项一")
om = OptionMenu(root,v,"选项一","选项二","选项三","选项四")
om["width"] = 10
om.pack()def test1():print("你的选项是:",v.get())def test2(value):# Scale滑动时自动传入value参数newFont=("宋体",value)a.config(font=newFont)s1 = Scale(root,from_=10,to=50,length=200,tickinterva=5,orient=HORIZONTAL,command=test2)
# orient默认为垂直,加上HORIZONTAL为水平
s1.pack()
a = Button(root,text="确定",command=test1)
a.pack()
root.mainloop()

10.Color && file choose frame

Color choose frame需要导入tkinter.colorchooser模块,file choose frame需要导入tkinter.filedialog模块,filedialog模块函数和命名参数如下:

具体例子如下:

root = Tk();root.geometry("600x400+500+200")def test1():s1 = askcolor(color="red",title="选择背景颜色")# s1的形式为:((0.0,0.0,255.99609375),'#0000ff')root.config(bg=s1[1])def test2():f = askopenfilename(title="上传文件",initialdir="Chen")show["text"] = fdef test3():with askopenfile(title="上传文件",filetypes=[("文本文件","txt")]) as f:show["text"] = f.read()Button(root,text="选择背景颜色",command=test1).pack()
Button(root,text="选择编辑的文件",command=test2).pack()
Button(root,text="选择读取的文本文件",command=test3).pack()
show = Label(root,width=40,height=3,bg="green")
show.pack()
root.mainloop()

11.Simpledialog && messagebox

Simledialog需要导入tkinter.simpledialog模块,messagebox需要导入tkinter.messagebox模块。

simpledialog常用函数如下:

messagebox常用函数如下:

 具体实例如下:

root = Tk();root.geometry("400x100+500+300")
def test1():a = askinteger(title="输入年龄",prompt="请输入年龄",initialvalue=18,minvalue=1,maxvalue=100)# askstring、askfloat框使用方法一样show["text"]=aButton(root,text="你多大了?",command=test1).pack()
show = Label(root,width=40,height=3,bg="green")
show.pack()
a1 = showinfo(title="学习pyhton",message="零基础学习python")
root.mainloop()

12.Menu

通过Menu组件我们可以建立主菜单和快捷菜单,具体例子如下:

    def creatWidge(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.test)menuFile.add_command(label="打开",accelerator="ctrl+o",command=self.test)menuFile.add_command(label="保存",accelerator="ctrl+s",command=self.test)menuFile.add_separator() # 添加分割线menuFile.add_command(label="退出",accelerator="ctrl+q",command=self.test)# 将主菜单加到根窗口root.config(menu=menubar)# 文本编辑区self.textpad = Text(root,width=50,height=30)self.textpad.pack()# 创建上下菜单self.contextMenu = Menu(root)self.contextMenu.add_command(label="背景颜色",command=self.test)# 右键绑定事件root.bind("<Button-3>",self.createContextMenu)def test(self):passdef createContextMenu(self,event):# 菜单在鼠标右键单击的坐标处显示self.contextMenu.post(event.x_root,event.y_root)

四、实战演练

1.NoteBook

from tkinter import *class Application(Frame):def __init__(self,master=None):super().__init__(master)self.master = masterself.textpad = Noneself.pack()self.creatWidge()def creatWidge(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.test)menuFile.add_command(label="打开",accelerator="ctrl+o",command=self.test)menuFile.add_command(label="保存",accelerator="ctrl+s",command=self.test)menuFile.add_separator() # 添加分割线menuFile.add_command(label="退出",accelerator="ctrl+q",command=self.test)# 将主菜单加到根窗口root.config(menu=menubar)# 文本编辑区self.textpad = Text(root,width=50,height=30)self.textpad.pack()# 创建上下菜单self.contextMenu = Menu(root)self.contextMenu.add_command(label="背景颜色",command=self.test)# 右键绑定事件root.bind("<Button-2>",self.createContextMenu)def test(self):passdef createContextMenu(self,event):# 菜单在鼠标右键单击的坐标处显示self.contextMenu.post(event.x_root,event.y_root)if __name__ == '__main__':root = Tk()root.geometry("300x300+450+200")root.title("Test")app = Application(master=root)root.mainloop()

2.DrawingPad

from tkinter import *
from tkinter.colorchooser import *# 窗口的宽度和高度
win_width = 900
win_height = 500
# 画布背景颜色
bgcolor = "black"class Application(Frame):def __init__(self,master=None):super().__init__(master)self.fgcolor="#ff0000"self.lastDraw = 0       # 用于删除未完成的直线self.startDrawFlag = False      # 用于定位直线开始位置self.pack()self.creatWidge()def creatWidge(self):# 创建绘画区self.drawpad = Canvas(root,width=win_width,height=win_height*0.9,bg=bgcolor)self.drawpad.pack()# 创建按钮btn_start = Button(root,text="开始",name="start")btn_start.pack(side="left",padx="30")btn_pen = Button(root,text="画笔",name="pen")btn_pen.pack(side="left",padx="30")btn_rect = Button(root,text="矩形",name="rect")btn_rect.pack(side="left",padx="30")btn_clear = Button(root,text="清屏",name="clear")btn_clear.pack(side="left",padx="30")btn_eraser = Button(root,text="橡皮擦",name="eraser")btn_eraser.pack(side="left",padx="30")btn_line = Button(root,text="直线",name="line")btn_line.pack(side="left",padx="30")btn_arrowLine = Button(root,text="箭头",name="arrowLine")btn_arrowLine.pack(side="left",padx="30")btn_color = Button(root,text="画笔颜色",name="color")btn_color.pack(side="left",padx="30")# 事件处理btn_pen.bind_class("Button","<1>",self.eventManager)self.drawpad.bind("<ButtonRelease-1>",self.stopDraw)# 增加快捷键root.bind("<Control-r>", lambda event: self.myColor())def eventManager(self,event):name =event.widget.winfo_name()if name == "line":self.drawpad.bind("<B1-Motion>",self.myline)elif name == "arrowLine":self.drawpad.bind("<B1-Motion>",self.myarrowLine)elif name == "rect":self.drawpad.bind("<B1-Motion>", self.myRect)elif name == "pen":self.drawpad.bind("<B1-Motion>",self.myPen)elif name == "eraser":self.drawpad.bind("<B1-Motion>",self.myEraser)elif name == "clear":self.drawpad.delete("all")elif name == "color":self.myColor()def stopDraw(self,event):self.startDrawFlag = False      # 重新定位直线初始位置self.lastDraw = 0       # 防止生成的直线被删除def startDraw(self,event):self.drawpad.delete(self.lastDraw)  # 删除未完成的直线if not self.startDrawFlag:# 定位直线的初始位置self.startDrawFlag = Trueself.x = event.xself.y = event.ydef myline(self,event):self.startDraw(event)self.lastDraw = self.drawpad.create_line(self.x,self.y,event.x,event.y,fill=self.fgcolor)def myarrowLine(self,event):self.startDraw(event)self.lastDraw = self.drawpad.create_line(self.x,self.y,event.x,event.y,fill=self.fgcolor,arrow=LAST)def myRect(self,event):self.startDraw(event)self.lastDraw = self.drawpad.create_rectangle(self.x,self.y,event.x,event.y,outline=self.fgcolor)def myPen(self,event):self.startDraw(event)self.drawpad.create_line(self.x,self.y,event.x,event.y,fill=self.fgcolor)self.x = event.xself.y = event.ydef myEraser(self,event):self.startDraw(event)self.drawpad.create_rectangle(self.x-4, self.y-4, event.x+4, event.y+4, fill=bgcolor)self.x = event.xself.y = event.ydef myColor(self):c = askcolor(color=self.fgcolor, title="选择画笔颜色")self.fgcolor = c[1]if __name__ == '__main__':root = Tk()root.geometry(f"{win_width}x{win_height}+300+150")root.title("Canvas")app = Application(master=root)root.mainloop()

Python中Tkinter知识点总结相关推荐

  1. python tkinter库、添加gui界面_使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)...

    使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二),创建一个,界面,布局,文件,路径 使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二) ...

  2. python中tkinter较完整的鼠标样式cursor值

    什么是cursor cursor是指(计算机荧光屏上的)光标,游标; 在tkinter中的Frame, Label, Button, Radiobutton, Checkbutton, Entry, ...

  3. Python中TKinter的输入框如何绑定回车键事件调用功能函数

    Python中TKinter的输入框如何绑定回车键事件调用功能函数 TKinter中的Entry输入框,与普通的按钮类型有所不同,没有command的属性来直接调用一个函数功能,所以,如果要通过键盘按 ...

  4. python中label有什么用_对Python中TKinter模块中的Label组件实例详解

    Python2.7.4 OS-W7x86 1. 简介 Label用于在指定的窗口中显示文本和图像.最终呈现出的Label是由背景和前景叠加构成的内容. Label组件定义函数:Label(master ...

  5. python中tkinter模块_使用Python中的tkinter模块作图的方法

    python简述: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Python[1 ...

  6. Python中Tkinter模块的Canvas控件绘制jpg图片到指定区域

      准备在Python的Tkinter模块中用Canvas绘制如下形式的工艺卡片(图片来自参考文献5,原图来自参考文献4),但是在绘制图形时遇到两个问题,特此记录如下: jpg图片无法读取   Can ...

  7. Python中tkinter库

    1. 简介 Tkinter是Python中常用的GUI库,它使用Tk GUI工具包,并提供了创建各种GUI应用程序的功能. 2. 创建一个窗口 要创建一个窗口,需要通过导入Tkinter模块,创建一个 ...

  8. Python中Tkinter解决button的command无返回值问题

    Tkinter是什么 Tkinter是Python的标准GUI库.Python使用Tkinter可以快速地创建GUI应用程序.由于Tkinter属于Python标准库,就不需要使用pip安装,直接导入 ...

  9. python中tkinter模块窗口操作_Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)...

    本篇博文搬到个人博客:[洪卫の博客](https://sunhwee.com)上面去了,想要获得最佳阅读体验,欢迎前往 [https://sunhwee.com](洪卫の博客), 建议用电脑查看教程文 ...

最新文章

  1. 计算机辅助制造实验感想6,中南大学计算机辅助制造实验报告1
  2. js等待5秒后执行_Python+selenium自动化之等待
  3. PAT甲级1088 Rational Arithmetic:[C++题解]分数的加减乘除
  4. 温州大学《深度学习》课程课件(一)
  5. 【Mybatis-Plus】(一)初识Mybatis-Plus 入门案例
  6. 循环数组最大字段和(51Nod-1050)
  7. 和方舟rust一样的手游_偶像梦幻祭2新活动 ES手游全新开服
  8. 五八搜索实时索引实现和重构
  9. 淘客漏洞群用的什么机器人_大双淘客第35期:如何在社群里开课分享首单礼金玩法的流程...
  10. 解压并安装protobuf库_通过protobuf自带gzip压缩对报文进行二次压缩
  11. android通过代码设置铃声_让你的手机铃声与众不同 (附ios音乐dj)
  12. 【poj1743-Musical Theme】不可重叠最长重复子串-后缀数组
  13. 【淘宝经验分享】新开店铺如何提升流量
  14. IMAP协议定时监听接收邮件(QQ邮箱、网易邮箱都可)
  15. 框架学习:框架是什么以及框架怎么学
  16. DSX-5000校准的意义?
  17. 光场相机模拟程序解读
  18. 2022-2028全球汽车压力传感器行业发展现状调研及投资前景分析报告
  19. 期货近远月价差的含义(期货远月比近月价格高)
  20. 无时不在断流的小米10手机的共享热点

热门文章

  1. 深入浅出推荐系统(六):召回:一切为了业务
  2. 算法学习Day1——C之哈希表
  3. 自体脂肪丰臀存活率高吗,吃什么提高存活率?
  4. MacBook Pro使用入门
  5. 电子地图GIS在医疗行业应用解决方案
  6. What is the rationale for the `/usr` directory?
  7. extjs中bind_Extjs中常用表单介绍与应用
  8. linux2-Linux基础命令
  9. 再见,普及的OI生涯
  10. ON/安森美ISL9R3060G2车规FRD,原厂渠道ASEMI代理