Our tkinter GUI will not become visible until we start the main event loop and, to do that, we use root.mainloop()
分层管理
win = tk.Tk()
monty = ttk.LabelFrame(win,text = 'Monty Python')
monty.grid(column = 0,row = 1)
### Tk类型
创建GUI form
tk.Tk()
tkinter types,变量类型
我们可以保存数据从GUI的变量中,以至于我们可以使用这些数据,我们能够设置或者得到它们的值,十分像get或者set方法。
tkinter types | instruction |
---|---|
strVar = StringVar() | holds as |
intVar = IntVar() | an interger |
dbVar = DoubleVar() | float |
blVar = BooleanVar() | boolean |
import tkinter as tk
strData = tk.Stringvar()
strData.set('dhshdkas')
varData = strData.get()
print(varData)
- get data from a widget
get() method
widget.get():得到数据
callback function
- 在GUI中,页面一直在等待事件发生,比如我点击了一个按钮,我们必须把这个按钮与一个事件绑定(handle),如果我们没有创建一个event handler ,点击这个按钮,我们得不到任何的响应。(原理有点类似中断处理函数)
- 我们称这个event handle为callback function。
- callback function很被动,like gui 等待唤醒激活。
- callback function通常实现一些处理,然后将结果返回给GUI
- 实现方式:command argument(command = self.callback_function)
Ceckbutton组件
Checkbutton widgets:tk.Checkbutton()
传入参数为:gui参数,变量参数,状态参数。
import tkinter as tk
chVarDis = tk.IntVar()
check1 = tk.Checkbutton(monty,text = "Disableed",variable = chVarDis,state = 'disable')
check1.select()
check1.grid(column = 0,row = 4,sticky = tk.W)
menu bars 组件
- creating menu bar
先生成menuBar,然后在menuBar.add_cascade(),生成一行的菜单按钮。
然后在生成一个filemenu,在menuBar上。将这个filemenu.add_command()来添加命令。如下逻辑,其实层次关系。第一层为menuBar,在win生成,用add_cascade来生成第一层的菜单。第二层为filemenu,在menuBar生成,通过add_command来添加子菜单。- add_cascade(label,menu):生成下一级的子菜单;menu为下一级的菜单。下一级的菜单由Menu()实例化生成。
- add_command(label,command);通过command回调函数,来实现点击这个菜单之后所执行的动作。
from tkinter import Menu
menubar = Menu(win)
win.config(menu = menuBar)
fileMenu = Menu(menuBar,tearoff =0)#去掉虚线
helpMenu = Menu(menuBar,tearoff = 0)
fileMenu.add_command(label = "New")
fileMenu.add_separator()
fileMenu.add_command(label ="Exit" )
menuBar.add_cascade(label = "File",menu = fileMenu)
scrolledtext组件
文本输入框,可换行,用于显示
from tkinter import scrolledtext
scr = scrolledtext.ScrolledText(monty,width = scrolW,height = scrolH,wrap = tk.WORD)
scr.grid(column = 0,columnspan = 3,sticky = 'WE',row= 3)
messagebox组件
弹出消息用
messagebox.showinfo('Python Message Info Box', 'A Python GUI created using tkinter:\nThe year is 2015.')
messagebox.showwarning('Python Message Warning Box', 'A Python GUI created using ')
messagebox.showerror('Python Message Error Box', 'A Python GUI created using tkinter')
Radiobutton组件
选项按钮
tk.Radiobutton()
接收的参数,gui参数,变量类型参数,跳转命令参数。
import tkinter as tk
curRad = tk.Radiobutton(monty,text = colors[col],variable = radVar,value = col,command = radCall)
curRad.grid(column = col,row = 5,sticky = tk.W)
Spinbox组件
上面就是一个Spinbox,点击箭头可以加减数字。
spin = Spinbox(monty,values =(1,2,4,42,100,45), from_=0,to = 10,width = 5,bd = 8,command = _spin)#width是宽度,bd是深度
spin.grid(column = 0,row = 2)
ttk 组件类型(Widgets)
需要说明的,ttk的很多组件同Tkinter都是相同的,在这种情况下,ttk将覆盖Tkinter的组件,将采用ttk的特性。
原文如下
And then severalttk widgets (Button, Checkbutton, Entry, Frame, Label, LabelFrame, Menubutton,PanedWindow, Radiobutton, Scale and Scrollbar) will automatically substitutefor the Tk widgets.
- Button :ttk.Button( ):按钮菜单
- Combo box : ttk.Combobox( ):下拉菜单
- Text box : ttk.Entry( ):输入框
- Lable :ttk.Label( ):标签框
- LabelFrame :ttk.LabelFrame( ) 结构框架框
- Notebook:ttk.Notebook(win):Create a tab control!
- 例子:
class Labelframe(Widget):
Ttk Labelframe widget is a container used to group other widgets together. It has an optional label, which may be a plain text string or another widget.
monty2 =ttk.LabelFrame(tab2,text = "The Snake")
monty2.grid(column = 0,row = 0,padx = 8,pady = 4)
ttk组件的方法
组件都是可以一直在上一层的父类对象上生成的
tab1 = ttk.Frame(tabControl)
monty = ttk.LabelFrame(tab1,text = ‘Monty Python’)
ttk.Label(monty,text = “enter a name:”).grid(column = 0,row = 0,sticky = ‘W’)
逐层生成的。
- 传入GUI主参数,一个类模块
- 变量(varible),也是一个类模块
- 大小
- 状态
- 命令(点击之后跳转的函数)
方法
- config:用于重新设置配件显示的文本信息
- configure:设置配件的接收状态
- padx,pady:adding space horizontally and vertically is done by using the built-in properties
named padx and pady for child in labelsFrame.winfo_children()
: The winfo_children() function returns a list of all the children belonging to the labelsFrame variable- pick()几何管理器,用来设置部件沿着box的位置
- grid()管理器,用来设置部件布局的位置,按照行和列来布局,类似于矩阵形式。
you can’t use both grid and pack with widgets that have a common parent .
总结:
you cannot mix grid and pack within the same container
you can use both grid and pack within a single application. This is very, very common since each has strengths and weaknesses. I use both on a regular basis.
Ownship
- 每一层的对象比如Tk(),Frame(),LabelFrame(),Label()都可以当做容器来承载下一级的widgets。
- widget装入容器的模式,是继承父类成,然后调用父类的add方法,自己作为参数传入,建立与父类的联系。
例如:
tab3 = ttk.Frame(tabControl)
tabControl.add(tab3,text = 'Tab 3')