文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

聊聊Python中的GUI布局Tkinter

2024-12-03 16:52

关注

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

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. # 这里是窗口的内容 
  7. window.mainloop()

窗口内容

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

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

 

控件

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


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


tkinter绑定事件

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

  1. from tkinter import * 
  2.  
  3. def p_label(): 
  4.     global root 
  5.     Lb = Label(root, text='Runsen爱学习'
  6.     Lb.pack() 
  7.  
  8. root = Tk() 
  9. root.title("应用程序窗口"
  10. B_n = Button(root, text='点我', command=p_label, bg='red')  # command后面不能有任何的标点符号 
  11. B_n.pack() 
  12. 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.  
  8. for r in range(4): # 行循环 
  9.     for c in range(3): # 列循环 
  10.         label = Label(root, 
  11.                       relief=RAISED, # 设置边框格式 
  12.                       padx=10, # 加宽标签 
  13.                       text=labels[r][c]) # 标签文本 
  14.         label.grid(row=r, column=c) # 将标签放置在r行c列 
  15. root.mainloop() 

 

制作一个日历

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

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

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


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

 

丰富我们的日历

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

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

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

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

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

 

来源:Python之王内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