python15

本文介绍了Tkinter库在Python中创建GUI应用的方法,包括使用canvas画布绘制图形,利用grid、pack和place布局管理器组织组件,以及事件处理和lambda表达式的应用。同时展示了如何创建计算器界面和使用scale滑块交互。通过实例代码详细解释了每个功能的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

canvas画布

canvas (画布)是一个矩形区域,可以放置图形、图像、组件等。

#coding:gbk
import random
from tkinter import *
from tkinter import messagebox
class Application(Frame):

    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createWidget()

    def createWidget(self):
        """创建登录界面的组件"""
        self.canvas=Canvas(self,width=300,height=200,bg="green")
        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)

        global photo
        photo=PhotoImage(file="pikaqiu.gif")
        self.canvas.create_image(150,170,image=photo)

        Button(self,text="画10个矩形",command=self.draw50Recg).pack(side="left")

    def draw50Recg(self):
        for i in range(0,10):
            x1=random.randrange(int(self.canvas["width"])/2)
            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)

if __name__=='__main__':
    root=Tk()
    root.geometry("400x200+200+300")
    app=Application(master=root)
    root.mainloop()

在这里插入图片描述

布局管理器

一个GUI应用程序必然有大量的组件,津些组件如何排布?这时候,就需要使用tkinter提供的布局管理器帮助我们组织、管理在父组件中子组件的布局方式。tkinter提供了三种管理器: pack、 grid、 place.
grid表示表格布局,采用表格结构组织组件。子组件的位置由行和列的单元格来确定,并且可以跨行和跨列进行操作。

在这里插入图片描述

#coding:gbk
from tkinter import *
from tkinter import messagebox
class Application(Frame):

    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createWidget()

    def createWidget(self):
        self.label01=Label(self,text="用户名")
        self.label01.grid(row=0,column=0)
        self.entry01=Entry(self)
        self.entry01.grid(row=0,column=1)
        Label(self,text="用户名为手机号").grid(row=0,column=2)

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

        Button(self,text="登录").grid(row=2,column=1,sticky=EW)
        Button(self,text="取消").grid(row=2,column=2,sticky=E)

if __name__=='__main__':
    root=Tk()
    root.geometry("400x200+200+300")
    app=Application(master=root)
    root.mainloop()

在这里插入图片描述

通过grid实现计算器界面

#coding:utf-8
from tkinter import *
from tkinter import messagebox
class Application(Frame):

    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createWidget()

    def createWidget(self):
        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("200x200+200+300")
    app=Application(master=root)
    root.mainloop()

在这里插入图片描述

pack布局管理器

pack按照组件的创建顺序将子组件添加到父组件中,按照垂直或者水平的方向自然排布。如果不指定任何选项,默认在父组件中自顶向下垂直添加组件。
pack是代码量最少,最简单的一种,可以用于快速生成界面.
在这里插入图片描述

#coding:utf-8
#测试pack布局管理
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,20):
    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布局管理器

可以通过坐标精确控制组件的位置。
在这里插入图片描述

事件处理

在这里插入图片描述
在这里插入图片描述

#coding:gbk
from tkinter import *
root=Tk();root.geometry("530x300")
c1=Canvas(root,width=200,height=200,bg="green")
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 relase_a_test(event):
    print("relase  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>",relase_a_test)
root.mainloop()

在这里插入图片描述

lambda表达式

lambda表达式定义的是一个匿名函数,只适合简单输入参数,简单计算返回结果,不适合功能复杂情况。
语法格式:

lambda 参数值列表:表达式

在这里插入图片描述

scale滑块

#coding:gbk
from tkinter import *
root=Tk()
root.geometry("400x200")
v=StringVar(root)
v.set("你喜欢的人")
om=OptionMenu(root,v,"ssl","lyh","zyq")

om["width"]=10
om.pack()
def test1():
    print("你喜欢的人",v.get())

Button(root,text="确定",command=test1).pack()
root.mainloop()

在这里插入图片描述

#coding:gbk
from tkinter import *
root=Tk()
root.geometry("400x200")


def test1(value):
    print("滑块的值",value)
    newFont=("宋体",value)
    a.config(font=newFont)

s1=Scale(root,from_=10,to=50,length=200,tickinterval=5,orient=HORIZONTAL
         ,command=test1)
s1.pack()

a=Label(root,text="jxlg",width=10,height=1,bg="black",fg="white")
a.pack()
root.mainloop()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值