Tkinter GUI编程攻略:Python图形化编程入门,20个实例助你一键开启学习之路

 Tkinter GUI


目录

 Tkinter GUI

1.点击Button按键实现弹框信息显示

2.主窗口位置和大小

3.GUI应用程序类的经典写法(面向对象)

4.Label标签

5.Entry单行文本框实现简单登录界面

6. 日期计算器

7.文件搜索工具

8.Text多行文本框

9.Radiobutton单选和Checkbutton多选按键

10.canvas画布

11.布局管理器

12.计算器界面的实现

13.钢琴按键界面的实现(可搭配语音生成函数)

14.扑克牌游戏

15.lambda表达式

16.三种事件的绑定

17.滑块测试

18.颜色框测试

19.文件选择框/读取文件内容

20.主菜单


1.点击Button按键实现弹框信息显示

**示例程序:**

import tkinter as tk
from tkinter import messagebox

root=tk.Tk()
root.title("测试")
root.geometry("200x50")

def show_info():
    messagebox.showinfo("弹窗","这是一个测试案例弹窗!")

btn=tk.Button(root,text="测试按键",command=show_info)
btn.pack(pady=10)

root.mainloop()

**运行效果:**

 2.主窗口位置和大小

**示例程序:**

import tkinter as tk

root=tk.Tk()
root.title("主窗口位置和大小")
#geometry("wxh±x±y")
#+x表示距离屏幕左边的距离 -x表示距离屏幕右边的位置
#+y表示距离屏幕上边的距离 -y表示距离屏幕下边的位置
root.geometry("300x300+500+300")

root.mainloop()

**运行效果:**

 3.GUI应用程序类的经典写法(面向对象)

**示例程序:**

import tkinter as tk
from tkinter import messagebox

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.create_widget()

    def create_widget(self):
        btn1=tk.Button(self, text="测试", command=self.show_info)
        btn1.pack(pady=30)
        btn2=tk.Button(self,text="退出",command=self.exit)
        btn2.pack(pady=30)

    def show_info(self):
        messagebox.showinfo("弹窗", "测试成功")
    def exit(self):
        root.destroy()

root=tk.Tk()
root.title("GUI应用程序类的测试")
root.geometry("400x200+500+300")
app=Application(master=root)
root.mainloop()

**运行效果:**

 4.Label标签

**示例程序:**

import tkinter as tk

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.create_widget()
        self.show_labelinfo2()

    #显示文本
    def show_labelinfo1(self):
        #label=tk.Label(self,text="你好,正在测试标签!",width=10,height=2,
        #               bg="blue",fg="white",font=("黑体",30))
        label=tk.Label(self,text="你好,正在测试标签!")
        label.pack(pady=10)

    def show_labelinfo2(self):
        label=tk.Label(self,text="你好\n世界",
                       borderwidth=2,relief="solid",justify="left")
        label.pack(pady=20)

    # 显示图像(展示接口)
    def show_photoinfo(self):
        global photo
        label = tk.Label(self, image=tk.PhotoImage(file="xxx/xxx"))
        label.pack(pady=10)

    def create_widget(self):
        btn=tk.Button(self, text="点击改变标签",
                      command=self.show_labelinfo1)
        btn.pack(pady=10)

root=tk.Tk()
root.title("标签测试")
root.geometry("400x190+500+300")
app=Application(master=root)
root.mainloop()

**运行效果:**

5.Entry单行文本框实现简单登录界面

**示例程序:**

import tkinter as tk
from tkinter import messagebox

entry_id=''
entry_passward=''
class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.login_info()
        self.create_widget()

    def login_info(self):
        label1=tk.Label(self,text="账号")
        label1.pack()
        global entry_id
        entry_id=tk.Entry(self)
        entry_id.pack(pady=10)

        label2=tk.Label(self,text="密码")
        label2.pack()
        global entry_passward
        entry_passward = tk.Entry(self)
        entry_passward.pack(pady=10)

    def login(self):
        id=str(entry_id.get())
        passward=str(entry_passward.get())
        if id=="张同学" and passward=="ztx806108":
            messagebox.showinfo("登录响应","账号密码正确,登陆成功!")
        else:
            messagebox.showinfo("登录响应","账号密码错误,登陆失败!")

    def create_widget(self):
        btn1=tk.Button(self, text="登录",width=10, command=self.login)
        btn1.pack(pady=10,side="left")
        btn2=tk.Button(self,text="退出",width=10, command=root.destroy)
        btn2.pack(pady=10,side="left")

