python学习GUI界面:tkinter
课内倒立摆控制系统可视化图像
第一课
实现:按钮按下显示文字
摘要:创建窗口的对象,窗口的标题部分属性,按钮的对象部分属性(重点是调用的函数)以及更新窗口
import tkinter as tk
window = tk.Tk()
'''创建窗口对象'''
window.title('my window')
window.geometry('200x200')
var = tk.StringVar()
l = tk.Label(window,textvariable=var,bg='green',font=('Arial',12),width=15,height=2)
'''标签的属性'''
l.pack()
'''pack放在上或下左右'''
on_hit = False
def hit_me():
global on_hit
if on_hit == False:
on_hit = True
var.set('You Hit Me!')
else:
on_hit = False
var.set('')
b = tk.Button(window,text='hit me',width=15,height=2,command=hit_me)
'''创建按钮对象,command为按下执行的函数命令'''
b.pack()
window.mainloop()
'''不断更新窗口'''
问题:怎么让显示屏只在按下按钮的时候显示
第二课
实现:文本框输入以及显示
摘要:创建文本框的对象及其部分属性,多个按钮的建立
e = tk.Entry(window,show=None)
'''创建输入框对象,show='*',会让输入的字符全为*,show='2'则输入的数字全为2'''
e.pack()
def insert_point():
var = e.get()
t.insert('insert',var)
def insert_end():
var = e.get()
t.insert('end',var)
'''insert(2.1)__在第二行第一列输入,从0开始数'''
b1 = tk.Button(window,text='insert point',width=15,height=2,command=insert_point)
'''创建按钮对象,command为按下执行的函数命令'''
b1.pack()
b2 = tk.Button(window,text='insert end',command=insert_end)
b2.pack()
t = tk.Text(window,height=2)
t.pack()
问题:如何禁止用户输出框输入字符
第三课
实现:选中选项框的选项并打印在显示区域
摘要:创建选项框的对象及其部分属性,选项框到显示区域的互动
'''第一个组件Label:显示区域'''
var1 = tk.StringVar()
l = tk.Label(window,ba='yellow',width=4,textvariable=var1)
l.pack()
'''第二个组件Button:实现主要功能'''
def print_selections():
value = lb.get(lb.curselection())
var1.set(value)
b1 = tk.Button(window,text='print selections',width=15,height=2,command=print_selections)
'''创建按钮对象,command为按下执行的函数命令'''
b1.pack()
'''第三个组件Listbox:选项列表'''
var2 = tk.StringVar()
var2.set(('love','hate','godness','hell'))
lb = tk.Listbox(window,listvariable=var2)
'''插入选项的方法'''
list_items = [1,2,3,4]
for item in list_items:
lb.insert('end',item)
lb.insert(1,'first')
lb.insert(2,'second')
lb.delete(2)
lb.pack()
问题:如何让选项框下拉
第四课
实现:点选选项并打印自定义内容,应用在答题上
摘要:创建点选选项的对象及其部分属性,选定特定选项后到显示区域的互动
'''第一个组件Label:显示区域'''
var = tk.StringVar()
l = tk.Label(window,ba='yellow',width=20,text='empty')
l.pack()
'''第二个组件Radiobutton:点选选项'''
def print_selection():
l.config(text='you have selected '+var.get())
r1 = tk.Radiobutton(window,text='Option A',variable=var,value='A',command=print_selection)
r1.pack()
r2 = tk.Radiobutton(window,text='Option B',variable=var,value='B',command=print_selection)
r2.pack()
r3 = tk.Radiobutton(window,text='Option C',variable=var,value='C',command=print_selection)
r3.pack()
问题:加跳转下一题的功能
第五课
实现:创建一个滑块输出数值
摘要:创建滑块的对象及其部分属性,滑块滑到的数值输出到显示区域
'''第一个组件Label:显示区域'''
var = tk.StringVar()
l = tk.Label(window,ba='yellow',width=20,text='empty')
l.pack()
'''第二个组件Scale:滑块'''
'''注意这里需要传入Scale得到的变量v'''
def print_selection(v):
l.config(text='you have selected '+v)
s = tk.Scale(window,label='drag me',from_=5,to=11,orient=tk.HORIZONTAL,length=200,
showvalue=False,tickinterval=1,resolution=0.01,command=print_selection)
'''length的单位是像素'''
s.pack()
问题:如何把滑块滑到的数值输出到确定模块
第六课
实现:创建一个滑块输出数值
摘要:创建滑块的对象及其部分属性,滑块滑到的数值输出到显示区域
'''第一个组件Label:显示区域'''
var = tk.StringVar()
l = tk.Label(window,ba='yellow',width=20,text='empty')
l.pack()
'''根据勾选输出文案'''
def print_selection():
if (var1.get() == 1)&(var2.get() == 0):
l.config(text='I love only Python')
elif (var1.get() == 0)&(var2.get() == 1):
l.config(text='I love only C++')
elif (var1.get() == 1)&(var2.get() == 1):
l.config(text='I love them all')
else:
l.config(text='I don\'t love each of them')
'''第二个组件Checkbutton:可勾选的选项'''
var1 = tk.IntVar()
'''整型变量'''
c1 = tk.Checkbutton(window,text='Python',variable=var1,onvalue=1,offvalue=0,command=print_selection)
'''选中var1为1,不选中为0'''
var2 = tk.IntVar()
c2 = tk.Checkbutton(window,text='C++',variable=var2,onvalue=1,offvalue=0,command=print_selection)
c1.pack()
c2.pack()
问题:如何把勾选的选项左右对齐,如何限定用户可选择的选项的个数
第七课
实现:画布上放图片或画基础形状
摘要:创建画布、图片、形状的对象及其部分属性,显示到画布区域
'''组件画布canvas:显示区域'''
canvas = tk.Canvas(window,bg='yellow',height=100,width=400)
image_file = tk.PhotoImage(file='黑暗华纳.png')
image = canvas.create_image(0,0,anchor='center',image=image_file)
'''anchor图片的锚定点参数:NW,N,NE,E,SE,S,SW,W,CENTER'''
x0,y0,x1,y1 = 100,100,50,50
line = canvas.create_line(x0,y0,x1,y1)
oval = canvas.create_oval(x0,y0,x1,y1,fill='red')
arc = canvas.create_arc(x0+30,y0+30,x1-30,y1-30,start=0,extent=180)
rect = canvas.create_rectangle(100,30,100+20,30+20)
canvas.pack()
def moveit():
canvas.move(rect,0,2)
'''每次移动(0,2)'''
'''按钮对象,实现移动'''
b = tk.Button(window,text='move',command=moveit)
b.pack()
问题:感觉没什么用
第八课
实现:画布
摘要:创建画布、图片、形状的对象及其部分属性,显示到画布区域
'''组件画布canvas:显示区域'''
canvas = tk.Canvas(window,bg='yellow',height=100,width=400)
image_file = tk.PhotoImage(file='黑暗华纳.png')
image = canvas.create_image(0,0,anchor='center',image=image_file)
'''anchor图片的锚定点参数:NW,N,NE,E,SE,S,SW,W,CENTER'''
x0,y0,x1,y1 = 100,100,50,50
line = canvas.create_line(x0,y0,x1,y1)
oval = canvas.create_oval(x0,y0,x1,y1,fill='red')
arc = canvas.create_arc(x0+30,y0+30,x1-30,y1-30,start=0,extent=180)
rect = canvas.create_rectangle(100,30,100+20,30+20)
canvas.pack()
def moveit():
canvas.move(rect,0,2)
'''每次移动(0,2)'''
'''按钮对象,实现移动'''
b = tk.Button(window,text='move',command=moveit)
b.pack()
问题:感觉没什么用
第九课
实现:菜单栏
摘要:创建菜单栏、子菜单的对象及其部分属性,下拉菜单按钮实现函数功能
'''组件画布canvas:显示区域'''
l = tk.Label(window,text='',bg='yellow',width=20)
l.pack()
counter = 0
def do_job():
global counter
l.config(text='do'+str(counter))
'''改变某个实例的属性要用a.config()'''
counter += 1
'''建立菜单对象'''
menubar = tk.Menu(window)
'''file子菜单'''
filemenu = tk.Menu(menubar,tearoff=0)
menubar.add_cascade(label='File',menu=filemenu)
filemenu.add_command(label='New',command=do_job)
filemenu.add_command(label='Open',command=do_job)
filemenu.add_command(label='Save',command=do_job)
filemenu.add_separator()
filemenu.add_command(label='Quit',command=window.quit)
'''edit子菜单,tearoff为子菜单是否可以脱离出来成为独立窗口'''
editmenu = tk.Menu(menubar,tearoff=1)
menubar.add_cascade(label='Edit',menu=editmenu)
editmenu.add_command(label='Cut',command=do_job)
editmenu.add_command(label='Copy',command=do_job)
editmenu.add_command(label='Paste',command=do_job)
editmenu.add_separator()
'''再加子菜单'''
submenu = tk.Menu(editmenu,tearoff=0)
editmenu.add_cascade(label='Import',menu=submenu,underline=0)
submenu.add_command(label='Submenu1',command=do_job)
'''改变window的属性'''
window.config(menu=menubar)
问题:要弄清楚哪个对象在哪个对象里面
第十课
实现:在主框架里建立子框架
摘要:善用框架来排版
tk.Label(window,text='on the window').pack()
'''主框架'''
frm = tk.Frame(window)
frm.pack()
'''次框架'''
frm_L = tk.Frame(frm)
frm_R = tk.Frame(frm)
frm_L.pack(side='left')
frm_R.pack(side='right')
tk.Label(frm_L,text='on the frm_L1').pack()
tk.Label(frm_L,text='on the frm_L12').pack()
tk.Label(frm_R,text='on the frm_R').pack()
问题:要弄清楚哪个对象在哪个对象里面,怎么改变框架的坐标位置
第十一课
实现:弹窗
摘要:有分有返回值和无返回值
def go_on():
#tk.messagebox.showinfo(title='Hi!',message='haha')
#tk.messagebox.showwarning(title='No!',message='get away')
#tk.messagebox.showerror(title='Oh!',message='IT SHOULD NOT BE!')
'''有返回值,返回的yes,no'''
#answer = tk.messagebox.askquestion(title='Do you?',message='maybe')
#print(answer)
'''返回的TRUE,False'''
#answer = tk.messagebox.askyesno(title='Do you?',message='maybe')
#print(answer)
'''返回的都是TRUE,False'''
#answer = tk.messagebox.asktrycancel(title='Do you?',message='maybe')
answer = tk.messagebox.askokcancel(title='Do you?',message='maybe')
tk.Button(window,text='go on',command=go_on).pack()
问题:返回值有字符串和布尔值,善用
第十二课
实现:对象的排布
摘要:三种方法
'''pack和grid只能用一种'''
#tk.Label(window,text=1).pack(side='top')
#tk.Label(window,text=1).pack(side='bottom')
#tk.Label(window,text=1).pack(side='left')
#tk.Label(window,text=1).pack(side='right')
#for i in range(4):
#for j in range(3):
#tk.Label(window,text=1).grid(row=i,column=j,padx=10,pady=10)
'''padx和pady展宽对象间的距离'''
tk.Label(window,text=1).place(x=100,y=10,anchor='w')
问题:第三种好用一点