Tkinter 1 应用窗口
Reference
- http://effbot.org/tkinterbook/tkinter-application-windows.htm
- http://effbot.org/tkinterbook/widget.htm
- http://effbot.org/tkinterbook/wm.htm
1 Class BaseWidget (Mics)
参考详细介绍 link, 可以被tk的实例化对象直接调用 (因为tk类继承了mics)
简介
baseWidget,获取一些基本信息,比如,获取窗口相关的一些信息,销毁窗口,剪切板的操作,事件的操作,焦点的设置和信息获取。
获取窗口相关的信息
winfo_atom
, winfo_atomname
, winfo_cells
, winfo_children
, winfo_class
, winfo_colormapfull
,winfo_containing
, winfo_depth
, winfo_exists
, winfo_fpixels
, winfo_geometry
, winfo_height
, winfo_id
, winfo_interps
, winfo_ismapped
, winfo_manager
, winfo_name
, winfo_parent
, winfo_pathname
,winfo_pixels
, winfo_pointerx
, winfo_pointerxy
, winfo_pointery
, winfo_reqheight
, winfo_reqwidth
, winfo_rgb
, winfo_rootx
, winfo_rooty
, winfo_screen
, winfo_screencells
, winfo_screendepth
,winfo_screenheight
, winfo_screenmmheight
, winfo_screenmmwidth
, winfo_screenvisual
, winfo_screenwidth
, winfo_server
, winfo_toplevel
, winfo_viewable
, winfo_visual
, winfo_visualid
,winfo_visualsavailable
, winfo_vrootheight
, winfo_vrootwidth
, winfo_vrootx
, winfo_vrooty
, winfo_width
, winfo_x
, winfo_y
比如获取窗口的大小,winfo_reqwidth(), winfo_reqwidth
获取屏幕大小,winfo_screenheight, winfo_screenheight()
事件相关
event_add
, event_delete
, event_generate
, event_info
bind
, bind_all
, bind_class
, bindtags
focus
, focus_displayof
, focus_force
, focus_get
, focus_lastfor
, focus_set
tk_focusFollowsMouse
, tk_focusNext
, tk_focusPrev
2 窗口管理器(Class Wm)
参考详细介绍 link, 可以被tk的实例化对象直接调用 (因为tk类继承了wm类)
简介
Wm类包含一系列窗口管理相关的操作,比如设置窗口,位置,大小,是否可调,设置窗口图标,标题和属性,将函数和命令绑定,等等
设置窗口位置和大小
-
tk.Tk().geometry(size)
-
tk.Tk().resizable(width=None, height=None)
(resizable(0,0)表示窗口横向和纵向不可变。width和height都是布尔类型)
-
tk.Tk().maxsize()
-
tk.Tk().minsize()
import tkinter as tk def get_screen_size(window): return window.winfo_screenwidth(),window.winfo_screenheight() def get_window_size(window): return window.winfo_reqwidth(),window.winfo_reqheight() def center_window(root, width, height): screenwidth = root.winfo_screenwidth() screenheight = root.winfo_screenheight() size = '%dx%d+%d+%d' % (width, height, (screenwidth - width)/2, (screenheight - height)/2) print(size) root.geometry(size) root = tk.Tk() root.title('测试窗口') center_window(root, 300, 240) root.maxsize(600, 400) root.minsize(300, 240) ttk.Label(root, relief = tk.FLAT, text = '屏幕大小(%sx%s)\n窗口大小(%sx%s)' % (get_screen_size(root) + get_window_size(root))).pack(expand = tk.YES) tk.mainloop()
设置窗口图标
- 在windows下,直接
root.iconbitmap('hello.ico')
就行,但是该方法在Linux和mac上不能用 - 参考, Tkinter Logo的设置 error reading bitmap
3 应用窗口之菜单栏
可以通过Menu或Menubutton组件进行创建 (Menubutton不推荐)。Menu主要通过add_command , add_cascade 和add_separator函数来创建
from tkinter import *
def callback():
print "called the callback!"
root = Tk()
# create a menu
menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=callback)
filemenu.add_command(label="Open...", command=callback)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=callback)
helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=callback)
mainloop()
4 应用窗口之工具栏
可以通过创建Frame组件,然后在Frame上放置一些Button组件来实现工具栏
from tkinter import *
root = Tk()
def callback():
print "called the callback!"
# create a toolbar
toolbar = Frame(root)
b = Button(toolbar, text="new", width=6, command=callback)
b.pack(side=LEFT, padx=2, pady=2)
b = Button(toolbar, text="open", width=6, command=callback)
b.pack(side=LEFT, padx=2, pady=2)
toolbar.pack(side=TOP, fill=X)
mainloop()
5 应用窗口之状态栏
一般在应用程序的底部都会有状态栏,显示一些状态信息。它可以通过一下方式实现
- 直接通过创建Label组件,然后修改其Text属性来显示状态信息
status = Label(master, text=s "", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill=X)
- 通过自定义/创建 状态栏类 来实现,如下
from tkinter import *
class StatusBar(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.label = Label(self, bd=1, relief=SUNKEN, anchor=W)
self.label.pack(fill=X)
def set(self, format, *args):
self.label.config(text=format % args)
self.label.update_idletasks()
def clear(self):
self.label.config(text="")
self.label.update_idletasks()
root = Tk()
status = StatusBar(root)
status.pack(side=BOTTOM, fill=X)
菜单栏工具栏状态栏
# -*- coding:utf-8 -*-
'''
Python GUI with Tkinter-11-Adding the Status Bar
'''
from Tkinter import *
def doNothing():
print("ok ok I won't...")
root = Tk()
# ***** Main Menu *****
menu = Menu(root)
root.config(menu=menu)
subMenu = Menu(menu)
menu.add_cascade(label="File", menu=subMenu)
subMenu.add_command(label="New Project...", command=doNothing)
subMenu.add_command(label="New...", command=doNothing)
subMenu.add_separator()
subMenu.add_command(label="Exit", command=doNothing)
editMenu = Menu(menu)
menu.add_cascade(label="Edit", menu=editMenu)
editMenu.add_command(label="Redo", command=doNothing)
# ***** Toolbar *****
toolbar = Frame(root, bg="blue")
insertBtn = Button(toolbar, text="Insert Image", command=doNothing)
insertBtn.pack(side=LEFT, padx=2, pady=2)
printBtn = Button(toolbar, text="Print", command=doNothing)
printBtn.pack(side=LEFT, padx=2, pady=2)
toolbar.pack(side=TOP, fill=X)
# ***** Status Bar *****
status = Label(root, text="Preparing to do nothing...", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill=X)
root.geometry('500x300')
root.mainloop()