root=tk.Tk()
root.title("文本输入测试")
root.geometry("400x200+500+300")
app=Application(master=root)
root.mainloop()

**运行效果:**

6. 日期计算器

**示例程序:**

import datetime as dt
import tkinter as tk

def show_time():
    year1=int(entry_starty.get())
    month1=int(entry_startm.get())
    day1=int(entry_startm.get())
    date1 = dt.datetime(year=year1, month=month1, day=day1)

    year2=int(entry_endy.get())
    month2=int(entry_endm.get())
    day2=int(entry_endd.get())
    date2 = dt.datetime(year=year2, month=month2, day=day2)

    date=date2-date1
    label.config(text=f"时间间隔: {date}!")

def exitapp():
    root.destroy()

#创建主窗口
root = tk.Tk()
root.title("日期计算器")
root.geometry("1000x500")

#创建一个标签
label = tk.Label(root, text="欢迎来到日期计算器!")
# 标签在窗口中的位置间距
label.pack(pady=10)

# 创建按键并设置功能
button = tk.Button(root, text="时间间隔", command=show_time)
# 按键在窗口中的位置间距
button.pack(pady=20)

#创建空白输入框
#对空白输入框进行间距调整
label1= tk.Label(root, text="请输入起始年:")
label1.pack()
entry_starty = tk.Entry(root)
entry_starty.pack(pady=8)

label12= tk.Label(root, text="请输入起始月:")
label12.pack()
entry_startm = tk.Entry(root)
entry_startm.pack(pady=8)

label13= tk.Label(root, text="请输入起始日:")
label13.pack()
entry_startd = tk.Entry(root)
entry_startd.pack(pady=8)

label4= tk.Label(root, text="请输入结束年:")
label4.pack()
entry_endy = tk.Entry(root)
entry_endy.pack(pady=8)

label5= tk.Label(root, text="请输入结束月:")
label5.pack()
entry_endm = tk.Entry(root)
entry_endm.pack(pady=8)

label6= tk.Label(root, text="请输入结束日:")
label6.pack()
entry_endd = tk.Entry(root)
entry_endd.pack(pady=8)

#创建菜单栏
menu_bar = tk.Menu(root)
root.config(menu=menu_bar)
#创建文件菜单项
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="文件", menu=file_menu)
#添加退出选项功能
file_menu.add_command(label="退出", command=exitapp)

#主循环
root.mainloop()

**运行效果:**

7.文件搜索工具

**示例程序:**

import os
import tkinter as tk

def show_path():
    file_path=entry_filepath.get()
    pattern=entry_pattern.get()
    for dirpath, _, filename in os.walk(file_path):
        for f in filename:
            if pattern in f:
                 label.config(text=f"{dirpath}\\{filename}")
                
#创建主窗口
root = tk.Tk()
root.title("文件路径搜索器")
root.geometry("350x155")

#创建空白输入框
#对空白输入框进行间距调整
label1= tk.Label(root, text="请输入查找文件路径:")
label1.pack()
entry_filepath = tk.Entry(root)
entry_filepath.pack()

label12= tk.Label(root, text="请输入搜索的关键词:")
label12.pack()
entry_pattern = tk.Entry(root)
entry_pattern.pack()

#创建一个标签
label = tk.Label(root, text="欢迎来到文件路径搜索器!")
# 标签在窗口中的位置间距
label.pack(pady=5)

# 创建按键并设置功能
button = tk.Button(root, text="查找文件路径", command=show_path)
# 按键在窗口中的位置间距
button.pack()

#主循环
root.mainloop()

**运行效果:**

8.Text多行文本框

**示例程序:**

import tkinter as tk
from tkinter import END

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.create_widget()

    def create_widget(self):
        self.w=tk.Text(self,width=40,height=20,bg="gray")#多行文本框
        self.w.pack(pady=15)
        self.btn1=tk.Button(self, text="保存文本内容", width=20,command=self.save_text)
        self.btn1.pack(side="left")
        self.btn2=tk.Button(self, text="清除文本内容",width=20, command=self.delete_text)
        self.btn2.pack(side="left")

    def save_text(self):
        text_thing=self.w.get(1.0,END)
        print(text_thing)
    def delete_text(self):
        self.w.delete(1.0,END)

root=tk.Tk()
root.title("文本框测试")
root.geometry("300x340+500+300")
app=Application(master=root)
root.mainloop()

**运行效果:**

 9.Radiobutton单选和Checkbutton多选按键

**示例程序:**

