在最近 使用python的Tkinter模块自己写了些GUI界面,总结一下自己主要用到的组件和属性吧
创建一个GUI程序
- 导入tkinter模块
- 创建控件
- 指定这个控件的master,即这个控件属于哪一个
- 告诉GM(geometry manager)有一个控件产生了
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import tkinter
top = tkinter.Tk()
# 进入消息循环
top.mainloop()
主要用到的组件
Button:按钮控件
Button(window, command=search, text='查找')
解析:window:按钮显示在哪个窗口,command绑定了点击该按钮会触发的事件,text指按钮显示的字样
Label:标签控件,可以显示文本和位图
Label(window, text='书名:')
Entry:输入控件,用于显示简单的文本内容
pwd = StringVar()
Entry(manager, textvariable=pwd, show='*')
解析:pwd是存储输入的字符串变量,textvariable绑定的是变量的值,show表示显示出来形式,比如输入密码的时候显示出来的是***
几何管理(控件的布置)
Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,以下是Tkinter公开的几何管理类:包、网格、位置
(1)pack方法:包装
#常用的pack(), 多数按照上和左的方式排列,不指定时默认为上。
tk.Label(window,text='123nihao你好',fg='red').pack(side='top') # 上
tk.Label(window,text='123nihao你好',fg='red').pack(side='bottom') # 下
tk.Label(window,text='123nihao你好',fg='red').pack(side='left') # 左
tk.Label(window,text='123nihao你好',fg='red').pack(side='right') # 右
tk.Label(window,text='123nihao你好',fg='red').pack(anchor='n') # 北,效果同上
tk.Label(window,text='123nihao你好',fg='red').pack(anchor='s') # 南,效果同上
tk.Label(window,text='123nihao你好',fg='red').pack(anchor='w') # 西
tk.Label(window,text='123nihao你好',fg='red').pack(anchor='e') # 东
(2)grid方法:网格
#以规律的方格形式呈现。比如下面的代码就是创建一个三行三列的表格:参数row 为行,colum 为列,padx 单元格左右间距,pady单元格上下间距,ipadx单元格内部元素与单元格的左右间距,ipady单元格内部元素与单元格的上下间距。
for i in range(3):
for j in range(3):
l=tk.Label(window,text='123nihao你好',bg='yellow',font=('Arial', 12), width=10, height=2)
l.grid(row=i, column=j, padx=5, pady=10, ipadx=1, ipady=20)
(3)place方法:位置
tk.Label(window, text='Pl', font=('Arial', 20), ).place(x=20, y=100, anchor='nw')
tk.Label(window, text='Pl', font=('Arial', 20), ).place(x=20, y=200, anchor='nw')
tk.Label(window, text='Pl', font=('Arial', 20), ).place(x=80, y=100, anchor='nw')
tk.Label(window, text='Pl', font=('Arial', 20), ).place(x=80, y=200, anchor='nw')
注意
3种方式不要混在一起同时执行,会导致程序卡掉,暂不清楚原因
使窗口始终在屏幕的中间
tk = tkinter.Tk()
# 设置窗口居中
width = 300
height = 100
#分别得到屏幕的宽度和搞度
screenwidth = tk.winfo_screenwidth()
screenheight = tk.winfo_screenheight()
alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2)
tk.geometry(alignstr)
# 设置窗口大小不可改变,可以不写
tk.resizable(width=False,height=False)
tk.mainloop()
点击按钮后显示一个新的窗口
(1)显示新窗口的时候销毁原来的窗口
root = Tk()
root.geometry(500,300)
root.destroy()
global new
new = Tk()
new.geometry(500,300)
(2)在原来的窗口上生成一个子窗口(Toplevel)
root = Tk()
root.geometry(500,300)
new = Toplevel(root)
new.geometry(500,300)
让当前窗口始终在最前面
在打开子窗口时,比如在弹出messagebox的信息后,子窗口可能就会变成在主窗口之下,解决这个问题,就让当前窗口始终在最前
root = Tk()
root.geometry(500,300)
new = Toplevel(root)
new.geometry(500,300)
new..wm_attributes("-topmost", 1)
但是这样会出现一个问题就是,如果弹出提示信息的时候,提示框会被压在窗口之下,那么可以这样来解决,当要弹出提示框时,先将当前最前的窗口隐藏,等提示框点完后,再决定再显示还是销毁最前窗口
# 隐藏当前窗口
root.withdraw()
messagebox.showerror(message='没有该读者的信息')
# 显示隐藏的窗口
root.deiconify()