Tkinter模块学习

在最近 使用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()
上一篇:python-使用通过TKinter在对象内部定义的图像按钮


下一篇:Tkinter 之Menu菜单标签