import tkinter as tk
from tkinter import messagebox

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.create_widget1()
        self.create_widget2()

        btn=tk.Button(self,text="确定",command=self.show_info)
        btn.pack(pady=20)

    def create_widget1(self):
        self.v= tk.StringVar()
        self.v.set("无输入")
        r1= tk.Radiobutton(self, width=10,text="男性",value= "man",variable=self.v)
        r1.pack(pady=10)
        r2= tk.Radiobutton(self,width=10, text="女性",value= "woman",variable=self.v)
        r2.pack(pady=10)

    def create_widget2(self):
        self.codeHobby= tk.IntVar()
        self.videoHobby=tk.IntVar()
        c1=tk.Checkbutton(self,text="打代码",
                          variable=self.codeHobby,onvalue=1,offvalue=0)
        c1.pack(pady=10)
        c2=tk.Checkbutton(self,text="看视频",
                          variable=self.videoHobby,onvalue=1,offvalue=0)
        c2.pack(pady=10)

    def show_info(self):
        if self.codeHobby.get()==1 and self.videoHobby.get()==1:
            messagebox.showinfo("活动",f"您的性别为{self.v.get()},且参与的活动为:打代码+看视频!")
        elif self.codeHobby.get()==1 and self.videoHobby.get()==0:
            messagebox.showinfo("活动",f"您的性别为{self.v.get()},且参与的活动为:打代码!")
        elif self.codeHobby.get()==0 and self.videoHobby.get()==1:
            messagebox.showinfo("活动",f"您的性别为{self.v.get()},且参与的活动为:看视频!")
        else:
            messagebox.showinfo("活动",f"您的性别为{self.v.get()},且未参与任何活动!")

root=tk.Tk()
root.title("多功能按键测试")
root.geometry("300x250+500+300")
app=Application(master=root)
root.mainloop()

**运行效果:**

 10.canvas画布

**示例程序:**

import random
import tkinter as tk

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createwidget()

    def createwidget(self):
       self.canvas=tk.Canvas(self,width=350,height=350,bg="grey")
       self.canvas.pack()
       btn=tk.Button(self,text="随机生成一个矩形",command=self.drawpicture)
       btn.pack(pady=5)

    def drawpicture(self):
        num1=int(self.canvas["width"])/2
        num2=int(self.canvas["height"])/2
        x1=random.randrange(int(num1))
        y1=random.randrange(int(num2))
        x2=x1+random.randrange(int(num1))
        y2=y1+random.randrange(int(num2))
        self.canvas.create_rectangle(x1,y1,x2,y2)

root=tk.Tk()
root.title("canvas画布")
root.geometry("400x400+100+100")
app=Application(master=root)
root.mainloop()

**运行效果:**

11.布局管理器

**示例程序:**

import tkinter as tk
from tkinter import EW
from tkinter import E

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createwidget1()
        self.createwidget2()

    def createwidget1(self):
        label1=tk.Label(self,text="用户名")
        label1.grid(row=0,column=0)
        enter1=tk.Entry(self)
        enter1.grid(row=0,column=1)

        label2=tk.Label(self,text="密码")
        label2.grid(row=1,column=0)
        enter2=tk.Entry(self,show="*")
        enter2.grid(row=1,column=1)

        btn1=tk.Button(self,text="登录")
        btn1.grid(row=2,column=1,sticky=EW)
        btn2=tk.Button(self,text="退出")
        btn2.grid(row=2,column=2,sticky=E)

    def createwidget2(self):
        f1=tk.Frame(root,width=200,height=200,bg="green")
        f1.place(x=100,y=100)

        tk.Button(root,text="aaa").place(relx=0.2,x=10,y=100,
                                         relwidth=0.2,relheight=0.2)
        tk.Button(f1,text="bbb").place(relx=0.6,rely=0.7)

root=tk.Tk()
root.title("布局管理器")
root.geometry("400x400+100+100")
app=Application(master=root)
root.mainloop()

**运行效果:**

 12.计算器界面的实现

**示例程序:**

import tkinter as tk
from tkinter import EW, NSEW

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createwidget()

    def createwidget(self):
        list=["MC","M+","M-","MR",
              "C","±","÷","×",
              "7","8","9","-",
              "4","5","6","+",
              "1","2","3","=",
              "0","."]
        entry=tk.Entry(self)
        entry.grid(row=0,column=0,columnspan=4,pady=5)
        row=1
        column=0
        for i in range(0,22):
            if i==20:
                btn=tk.Button(self,text=list[i])
                btn.grid(row=row,column=column,columnspan=2,sticky=EW)
            elif i==21:
                btn = tk.Button(self, text=list[i])
                btn.grid(row=row, column=column+1, sticky=EW)
            elif i==19:
                btn = tk.Button(self, text=list[i])
                btn.grid(row=row, column=column,rowspan=2,sticky=NSEW)
            else:
                btn=tk.Button(self,text=list[i])
                btn.grid(row=row,column=column,sticky=EW)

            column+=1
            if column%4==0:
               row+=1
               column = 0

