聊聊Python中的GUI布局Tkinter

 现在极少有人会用上tkinter了,所以真正研究的人也就更少了,本来不想更新tkinter。看到很多人在学tkinter,其实用Python做布局,没有人这么干。但还是更新几节tkinter,在Python从入门到大师教程中来。

网站设计制作过程拒绝使用模板建站;使用PHP+MYSQL原生开发可交付网站源代码;符合网站优化排名的后台管理系统;做网站、网站建设收费合理;免费进行网站备案等企业网站建设一条龙服务.我们是一家持续稳定运营了十多年的创新互联网站建设公司。

tkinter

Tkinter包是Python附带的标准软件包,所以我们不需要安装任何东西就可以使用它。

窗口主体框架

每一个 tkinter 应用的主体框架都可以包含下面这部分. 定义 window 窗口 和 window的一些属性, 然后书写窗口内容, 最后执行window.mainloop让窗口活起来.

 
 
 
 
  1. import tkinter as tk
  2. window = tk.Tk()
  3. window.title('my window')
  4. window.geometry('200x100')
  5. # 这里是窗口的内容
  6. window.mainloop()

窗口内容

这次我们会建立一个用来描述的标签 tk.Label, 比如:

 
 
 
 
  1. import tkinter as tk
  2. window = tk.Tk()
  3. window.title('my window')
  4. window.geometry('200x100')
  5. l = tk.Label(window, 
  6.     text='OMG! this is TK!',    # 标签的文字
  7.     bg='green',     # 背景颜色
  8.     font=('Arial', 12),     # 字体和字体大小
  9.     width=15, height=2  # 标签长宽
  10.     )
  11. l.pack()    # 固定窗口位置
  12. window.mainloop()

控件

上面的Label就是一个控件,还有很多的,如按钮,标签和文本框等,如下图所示

控件自带的共同属性,如大小,字体和颜色等。可根据控件展现形式选择相应的属性,具体属性如下表:

tkinter绑定事件

tkinter绑定事件,就是定义一个函数,然后通过command属性传入函数名,下面通过Button绑定事件,点击就出现Runsen爱学习

 
 
 
 
  1. from tkinter import *
  2. def p_label():
  3.     global root
  4.     Lb = Label(root, text='Runsen爱学习')
  5.     Lb.pack()
  6. root = Tk()
  7. root.title("应用程序窗口")
  8. B_n = Button(root, text='点我', command=p_label, bg='red')  # command后面不能有任何的标点符号
  9. B_n.pack()
  10. root.mainloop()

布局显示

一个窗口都应该有布局,就是pack的时候需要设置side,expand需要扩展吗,fill需要填充吗

 
 
 
 
  1. from tkinter import *
  2. root = Tk()
  3. root.title("应用程序窗口")
  4. Button(root,text='1').pack(side=LEFT,expand=YES,fill=Y)
  5. Button(root,text='2').pack(side=TOP,expand=YES,fill=BOTH)
  6. Button(root,text='3').pack(side=RIGHT,expand=YES,fill=NONE)
  7. Button(root,text='4').pack(side=LEFT,expand=NO,fill=Y)
  8. Button(root,text='5').pack(side=TOP,expand=YES,fill=BOTH)
  9. Button(root,text='6').pack(side=BOTTOM,expand=YES)
  10. Button(root,text='7').pack(anchor=SE)
  11. root.mainloop()

除了pack还有一个grid,grid将组件布局为表格

下面做一个电话拨号盘GUI

 
 
 
 
  1. from tkinter import *
  2. root = Tk()
  3. labels = [['1','2','3'], # 文本,布局为网格
  4.           ['4','5','6'],
  5.           ['7','8','9'],
  6.           ['*','0','#']]
  7. for r in range(4): # 行循环
  8.     for c in range(3): # 列循环
  9.         label = Label(root,
  10.                       relief=RAISED, # 设置边框格式
  11.                       padx=10, # 加宽标签
  12.                       text=labels[r][c]) # 标签文本
  13.         label.grid(row=r, column=c) # 将标签放置在r行c列
  14. root.mainloop()

