Python GUI: tkinter

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')

问题:第三种好用一点


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值