root=tk.Tk()
root.title("计算器")
root.geometry("180x220+100+100")
app=Application(master=root)
root.mainloop()

**运行效果:**

 13.钢琴按键界面的实现(可搭配语音生成函数)

**示例程序:**

import tkinter as tk

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createwidget()

    def createwidget(self):
        #Frame是一个矩形区域,就是用来放置其他子组件
        f1=tk.Frame(root)
        f1.pack()
        f2=tk.Frame(root)
        f2.pack()

        btntext=["流行风","中国风","日本风","重金属","轻音乐"]
        for i in range(0,5):
            btn=tk.Button(f1,text=btntext[i])
            btn.pack(side="left",padx=10)

        for i in range(1,13):
            label=tk.Label(f2,width=5,height=10,borderwidth=1,relief="solid",
                           bg="black"if i%2==0 else "white")
            label.pack(side="left",padx=0)

root=tk.Tk()
root.title("钢琴按键")
root.geometry("500x210+100+100")
app=Application(master=root)
root.mainloop()

**运行效果:**

 14.扑克牌游戏

**示例程序:**

import tkinter as tk

class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createwidget()

    def createwidget(self):
            len=0
            self.photo1=tk.PhotoImage(file="pictures/img1.png")
            puke=tk.Label(self.master,image=self.photo1)
            puke.place(x=10+len*70,y=50)
            puke.bind_class("Label","<1>",self.client)
            len+=1

            self.photo2=tk.PhotoImage(file="pictures/img2.png")
            puke=tk.Label(self.master,image=self.photo2)
            puke.place(x=10+len*70,y=50)
            puke.bind_class("Label","<1>",self.client)
            len+=1

            self.photo3=tk.PhotoImage(file="pictures/img3.png")
            puke=tk.Label(self.master,image=self.photo3)
            puke.place(x=10+len*70,y=50)
            puke.bind_class("Label","<1>",self.client)
            len+=1

            self.photo4=tk.PhotoImage(file="pictures/img4.png")
            puke=tk.Label(self.master,image=self.photo4)
            puke.place(x=10+len*70,y=50)
            puke.bind_class("Label","<1>",self.client)
            len+=1

            self.photo5 = tk.PhotoImage(file="pictures/img5.png")
            puke = tk.Label(self.master, image=self.photo5)
            puke.place(x=10 + len * 70, y=50)
            puke.bind_class("Label", "<1>", self.client)
            len += 1

            self.photo6=tk.PhotoImage(file="pictures/img6.png")
            puke=tk.Label(self.master,image=self.photo6)
            puke.place(x=10+len*70,y=50)
            puke.bind_class("Label","<1>",self.client)
            len+=1

            self.photo7=tk.PhotoImage(file="pictures/img7.png")
            puke=tk.Label(self.master,image=self.photo7)
            puke.place(x=10+len*70,y=50)
            puke.bind_class("Label","<1>",self.client)
            len+=1

            self.photo8=tk.PhotoImage(file="pictures/img8.png")
            puke=tk.Label(self.master,image=self.photo8)
            puke.place(x=10+len*70,y=50)
            puke.bind_class("Label","<1>",self.client)
            len+=1

            self.photo9=tk.PhotoImage(file="pictures/img9.png")
            puke=tk.Label(self.master,image=self.photo9)
            puke.place(x=10+len*70,y=50)
            puke.bind_class("Label","<1>",self.client)
            len+=1

            self.photo10 = tk.PhotoImage(file="pictures/img10.png")
            puke = tk.Label(self.master, image=self.photo10)
            puke.place(x=10 + len * 70, y=50)
            puke.bind_class("Label", "<1>", self.client)
            len += 1

    def client(self, event=None):
        if event.widget.winfo_y()==50:
            event.widget.place(y=30)
        else:
            event.widget.place(y=50)

root=tk.Tk()
root.title("扑克牌")
root.geometry("900x400+100+100")
app=Application(master=root)
root.mainloop()

**运行效果:**

15.lambda表达式

**示例程序:**

import tkinter as tk