制作一个日历

上面教你做一个电话拨号盘GUI,下面能做一个简单的日历吗?

我看你就不会,不是我瞧不起你

放心,有我在。这需要导入calendar模块了,

 
 
 
 
  1. import calendar
  2. from tkinter import *
  3. root = Tk()
  4. labels = [['Mon','Tue','Wed','Thu','Fri','Sat','Sun']]
  5. MonthCal = calendar.monthcalendar(2020, 5) 
  6. for i in range(len(MonthCal)):
  7.     labels.append(MonthCal[i])
  8. for r in range(len(MonthCal)+1):
  9.     for c in range(7):
  10.         if labels[r][c] == 0:
  11.             labels[r][c] = ' '
  12.         label = Label(root,          
  13.                       padx=5,
  14.                       pady=5,
  15.                       text=str(labels[r][c]))        
  16.         label.grid(row=r,column=c)
  17. root.mainloop()

丰富我们的日历

上面的日历就是一个辣鸡,啥功能都没有,需求很简单,就是来两个按钮实现向上翻,向下翻。

向上翻,向下翻两个按钮就需要清空界面,再把日历加到labels列表中 ,放置日历。好像很简单,其实就是这么简单。

大家想一想,怎么做出来。我还是给标准实现代码

 
 
 
 
  1. # @Author:Runsen
  2. import calendar 
  3. from tkinter import *
  4. root = Tk()
  5. def LabelCal(Year, Month):
  6.     # 首行放置“年、月”的位置
  7.     label = Label(root,text=str(Year)+"年")
  8.     label.grid(row=0,column=2)
  9.     label = Label(root,text=str(Month)+"月")
  10.     label.grid(row=0,column=4)
  11.     # labels列表:放置“星期”的标题
  12.     labels = [['Mon','Tue','Wed','Thu','Fri','Sat','Sun']]
  13.     # 用calendar库计算日历
  14.     MonthCal = calendar.monthcalendar(Year, Month)
  15.     # 先把界面清空
  16.     for r in range(7):
  17.         for c in range(7):            
  18.             label = Label(root,
  19.                           width =5,
  20.                           padx=5,
  21.                           pady=5,
  22.                           text=' ')        
  23.             label.grid(row=r+1,column=c)
  24.     # 把日历加到labels列表中     
  25.     for i in range(len(MonthCal)):
  26.         labels.append(MonthCal[i])
  27.     # 放置日历
  28.     for r in range(len(MonthCal)+1):
  29.         for c in range(7):
  30.             if labels[r][c] == 0:
  31.                 labels[r][c] = ' '
  32.             label = Label(root,
  33.                           width =5,
  34.                           padx=5,
  35.                           pady=5,
  36.                           text=str(labels[r][c]))        
  37.             label.grid(row=r+1,column=c) # 网格布局
  38. # 默认日期
  39. Year, Month = 2020,5
  40. LabelCal(Year, Month)
  41.         
  42. # button:Enter
  43. def ButtonPrevious():
  44.     global Year, Month
  45.     Month = Month-1
  46.     if Month<1:
  47.         Month = Month+12
  48.         Year = Year-1
  49.     LabelCal(Year, Month)
  50.     
  51. button1 = Button(root, text='Previous', command=ButtonPrevious)
  52. button1.grid(row=len(MonthCal)+3, column=0)
  53. # button:Clear
  54. def ButtonNext():
  55.     global Year, Month
  56.     Month = Month+1
  57.     if Month>12:
  58.         Month = Month-12
  59.         Year = Year+1 
  60.     LabelCal(Year, Month)
  61.     
  62. button2 = Button(root, text='Next', command=ButtonNext)
  63. button2.grid(row=len(MonthCal)+3, column=6)
  64. root.mainloop()

运行一波,来一个最终实现gif效果图。

分享标题:聊聊Python中的GUI布局Tkinter
本文来源:http://www.hantingmc.com/qtweb/news11/61611.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联