为您推荐:
精华内容
最热下载
问答
  • 5星
    415KB weixin_43549804 2021-05-23 11:20:13
  • 5星
    67.5MB qq_43552032 2020-12-30 21:40:56
  • 5星
    483KB qq_46051303 2021-01-21 14:17:39
  • 5星
    1.18MB weixin_45771864 2021-07-19 16:11:07
  • 145KB weixin_38687199 2020-09-18 12:11:54
  • tkinter中控件布局的方法主要有三种:(1)pack布局(2)grid布局(3)place布局pack布局采用块的方式组织控件,pack(options,......),options参数可以选择:side、fill、padx/pady、anchor等。21-设置三个标签,使用...

    在tkinter中控件布局的方法主要有三种:

    (1)pack布局

    (2)grid布局

    (3)place布局

    pack布局采用块的方式组织控件,pack(options,......),options参数可以选择:side、fill、padx/pady、anchor等。

    21-设置三个标签,使用pack方法布局。

    from tkinter import *

    win=Tk()

    label1=Label(win,text="擎天柱" ,bg="blue")

    label2=Label(win,text="大黄蜂",bg="yellow")

    label3=Label(win,text="救护车",bg="red")

    label1.pack()

    label2.pack()

    label3.pack()

    win.mainloop()

    pack布局默认将所涉及到的标签从上到下依次排列。要想改变标签的位置,可以使用side参数。

    22-使用side参数重新布局三个标签。

    from tkinter import *

    win=Tk()

    label1=Label(win,text="擎天柱",bg="blue")

    label2=Label(win,text="大黄蜂",bg="yellow")

    label3=Label(win,text="救护车",bg="red")

    label1.pack(side=LEFT)

    label2.pack(side=LEFT)

    label3.pack(side=LEFT)

    win.mainloop()

    此时三个标签会呈现水平排列,除了LEFT(从左往右排列),还有TOP(从上往下排列),BOTTOM(从下往上排列),RIGHT(从右往左排列)。在使用pack方法时,可以使用padx/pady设置控件边界与容器边界的距离。

    ipadx/ipady用来控制标签文字与标签容器x轴或y轴的距离。

    23-在标签大黄蜂上下增加10像素的间距。

    from tkinter import *

    win=Tk()

    label1=Label(win,text="擎天柱",bg="blue")

    label2=Label(win,text="大黄蜂",bg="yellow")

    label3=Label(win,text="救护车",bg="red")

    label1.pack(fill=X)

    label2.pack(pady=10)

    label3.pack(fill=X)

    win.mainloop()

    24-让大黄蜂标签x轴的间距是10。

    from tkinter import *

    win=Tk()

    label1=Label(win,text="擎天柱",bg="blue")

    label2=Label(win,text="大黄蜂",bg="yellow")

    label3=Label(win,text="救护车",bg="red")

    label1.pack()

    label2.pack(ipadx=10)

    label3.pack()

    win.mainloop()

    25-在窗口左下方建立一个内容为“OK”的标签,标签与窗口左边与下边的距离是10像素。

    from tkinter import *

    win=Tk()

    label=Label(win,text="OK",font="宋体 20 bold",bg="blue",fg="white")

    label.pack(anchor=W,side=LEFT,padx=10,pady=10)

    win.mainloop()

    grid布局:通过类似表格结构组织控件。

    grid(options,......),options参数可以是row、column、padx/pady、rowspan、columnspan、sticky等

    26-row与column使用体验。

    from tkinter import *

    win=Tk()

    label1=Label(win,text="擎天柱",bg="blue")

    label2=Label(win,text="大黄蜂",bg="yellow")

    label3=Label(win,text="救护车",bg="red")

    label4=Label(win,text="霸天虎",relief="raised")

    label5=Label(win,text="擎天柱",relief="raised")

    label6=Label(win,text="大黄蜂",relief="raised")

    label7=Label(win,text="救护车",relief="raised")

    label8=Label(win,text="霸天虎",relief="raised")

    label1.grid(row=0,column=0)

    label2.grid(row=0,column=1)

    label3.grid(row=0,column=2)

    label4.grid(row=0,column=3)

    label5.grid(row=1,column=0)

    label6.grid(row=1,column=1)

    label7.grid(row=1,column=2)

    label8.grid(row=1,column=3)

    win.mainloop()

    27-columnspan的使用

    from tkinter import *

    win=Tk()

    label1=Label(win,text="擎天柱",relief="raised")

    label2=Label(win,text="大黄蜂",relief="raised")

    label4=Label(win,text="霸天虎",relief="raised")

    label5=Label(win,text="擎天柱",relief="raised")

    label6=Label(win,text="大黄蜂",relief="raised")

    label7=Label(win,text="救护车",relief="raised")

    label8=Label(win,text="霸天虎",relief="raised")

    label1.grid(row=0,column=0)

    label2.grid(row=0,column=1,columnspan=2)

    label4.grid(row=0,column=3)

    label5.grid(row=1,column=0)

    label6.grid(row=1,column=1)

    label7.grid(row=1,column=2)

    label8.grid(row=1,column=3)

    win.mainloop()

    columnspan会将标签2、3合并成一个标签。columnspan控制在column方向上合并数量,rowspan表示在row方向上合并的数量。

    sticky类似anchor,但是只能设定N/S/W/E,即上/下/左/右

    28-sticky的使用

    from tkinter import *

    win=Tk()

    label1=Label(win,text="擎天柱",)

    label2=Label(win,bg="green",width=20)

    label3=Label(win,text="救护车")

    label4=Label(win,bg="blue",width=20)

    label1.grid(row=0,column=0,padx=5,pady=5,sticky=W)

    label2.grid(row=0,column=1,padx=5,pady=5)

    label3.grid(row=1,column=0,padx=5)

    label4.grid(row=1,column=1,padx=5)

    win.mainloop()

    place布局允许指定组件的大小与位置。

    29-place布局使用。

    from tkinter import *

    win=Tk()

    label1=Label(win,text="擎天柱",bg="blue")

    label2=Label(win,text="大黄蜂",bg="yellow")

    label3=Label(win,text="救护车",bg="red")

    label1.place(x=0,y=0)

    label2.place(x=30,y=50)

    label3.place(x=60,y=100)

    win.mainloop()

    此方法使用x/y参数,x和y参数可以直接设定窗口组件左上方的位置,x是向右递增,y是向下递增。

    使用width/height控制控件的实体大小。

    30-在窗口设置图片标签位置和大小。

    from tkinter import *

    win=Tk()

    win.geometry('800x600')

    picture1=PhotoImage(file=r'C:\Users\Administrator\Desktop\xingkong.png')

    label1=Label(win,image=picture1)

    label1.place(x=20,y=30,width=200,height=120)

    picture2=PhotoImage(file=r'C:\Users\Administrator\Desktop\user.png')

    label2=Label(win,image=picture2)

    label2.place(x=200,y=200,width=400,height=240)

    win.mainloop()

    relx/rely参数设置相对于父窗口的位置,relwidth/relheight参数设置相对大小。

    31-relx/rely与relwidth/relheight的应用。

    from tkinter import *

    win=Tk()

    win.geometry('600x400')

    picture1=PhotoImage(file=r"C:\Users\Administrator\Desktop\xingkong.png")

    label1=Label(win,image=picture1)

    label1.place(relx=0.1,rely=0.1,relwidth=0.8,relheight=0.8)

    win.mainloop()

    展开全文
    weixin_28715081 2021-02-03 03:38:31
  • 这时候,就需要使用 tkinter 提供的布局管理器帮助我们 组织、管理在父组件中子组件的布局方式。tkinter 提供了三 种管理器:pack、grid、place。 grid 布局管理器 grid 表格布局,采用表格结构组织组件。子组件的...

    布局管理器

    (注:有些组件的大小是不会随着窗口的拉伸变化的)
    一个 GUI 应用程序必然有大量的组件,这些组件如何排 布?这时候,就需要使用 tkinter 提供的布局管理器帮助我们 组织、管理在父组件中子组件的布局方式。tkinter 提供了三 种管理器:pack、grid、place。

    grid 布局管理器

    grid 表格布局,采用表格结构组织组件。子组件的位置由 行和列的单元格来确定,并且可以跨行和跨列,从而实现复杂的布局。

    grid()方法提供的选项
    在这里插入图片描述
    在这里插入图片描述
    grid 函数表

    函数名描述
    grid_slaves()以列表方式返回本控件的所有子控件对象
    grid_configure(option=value)给grid布局管理器设置属性,使用属性(option)= 取值(value)方式设置
    grid_propagate(boolean)设置为True表示父控件的几何大小由子控件决定(默认值),反之则无关
    grid_info()返回提供的选项所对应的值
    grid_forget()将控件隐藏并且忽略原有设置,对象依旧存在,可以用grid(option, …),将其显示
    grid_remove ()和grid_forget()类似。不过会记住当前的选项。重新.grid之后,会使用当前的选项
    grid_location(x, y)设定控件在屏幕中相对于容纳单元的(x,y)坐标,并返回grid系统中的哪个单元包含了该坐标(column,row)
    size()返回组件所包含的单元格,揭示组件大小
    grid_bbox(column=None, row=None, col2=None, row2=None)返回一个有四个元素的元组,用来描述控件内一些或者全部单元的边界。返回的前两个数为左上方区域的x,y坐标,后两个数为宽度和高度。 如果只传递了 column 和 row 参数,返回的参数描述的是该行列的单元的大小。如果传递了 col2 和 row2 参数,返回的参数描述的就是从 column 列 到 col2 列,以及从 row 行 到 row2 行总体区域的大小。
    grid_rowconfigure(index, **options)–设置行的属性 – 注意:设置的是该组件所拥有的grid序列 见行属性设定表
    grid_columnconfigure(index, **options)–设置列的属性-- 注意:设置的是该组件所拥有的grid序列 见列属性设定表

    如果要充满整个单元格,需要用这两个函数
    表:行属性设定表

    选项含义
    minsize指定该行的最小高度
    pad指定该行中最大网格的垂直边距
    weight–指定行与行之间的相对距离-- 默认值是0-- 说明:初创建窗口的时候,grid会自动根据组件的尺寸分配窗口的尺寸,当你拉伸窗口的尺寸就会有空白显示出来。这个选项正是指定行与行·之间是否填充空白,默认是不填充的。另外,该选项的值是指定填充空白的倍数,例如weight=2的列会比weight=1的列填充多一倍的空白,所以需要平均填充的话,只需要所有的列都设置为weight=1即可。
    【示例】grid 布局用法-登录界面设计
    from tkinter import *
    from tkinter import messagebox
    import random
    class Application(Frame):
        
        def __init__(self, master=None):
            super().__init__(master) # super()代表的是父类的定义,而不是父类对象
            self.master = master
            self.pack()
            self.createWidget()
        
        def createWidget(self):
            """通过 grid 布局实现登录界面"""
            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("400x90+200+300")
        app = Application(master=root)
        root.mainloop()
    
    【示例】通过 grid 布局-实现计算器软件界面。

    根据实际简易计算器的按键分布,设计一个相仿的计算器界 面,相应的功能暂不需要实现。
    可以设计成一个 7 行 4 列的表格布局,然后 将相应的按钮放置进去即可。

    from tkinter import *
    from tkinter import messagebox
    import random
    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("200x200+200+300")
        app = Application(master=root)
        root.mainloop()
    
    pack 布局管理器

    pack 按照组件的创建顺序将子组件添加到父组件中,按 照垂直或者水平的方向自然排布。如果不指定任何选项,默 认在父组件中自顶向下垂直添加组件。

    pack适合于少量的组件排序,所以在使用上是相当简单,一般添加组件后直接使用.pack()方法即可。但是如果想要对复杂的组件进行布局,那就要使用grid()或者Frame框架。
    (子控件可以覆盖父控件(使用参数 in_))

    pack()方法提供的选项
    在这里插入图片描述
    【老鸟建议】如上列出了 pack 布局所有的属性,但是不需要挨个熟悉,了解基本的即可。pack 适用于简单的垂直或水平排布,如果需要复杂的布局可以使用 grid 或 place
    pack的函数包括:
    在这里插入图片描述

    slaves()函数返回本控件的所有子控件对象。如果不使用pack(),就算已经实例化了子控件,slaves()也不会输出没有pack()的子控件。比如b4就不会输出。而b2和b3会被认为是b1的子控件
    propagate(flag) 函数————该函数决定父控件的大小是否与子控件有关。如果flag是True则父控件的大小为包括子控件的大小。如果flag是False,则表示父控件的大小与子控件无关。不过geometry()会让propagate()失效,窗口的大小由geometry()决定(会改变图像的位置以及完整性  改变组件的放置位置,会从头开始放)
    
    【示例】pack 布局用法,制作钢琴按键布局
    #测试 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):
        Button(f2,width=5,height=10,bg="black" if i%2==0 else"white").pack(side="left")
    root.mainloop()
    
    place 布局管理器

    place 布局管理器可以通过坐标精确控制组件的位置,适用 于一些布局更加灵活的场景。

    注:必须设定父控件的大小(不是主窗口)。否则,不会显示该控件和其子控件。place用起来很繁琐。需要注意很多事情。好处就是可以随心所欲的摆放控件。place()必须包含参数,否则控件不会显示
    place()方法的选项
    在这里插入图片描述
    注:in_不是可以随意指定放置的组件的,如果使用in这个参数这个组件必需满足:是其父容器或父容器的子组件,否则会报错

    place 函数
    在这里插入图片描述

    【示例】place 布局管理-扑克牌游戏 demo

    在这里插入图片描述

     """扑克牌游戏的界面设计"""
    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):
        """通过 place 布局管理器实现扑克牌位置控制"""
            # self.photo =
            PhotoImage(file="imgs/puke/puke1.gif")
            # self.puke1 = Label(self.master,image=self.photo)
            # self.puke1.place(x=10,y=50)
            self.photos =[PhotoImage(file="imgs/puke/puke"+str(i+1)+".gif") for i in range(10)]
            self.pukes =[Label(self.master,image=self.photos[i]) for i in range(10)]
            for i in range(10):
                self.pukes[i].place(x=10+i*40,y=50)
                # 为所有的 Label 增加事件处理
                self.pukes[0].bind_class("Label","<Button-1>",self.chupai)
                
        def chupai(self,event):
            print(event.widget.winfo_geometry())
            print(event.widget.winfo_y())
            if event.widget.winfo_y() == 50:
                event.widget.place(y=30)
            else:
                event.widget.place(y=50)
                
                
    if __name__ == '__main__':
        root = Tk()
        root.geometry("600x270+200+300")
        app = Application(master=root)
        root.mainloop()
    
    展开全文
    Huangqingmeng 2021-01-08 15:54:00
  • GUI 的全称是 ...虽然说tkinter不是GUI编程中最好的工具,但是tkinter用起来十分简单,著名的IDLE就是tkinter开发出来的。 一. 安装 tkinter 如果使用的是Anaconda Python的开发环境,不需要再安装tkinter...

    GUI 的全称是 Graphical User Interface ,即图形用户界面。本文首要任务是介绍Python默认的图形界面开发工具tkinter的用法。虽然说tkinter不是GUI编程中最好的工具,但是tkinter用起来十分简单,著名的IDLE就是tkinter开发出来的。

    一. 安装 tkinter
    因tkinter是python自带的GUI开发工具,所以不需要安装tkinter

    二. 利用tkinter开发GUI的基本步骤
    (1). 导入tkinter模块;
    (2). 通过导入的模块建立Tk类的实例(后面会详细描述),此时会创建窗口对象;
    (3). 通过title方法设置窗口的标题,通过geometry方法尺寸和位置等参数;
    (4). 创建控件类的实例,显示控件;
    (5). 建立主逻辑类,通过mainloop函数进入循环。

    三. 利用tkinter编写GUI的最小框架
    下文将编写一个tkinter创建窗口的最小代码,以让大家了解GUI开发的第一步:创建主窗口。

    # 导入tkinter模块
    import tkinter
    #创建TK()类的实例对象,也就是主窗口
    mainWindow = tkinter.Tk()
    # 通过title方法设置主窗口的标题
    mainWindow.title('利用tkinter开发GUI最小框架')
    # 设置窗口的大小及显示位置
    mainWindow.geometry('600x600+100+200')
    # 设置窗口背景颜色
    mainWindow['background'] = 'green'
    # 调用mainloop进入主循环
    tkinter.mainloop()
    

    运行的结果:
    在这里插入图片描述
    这里对上面的代码作详细的说明:

    1. 文中的第2行是导入tkinter模块,这是使用tkinter必有的操作;
    2. 第4行代码创建了Tk类的实例,Tk类创建的实例对象是一个窗口,也就是我们这里的主窗口。
    3. 第6行代码是通过title方法来设置窗口的标题,大家可以直接复制代码运行就可以看见;
    4. 第8行代码是通过geometry方法来设置窗口的尺寸和位置。geometry函数接收的参数是字符串,其形式是'widthxheight+x+y',其中width代表窗口的宽度,height代表窗口的高度,x代表窗口的横坐标,y代表窗口的纵坐标。请注意高度和宽度是用x来连接的,后面都是用+号。
    5. 第10行代码中用了"[]",从这一点可以看到背景色是窗口的一个属性,所以这一行代码是设置了窗口的背景色属性。
    6. 第12行代码是令窗口一直展现在屏幕上。

    四 . 控件
    这个窗口空空如也,里面什么都没用,我相信你是不会喜欢这个界面的。现在叫我们向里面添加一些控件。

    1. Label控件(标签)
      Label类所创建的实例是一个标签,如下:
      在这里插入图片描述
      其中的文字部分就是一个标签,我们可以设置这个标签中文字的内容,字体,字号和颜色等一系列的参数,具体的参数如下表:
      (1). text : 用来设置文字的内容;
      (2).fg: 文字的颜色;
      (3). bg: 文字的背景色;
      (4).font:设置字体和字号;
      (5). widthheight:设置标签的宽度和高度.
      这里写一个简单的语法:
    label = tkinter.Label(mainWindow,text = '内容',
                           fg = '颜色',bg = '颜色',
                           font=('字体',12),width = 50,height = 1)
    

    这里接着上面的代码写入一个标签,显示的内容是‘创建暴雪游戏通行证,开启您的冒险旅程’

    # 导入tkinter模块
    import tkinter
    #创建TK()类的实例对象,也就是主窗口
    mainWindow = tkinter.Tk()
    # 通过title方法设置主窗口的标题
    mainWindow.title('利用tkinter开发GUI最小框架')
    # 设置窗口的大小及显示位置
    mainWindow.geometry('600x600+100+200')
    # 设置窗口背景颜色
    mainWindow['background'] = 'green'
    # 创建一个标签
    label1 = tkinter.Label(mainWindow,text = '创建暴雪游戏通行证,开启您的冒险旅程',
                           fg = 'white',bg = 'black',font=('黑体',12),width = 50,height = 1)
    label1.pack()
    # 调用mainloop进入主循环
    tkinter.mainloop()
    

    运行结果:
    在这里插入图片描述
    上面代码中pack()是一种布局,后面会详细介绍,大家先打上就行。

    有时我们需要改变标签中的内容,最简单的方法就是将Label控件和一个变量绑定,修改变量就可以修改标签内容。下面写一个实例代码:

    from tkinter import StringVar
    var = StringVar()
    var.set('创建暴雪游戏通行证,开启您的冒险旅程')
    print(var.get())
    

    其中StringVartkinter的一个类,var是类的实例。set方法用来设置var的值,get方法用于获取var的值,将上面的代码重写:

    # 导入tkinter模块
    import tkinter
    from tkinter import StringVar
    #创建TK()类的实例对象,也就是主窗口
    mainWindow = tkinter.Tk()
    # 通过title方法设置主窗口的标题
    mainWindow.title('利用tkinter开发GUI最小框架')
    # 设置窗口的大小及显示位置
    mainWindow.geometry('600x600+100+200')
    # 设置窗口背景颜色
    mainWindow['background'] = 'green'
    # 创建一个标签
    var = StringVar()
    var.set('创建暴雪游戏通行证,开启您的冒险旅程')
    label1 = tkinter.Label(mainWindow,text = var.get(),
                           fg = 'white',bg = 'black',font=('黑体',12),width = 50,height = 1)
    label1.pack()
    # 调用mainloop进入主循环
    tkinter.mainloop()
    

    运行的结果和上面是一样的。

    展开全文
    RaccoonMan 2019-11-15 08:59:32
  • 使用python设计程序图形界面时,使用的布局管理器

    文章更新于:2020-04-25
    注0:原英文教程地址:zetcode.com
    注1:Introduction to Tkinter 参见:关于Tkinter的介绍
    注2:Layout management in Tkinter 参见:Tkinter布局管理器
    注3:Tkinter widgets 参见:Tkinter 控件

    Layout management in Tkinter

    In this part of the Tkinter tutorial, we introduce layout managers.

    在这一章,我们学习Tkinter布局管理器。

    When we design the GUI of our application, we decide what widgets we will use and how we will organise those widgets in the application. To organise our widgets, we use specialised non-visible objects called layout managers.

    There are two kinds of widgets: containers and their children. The containers group their children into suitable layouts.

    Tkinter has three built-in layout managers: the pack, grid, and place managers. The place geometry manager positions widgets using absolute positioning. The pack geometry manager organises widgets in horizontal and vertical boxes. The grid geometry manager places widgets in a two dimensional grid.

    在我们为程序设计图形界面的时候,我们需要决定使用哪些控件以及如何组织这些控件。为了组织这些控件,我们需要指定一个叫做布局管理器的不可见对象。
    总的来说,只有两种控件:容器和他们的子控件。容器把他们的子控件放在一个合适的布局里。

    Absolute positioning

    In most cases, programmers should use layout managers. There are a few situations where we could use absolute positioning. In absolute positioning, the programmer specifies the position and the size of each widget in pixels. The size and the position of a widget do not change if we resize a window. Applications look different on various platforms, and what looks OK on Linux, might not look OK on Mac OS. Changing fonts in our application might spoil the layout. If we translate our application into another language, we must redo our layout.

    在很多情况下,程序应当使用布局管理器。毕竟适合使用绝对定位的很少。在绝对定位中,程序为每一个控件指定大小和精确到像素的位置。当我们重新设置窗口大小的时候,控件的大小和位置并不会改变。在不同的平台,程序看起来均不相同。可能你在Linux上看着比较OK,但是到了Mac上就不行了。在程序中改变字体还有可能会挤爆布局。当我们改变我们程序的语言时,我们必须重新调整我们的布局。

    from PIL import Image, ImageTk
    from tkinter import Tk, BOTH
    from tkinter.ttk import Frame, Label, Style
    
    class Example(Frame):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
    
        def initUI(self):
    
            self.master.title("Absolute positioning")
            self.pack(fill=BOTH, expand=1)
    
            Style().configure("TFrame", background="#333")
    
            bard = Image.open("bardejov.jpg")
            bardejov = ImageTk.PhotoImage(bard)
            label1 = Label(self, image=bardejov)
            label1.image = bardejov
            label1.place(x=20, y=20)
    
            rot = Image.open("rotunda.jpg")
            rotunda = ImageTk.PhotoImage(rot)
            label2 = Label(self, image=rotunda)
            label2.image = rotunda
            label2.place(x=40, y=160)
    
            minc = Image.open("mincol.jpg")
            mincol = ImageTk.PhotoImage(minc)
            label3 = Label(self, image=mincol)
            label3.image = mincol
            label3.place(x=170, y=50)
    
    
    def main():
    
        root = Tk()
        root.geometry("300x280+300+300")
        app = Example()
        root.mainloop()
    
    
    if __name__ == '__main__':
        main()
    

    In this example, we place three images using absolute positioning. We use the place geometry manager.

    在这个例子中,我们使用绝对定位放置了三个图片。我们使用了place布局管理器。

    from PIL import Image, ImageTk
    

    We use Image and ImageTk from the Python Imaging Library (PIL) module.

    我们使用python中 PIL 模块的 Image 和 ImageTk。
    如果 PIL 模块不存在,可使用 pip install pillow 来进行安装

    style = Style()
    style.configure("TFrame", background="#333")
    

    We configure our frame to have a dark gray background using styles.

    我们使用样式配置我们的框架为黑灰色背景。

    bard = Image.open("bardejov.jpg")
    bardejov = ImageTk.PhotoImage(bard)
    

    We create an image object and a photo image object from an image in the current working directory.

    我们从当前工作目录下的一个图像创建了一个 Image 对象和一个 ImageTk 对象

    label1 = Label(self, image=bardejov)
    

    We create a Label with an image. Labels can contain text or images.

    我们创建了一个图像标签。标签可以包含文字或者图像。

    label1.image = bardejov
    

    We must keep the reference to the image to prevent image from being garbage collected.

    我们必须保证持续引用该图像,以防止该图像被当作垃圾给处理。

    label1.place(x=20, y=20)
    

    The label is placed on the frame at x=20 and y=20 coordinates.

    这个标签被放置在框架中坐标为20x20的位置。
    图片1

    Tkinter pack manager

    The pack geometry manager organises widgets in horizontal and vertical boxes. The layout is controlled with the fill, expand, and side options.

    pack布局管理器将控件组织成水平和垂直的框。布局控制器的属性有:fill、expand 和 side 选项。

    Buttons example

    In the following example, we position two buttons in the bottom-right corner of the window. We use the pack manager.

    在下面这个例子中,我们使用pack管理器放置了两个按钮在窗口的右下角。

    from tkinter import Tk, RIGHT, BOTH, RAISED
    from tkinter.ttk import Frame, Button, Style
    
    class Example(Frame):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
    
        def initUI(self):
    
            self.master.title("Buttons")
            self.style = Style()
            self.style.theme_use("default")
    
            frame = Frame(self, relief=RAISED, borderwidth=1)
            frame.pack(fill=BOTH, expand=True)
    
            self.pack(fill=BOTH, expand=True)
    
            closeButton = Button(self, text="Close")
            closeButton.pack(side=RIGHT, padx=5, pady=5)
            okButton = Button(self, text="OK")
            okButton.pack(side=RIGHT)
    
    
    def main():
    
        root = Tk()
        root.geometry("300x200+300+300")
        app = Example()
        root.mainloop()
    
    
    if __name__ == '__main__':
        main()
    

    We have two frames. There is the base frame and an additional frame, which expands in both directions and push the two buttons to the bottom of the base frame. The buttons are placed in a horizontal box and placed to the right of this box.

    我们有两个框架,一个是基本的框架,另一个是附加的在两个方向上扩展的框架用来将两个按钮推向基本框架的底部。这个按钮放在一个水平框的右边。

    frame = Frame(self, relief=RAISED, borderwidth=1)
    frame.pack(fill=BOTH, expand=True)
    

    We create another Frame widget. This widget takes the bulk of the area. We change the border of the frame so that the frame is visible; by default it is flat.

    我们创建了另一个框架控件,它占据了大部分空间。我们改变框架的框线以让其可见,在默认情况下,它是平的。

    closeButton = Button(self, text="Close")
    closeButton.pack(side=RIGHT, padx=5, pady=5)
    

    A closeButton is created. It is put into a horizontal box. The side parameter causes the button to be placed to the right of the horizontal. The padx and the pady parameters put some space between the widgets. The padx puts some space between the button widgets and between the closeButton and the right border of the root window. The pady puts some space between the button widgets and the borders of the frame and the borders of the root window.

    这里创建了一个关闭按钮,它被放在水平框中。side参数将按钮放在框的右边。padx 和 pady 参数在两个控件之间放在一些空白。padx 参数在两个按钮控件和关闭按钮与根窗口的右框线之间放空白,pady 在两个按钮和框架的框线与根窗口的框线之间放空白。

    okButton.pack(side=RIGHT)
    

    The okButton is placed next to the closeButton with 5 px space between them.

    ok按钮被放在close按钮旁边,并且他们之间有5像素空白。
    图片2

    Review example

    The pack manager is a simple layout manager. It can be used to do simple layout tasks. In order to create more complicated layouts, we need to utilise more frames, each having its own pack manager.

    pack管理器是一个简单的管理器,它用来处理一些简单的布局任务。为了创建更复杂的布局,我们需要使用更多的框架,而且每一个框架都有独立的pack管理器来控制。

    from tkinter import Tk, Text, TOP, BOTH, X, N, LEFT
    from tkinter.ttk import Frame, Label, Entry
    
    
    class Example(Frame):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
    
        def initUI(self):
    
            self.master.title("Review")
            self.pack(fill=BOTH, expand=True)
    
            frame1 = Frame(self)
            frame1.pack(fill=X)
    
            lbl1 = Label(frame1, text="Title", width=6)
            lbl1.pack(side=LEFT, padx=5, pady=5)
    
            entry1 = Entry(frame1)
            entry1.pack(fill=X, padx=5, expand=True)
    
            frame2 = Frame(self)
            frame2.pack(fill=X)
    
            lbl2 = Label(frame2, text="Author", width=6)
            lbl2.pack(side=LEFT, padx=5, pady=5)
    
            entry2 = Entry(frame2)
            entry2.pack(fill=X, padx=5, expand=True)
    
            frame3 = Frame(self)
            frame3.pack(fill=BOTH, expand=True)
    
            lbl3 = Label(frame3, text="Review", width=6)
            lbl3.pack(side=LEFT, anchor=N, padx=5, pady=5)
    
            txt = Text(frame3)
            txt.pack(fill=BOTH, pady=5, padx=5, expand=True)
    
    
    def main():
    
        root = Tk()
        root.geometry("300x300+300+300")
        app = Example()
        root.mainloop()
    
    
    if __name__ == '__main__':
        main()
    

    The example shows how to create a more complex layout with multiple frames and pack managers.

    这个例子展示的如何利用 fromes 和 pack 创建更加复杂的布局。

    self.pack(fill=BOTH, expand=True)
    

    The first frame is the base frame, on which other frames are placed. Note that in addition to organising children within frames, we also manage the frames on the base frame.

    这里第一个框架是基本框架,用于承载其他框架。注意:基本框架不仅要组织其子控件,还需要管理框架中的框架。

    frame1 = Frame(self)
    frame1.pack(fill=X)
    
    lbl1 = Label(frame1, text="Title", width=6)
    lbl1.pack(side=LEFT, padx=5, pady=5)
    
    entry1 = Entry(frame1)
    entry1.pack(fill=X, padx=5, expand=True)
    

    The first two widgets are placed on the first frame. The entry is horizontally streched with the fill and the expand parameters.

    第一组两个控件被放在第一个框架中。表现为一个带有填充和扩展属性的条形框。

    frame3 = Frame(self)
    frame3.pack(fill=BOTH, expand=True)
    
    lbl3 = Label(frame3, text="Review", width=6)
    lbl3.pack(side=LEFT, anchor=N, padx=5, pady=5)
    
    txt = Text(frame3)
    txt.pack(fill=BOTH, pady=5, padx=5, expand=True)
    

    Inside the third frame, we place a label and a text widget. The label is anchored to the north. The text widget takes the whole remaining area.

    在第三个框架中,我们放置了一个标签和一个文本框。这个标签被固定在北方,而文本框则拥有剩下的所有空间。
    图片3

    Tkinter grid manager

    The Tkinter’s grid geometry manager is used to create a skeleton of a calculator.

    使用Tkinter 几何管理器创建计算器的框架。

    from tkinter import Tk, W, E
    from tkinter.ttk import Frame, Button, Entry, Style
    
    class Example(Frame):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
    
        def initUI(self):
    
            self.master.title("Calculator")
    
            Style().configure("TButton", padding=(0, 5, 0, 5),
                font='serif 10')
    
            self.columnconfigure(0, pad=3)
            self.columnconfigure(1, pad=3)
            self.columnconfigure(2, pad=3)
            self.columnconfigure(3, pad=3)
    
            self.rowconfigure(0, pad=3)
            self.rowconfigure(1, pad=3)
            self.rowconfigure(2, pad=3)
            self.rowconfigure(3, pad=3)
            self.rowconfigure(4, pad=3)
    
            entry = Entry(self)
            entry.grid(row=0, columnspan=4, sticky=W+E)
            cls = Button(self, text="Cls")
            cls.grid(row=1, column=0)
            bck = Button(self, text="Back")
            bck.grid(row=1, column=1)
            lbl = Button(self)
            lbl.grid(row=1, column=2)
            clo = Button(self, text="Close")
            clo.grid(row=1, column=3)
            sev = Button(self, text="7")
            sev.grid(row=2, column=0)
            eig = Button(self, text="8")
            eig.grid(row=2, column=1)
            nin = Button(self, text="9")
            nin.grid(row=2, column=2)
            div = Button(self, text="/")
            div.grid(row=2, column=3)
    
            fou = Button(self, text="4")
            fou.grid(row=3, column=0)
            fiv = Button(self, text="5")
            fiv.grid(row=3, column=1)
            six = Button(self, text="6")
            six.grid(row=3, column=2)
            mul = Button(self, text="*")
            mul.grid(row=3, column=3)
    
            one = Button(self, text="1")
            one.grid(row=4, column=0)
            two = Button(self, text="2")
            two.grid(row=4, column=1)
            thr = Button(self, text="3")
            thr.grid(row=4, column=2)
            mns = Button(self, text="-")
            mns.grid(row=4, column=3)
    
            zer = Button(self, text="0")
            zer.grid(row=5, column=0)
            dot = Button(self, text=".")
            dot.grid(row=5, column=1)
            equ = Button(self, text="=")
            equ.grid(row=5, column=2)
            pls = Button(self, text="+")
            pls.grid(row=5, column=3)
    
            self.pack()
    
    
    def main():
    
        root = Tk()
        app = Example()
        root.mainloop()
    
    
    if __name__ == '__main__':
        main()
    

    The grid manager is used to organize buttons in the frame container.

    grid管理器用于组织在框架容器中的按钮。

    Style().configure("TButton", padding=(0, 5, 0, 5),font='serif 10')
    

    We configure the Button widget to have a specific font and to have some internal padding.

    我们给按钮设定一个指定的字体和一些内边距。

    self.columnconfigure(0, pad=3)
    ...
    self.rowconfigure(0, pad=3)
    

    We use the columnconfigure() and the rowconfigure() methods to define some space in grid columns and rows. This way we achieve that the buttons are separated by some space.

    我们使用 columnconfigure() 和 rowconfigure() 方法来定义一些 grid 行和列中的空白。这种方法可以让按钮被被空白分隔开。

    entry = Entry(self)
    entry.grid(row=0, columnspan=4, sticky=W+E)
    

    The Entry widget is where the digits are displayed. The widget is placed in the first row and it spans all four columns. Widgets may not occupy all the space allotted by cells in the grid. The sticky parameter expands the widget in a given direction. In our case we ensure that the entry widget is expanded from left to right.

    输入框用于显示数字。这个控件被放在第一行并且跨越所有列。在 grid 中,控件可能并不占据单元格分配的所有空白。而 sticky 参数将在给定的方向上扩展控件。在我们这个例子中,我们需要确保输入框从左扩展到右。

    cls = Button(self, text="Cls")
    cls.grid(row=1, column=0)
    

    The cls button is placed in the second row and first column. Note that the rows and columns start at zero.

    这个 cls 按钮被放置在第二行第一列。需要注意的是行和列是从0开始数的。

    self.pack()
    

    The pack() method shows the frame widget and gives it initial size. If no other parameters are given, the size will be just enough to show all children. This method packs the frame widget to the toplevel root window, which is also a container. The grid geometry manager is used to organize buttons in the frame widget.

    pack() 方法显示框架并且给定一个初始大小。如果没有其他参数,框架的大小将仅仅能容纳所有子控件而已。这个方法将框架放在了也算是一个容器的根窗口的最上方。grid 几何管理器经常被用来在框架控件中组织按钮。
    图四

    Windows example

    The following example creates the windows dialog using the grid geometry manager.

    下面这个例子将使用 grid 几何管理器创建一个对话框。

    from tkinter import Tk, Text, BOTH, W, N, E, S
    from tkinter.ttk import Frame, Button, Label, Style
    
    
    class Example(Frame):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
    
        def initUI(self):
    
            self.master.title("Windows")
            self.pack(fill=BOTH, expand=True)
    
            self.columnconfigure(1, weight=1)
            self.columnconfigure(3, pad=7)
            self.rowconfigure(3, weight=1)
            self.rowconfigure(5, pad=7)
    
            lbl = Label(self, text="Windows")
            lbl.grid(sticky=W, pady=4, padx=5)
    
            area = Text(self)
            area.grid(row=1, column=0, columnspan=2, rowspan=4,
                padx=5, sticky=E+W+S+N)
    
            abtn = Button(self, text="Activate")
            abtn.grid(row=1, column=3)
    
            cbtn = Button(self, text="Close")
            cbtn.grid(row=2, column=3, pady=4)
    
            hbtn = Button(self, text="Help")
            hbtn.grid(row=5, column=0, padx=5)
    
            obtn = Button(self, text="OK")
            obtn.grid(row=5, column=3)
    
    
    def main():
    
        root = Tk()
        root.geometry("350x300+300+300")
        app = Example()
        root.mainloop()
    
    
    if __name__ == '__main__':
        main()
    

    In this example, we use a Label widget, a Text widget, and four buttons.

    在这个例子中,我们使用一个标签控件,一个文本框,和四个按钮。

    self.columnconfigure(1, weight=1)
    self.columnconfigure(3, pad=7)
    self.rowconfigure(3, weight=1)
    self.rowconfigure(5, pad=7)
    

    We define some space among widgets in the grid. The weight parameter makes the second column and fourth row growable. This row and column is occupied by the text widget, so all the extra space is taken by it.

    我们在 grid 的标签中定义了一些空白。weight参数让第二列和第四行大小可调。因为这一行和列都被文本框占据,所以额外的空白也被他占据了。

    lbl = Label(self, text="Windows")
    lbl.grid(sticky=W, pady=4, padx=5)
    

    The label widget is created and put into the grid. If no column and row is specified, then the first column or row is assumed. The label sticks to the west and it has some padding around its borders.

    标签控件也被创建并放在 grid 中。如果没有指定行和列,则默认是第一行第一列。标签将显示在西方向,而且在它的框线周围有一定的边距。

    area = Text(self)
    area.grid(row=1, column=0, columnspan=2, rowspan=4,
        padx=5, sticky=E+W+S+N)
    

    The text widget is created and starts from the second row and first column. It spans two columns and four rows. There is a 4 px space between the widget and the left border of the root window. Finally, the widget sticks to all the four sides. So when the window is resized, the text widget grows in all directions.

    文本框被创建并开始于第二行第一列。它跨越了两行四列。并且在这个控件的左边线和根窗口之间有4像素的空白。最后,控件的四个边都设置了操作杆,当窗口被重新设置大小时,文本框将在所有方向上扩展。

    abtn = Button(self, text="Activate")
    abtn.grid(row=1, column=3)
    
    cbtn = Button(self, text="Close")
    cbtn.grid(row=2, column=3, pady=4)
    

    These two buttons go next to the text widget.

    这两个按钮显示在文本框的旁边。

    hbtn = Button(self, text="Help")
    hbtn.grid(row=5, column=0, padx=5)
    
    obtn = Button(self, text="OK")
    obtn.grid(row=5, column=3)
    

    These two buttons go below the text widget; the Help button takes the first column, the Ok Button takes the last column.

    这两个按钮将显示在文本框的下方。其中 Help 按钮显示在第一列,Ok 按钮显示在最后一列。
    图片五

    In this part of the Tkinter tutorial, we have covered layout management of widgets.

    Tkinter 教程的本部分,我们学习了控件的布局管理器。

    展开全文
    qq_21516633 2019-11-29 13:50:29
  • weixin_39948111 2020-12-05 00:51:05
  • weixin_39631295 2020-11-21 01:22:32
  • zwq940103 2019-04-17 11:09:55
  • WoLykos 2019-01-15 13:40:00
  • 38KB weixin_38547532 2020-12-21 22:37:38
  • weixin_35381903 2021-01-14 16:52:17
  • nilvya 2020-05-17 11:09:01
  • weixin_39657094 2020-12-06 10:20:46
  • weixin_41098458 2018-08-17 17:49:44
  • 34KB weixin_38663415 2020-09-17 19:09:34
  • xpj8888 2021-10-09 20:49:11
  • weixin_45727931 2020-08-08 16:53:12
  • sniperzxl 2020-05-12 22:08:06
  • weixin_39623411 2020-12-08 18:22:30
  • diaoweisang7683 2019-10-03 06:15:25
  • weixin_39779537 2020-11-24 11:52:47

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,739
精华内容 1,095
关键字:

tkinter控件的布局管理器