//后端控制台反馈
def test1():
    print("普通按键测试:不涉及获取event对象,可以使用!")
def test2(a,b):
    print("非普通按键:涉及获取event对象!"+"a={},b={}".format(a,b))

root=tk.Tk()
root.title("lambda使用情况测试")
root.geometry("140x50+100+100")

btn1=tk.Button(root,text="测试按键1",command=test1)
btn1.pack(side="left")
btn2=tk.Button(root,text="测试按键2",command=lambda: test2("aaa","bbb"))
btn2.pack(side="left")

root.mainloop()

**运行效果:**

 16.三种事件的绑定

**示例程序:**

import tkinter as tk

def test1(event):
    print("[左击] bind()方式绑定,可以获取到event对象!")
def test2(a,b):
    print("a={},b={}".format(a,b))
    print("command()方式绑定,不可以获取到event对象!")
def test3(event):
    print("[右击] bind_class()方式绑定,可以获取到event对象!")

root=tk.Tk()
root.title("事件绑定")
root.geometry("200x30+100+100")

btn1=tk.Button(root,text="测试按键1")
btn1.pack(side="left")
btn1.bind("<Button-1>",test1)

btn2=tk.Button(root,text="测试按键2",command=lambda: test2("",""))
btn2.pack(side="left")

btn3=tk.Button(root,text="测试按键3")
btn3.pack(side="left")
btn3.bind_class("Button","<Button-3>",test3)

root.mainloop()

**运行效果:**

 17.滑块测试

**示例程序:**

import tkinter as tk
from tkinter import HORIZONTAL

def function(event):
    newevent=('宋体',event)
    label.config(font=newevent)
    
root=tk.Tk()
root.title("测试")
root.geometry("400x200+100+100")

scale=tk.Scale(root,from_=10,to=50,length=200,tickinterval=5,orient=HORIZONTAL,command=function)
scale.pack(pady=20)

label=tk.Label(root,text="滑块测试")
label.pack(pady=20)

root.mainloop()

**运行效果:**

 18.颜色框测试

 **示例程序:**

import tkinter as tk
from tkinter.colorchooser import askcolor

def setcolour():
    s=askcolor(color="red",title="选择背景色")
    root.config(bg=s[1])

root=tk.Tk()
root.title("测试")
root.geometry("400x200+100+100")

btn=tk.Button(root,text="修改背景色",command=setcolour)
btn.pack(pady=10)

root.mainloop()

**运行效果:**

 19.文件选择框/读取文件内容

**示例程序:**

import tkinter as tk
from tkinter.filedialog import askopenfilename, askopenfile

def test():
    f=askopenfilename(title="上传文件",initialfile="d:",filetypes=[("图片文件",".png"),("视频文件",".mp4")])
    label["text"]=f
def test1():
    with askopenfile(title="读取文件",initialfile="d:",filetypes=[("文本文件",".txt")]) as f:
        label["text"]=f.read()

root=tk.Tk()
root.title("测试")
root.geometry("400x200+100+100")

btn1=tk.Button(root,text="选择编辑的文件",command=test)
btn1.pack()
btn2=tk.Button(root,text="读取编辑的文件",command=test1)
btn2.pack()

label=tk.Label(root,width=100,height=50,bg="grey")
label.pack()

root.mainloop()

**运行效果:**

 20.主菜单

**示例程序:**

import tkinter as tk
class Application(tk.Frame):
    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createwidget()

    def createwidget(self):
        #创建主菜单栏
        menubar=tk.Menu(root)

        #创建主菜单栏下的菜单项
        menufile=tk.Menu(menubar)
        menuedit=tk.Menu(menubar)
        menuhelp=tk.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.func1)
        menufile.add_command(label="打开",accelerator="ctrl+o",command=self.func2)
        menufile.add_command(label="保存",accelerator="ctrl+s",command=self.func3)
        menufile.add_separator()
        menufile.add_command(label="退出",accelerator="ctrl+q",command=root.destroy)

        #将主菜单栏加载到根窗口
        root["menu"]=menubar

    #具体实现补充相应的接口功能块
    def func1(self):
        pass
    def func2(self):
        pass
    def func3(self):
        pass

if __name__== '__main__':
    root=tk.Tk()
    root.title("主菜单测试")
    root.geometry("400x200+100+100")
    app=Application(master=root)
    root.mainloop()

**运行效果:**


 

作者:张同学的IT技术日记

物联沃分享整理
物联沃-IOTWORD物联网 » Tkinter GUI编程攻略:Python图形化编程入门,20个实例助你一键开启学习之路

发表回复