Page 387 of chapter 7
1 """ 2 6-23 page 343 play media files 3 """ 4 def odd(): 5 funcs=[] 6 for c in 'abcdwe': 7 funcs.append((lambda:c)) 8 return funcs 9 10 def odd2():11 funcs=[]12 for c in 'abcdwe':13 funcs.append((lambda c=c:c))14 return funcs 15 16 def odd1():17 funcs=[]18 for c in 'abcdwe':19 funcs.append(c)20 return funcs21 22 for func in odd():23 print(func())24 print('force to remenber'+'#'*30)25 for func in odd2():26 print(func())27 28 listt=[]29 listt=odd1()30 print listt
1 """ 2 programming pytyon page 422 3 pop up three new windows ,with style 4 desctory() kill one window,quit kill all windows and app 5 top-level window have litle,icon,iconify/deiconify and protocol for wn events 6 there always is an application root window,whether by default or created as an 7 explicit tk() object;all top-level windows are containters but they are never 8 packed.gridded;toplevel is like Frame,but a new window,and can have a menu; 9 """10 from Tkinter import *11 root =Tk()12 trees =[('the larch!','light blue'),('the pine!','light green'),('the giant redwood','red')]13 14 for (tree,color) in trees:15 win = Toplevel(root)16 win.title('sing...')17 win.protocol('WM_DELETE_WINDOW',lambda:None) #ignore close,so no meaning to close win by X18 win.iconbitmap('C:\\Users\\xlian7164584\\Documents\\GitHub\\R_D\\bg.ico')19 20 msg =Button(win,text=tree,command=win.destroy)21 msg.pack(expand=YES,fill=BOTH)22 msg.config(padx=10,pady=10,bd=10,relief=RAISED)23 msg.config(bg='black',fg=color,font=('times',30,'bold italic'))24 root.title('lxk demo with three win')25 Label(root,text='main win',width=30).pack()26 Button(root,text='quit all',command=root.quit).pack()27 root.mainloop()
1. win.protocol('WM_DELETE_WINDOW',lambda:None) #ignore close,so no meaning to close win by X
如果设置protocol属性为None ,所以我们无法通过X关闭3个窗口
2.关掉一个窗口和对应的子窗口,使用destroy;关掉所有的窗口,使用quit
3.title设置title,iconbitmap设定图标
4.如果设定win=Toplevel(),并且还没有设定Tk root窗口,则此句将默认生成TK root作为Toplevel的主窗口。但是,我们
root=tk(),以上调用将产生产生一个root主窗口
多个按钮放入对话框中
退出按钮:
1 """ 2 a quit button that verifies exit requests to reuse, 3 attach an instance to other GUIS,and repack as desired 4 """ 5 from Tkinter import * 6 from tkMessageBox import askokcancel 7 8 class Quitter(Frame): 9 def __init__(self,parent=None):10 Frame.__init__(self,parent)11 self.pack()12 wid =Button(self,text ='Quit',fg='blue',command =self.quit)13 wid.pack(side =LEFT,expand =YES,fill=BOTH)14 def quit(self):15 ans =askokcancel('verify exit',"readlly quit")16 if ans:17 Frame.quit(self)18 if __name__ =='__main__':19 Quitter().mainloop()
对话框
1 """ 2 define a name:callback demos table 3 """ 4 from tkFileDialog import askopenfilename 5 from tkColorChooser import askcolor 6 from tkMessageBox import askquestion,showwarning 7 from tkSimpleDialog import askfloat 8 9 demos ={10 'open':askopenfilename,11 'Color':askcolor,12 'Query':lambda:askquestion('waring','you type q\n confirm?'),13 'Error':lambda:showerror('error!',"he is here,lxk"),14 'input':lambda:askfloat('entry','entry random float num')15 }
组合对话框:
1 "create a bar of simple buttons that launch dialog demos" 2 from Tkinter import * 3 from dialogTable import demos 4 from quitter import Quitter 5 6 root =Tk() 7 8 class Demo(Frame): 9 def __init__(self,parent=None,**options):10 Frame.__init__(self,parent,**options)11 self.pack(fill=BOTH) #if fill no setting ,12 Label(self,text ="basic demos",fg='black').pack()13 for (key,value) in demos.items():14 Button(self,text=key,fg="blue",command=value).pack(expand =YES,fill=BOTH)15 Quitter(self).pack(side=TOP,fill=BOTH)16 17 if __name__ =='__main__':18 #maindlg=Toplevel(root)19 #maindlg.title('another dlg')20 #maindlg.iconbitmap('C:\\Users\\xlian7164584\\Documents\\GitHub\\R_D\\bg.ico')21 #Button(maindlg,text='botton at maingld').pack()22 23 root.title('demo dlg')24 root.iconbitmap('C:\\Users\\xlian7164584\\Documents\\GitHub\\R_D\\bg.ico') 25 Demo().mainloop()
把main函数中注释打开,则:
demo dlg是主窗口,关闭则所有窗口关闭。
按钮的回调函数没有传入参数,如果需要传额外的数据到handler,我们需要打包给一个能够保存或者记住这些数据的对象,这个对象完成到实际handler的调用。如何绕过这个限制
答案:使用lambda表达式。
1 "create a bar of simple buttons that launch dialog demos" 2 from Tkinter import * 3 from dialogTable import demos 4 from quitter import Quitter 5 6 root =Tk() 7 8 class Demo(Frame): 9 def __init__(self,parent=None,**options):10 Frame.__init__(self,parent,**options)11 self.pack(fill=BOTH) #if fill no setting ,12 Label(self,text ="basic demos",fg='black').pack()13 for key in demos:14 func = (lambda key =key:self.printit(key))15 Button(self,text=key,fg="blue",command=func).pack(expand =YES,fill=BOTH)16 Quitter(self).pack(side=TOP,fill=BOTH)17 def printit(self,name):18 print (name,'returns ==>',demos[name]())19 20 if __name__ =='__main__':21 root.title('demo dlg')22 root.iconbitmap('C:\\Users\\xlian7164584\\Documents\\GitHub\\R_D\\bg.ico') 23 Demo().mainloop()
Check demos
1 """ 2 create a bar of check buttons that run dialog demo 3 """ 4 from Tkinter import * 5 from dialogTable import demos 6 from quitter import Quitter 7 8 class Demo(Frame): 9 def __init__(self,parent =None,**options):10 Frame.__init__(self,parent=None,**options)11 self.pack()12 self.tools()13 Label(self,text ='check demos').pack()14 self.vars = []15 for key in demos:16 var= IntVar()17 Checkbutton(self,text =key,variable =var,command=demos[key]).pack(side =LEFT)18 self.vars.append(var)19 def report(self):20 for var in self.vars:21 print(var.get())22 print()23 def tools(self):24 frm=Frame(self)25 frm.pack(side =RIGHT)26 Button(frm,text ='state',command =self.report).pack(fill =X)27 Quitter(frm).pack(fill=X)28 29 if __name__=='__main__':30 Demo().mainloop()
Radiocheck
1 "create a group of radio buttons that launch dialog demos" 2 3 from Tkinter import * 4 from dialogTable import demos 5 from quitter import Quitter 6 7 class Demo(Frame): 8 def __init__(self,parent =None,**options): 9 Frame.__init__(self,parent,**options)10 self.pack()11 Label(self,text ='radio demos').pack(side =TOP)12 self.var = StringVar()13 for key in demos:14 Radiobutton(self,text =key,command=self.onPress,variable =self.var,15 value =key).pack(anchor =NW)16 self.var.set(key) #select last to start17 Button(self,text ='state',command=self.report).pack(fill=X)18 Quitter(self).pack(fill=X)19 def onPress(self):20 pick = self.var.get()21 print('you pressed',pick)22 print('result:',demos[pick]())23 def report(self):24 print(self.var.get())25 if __name__=='__main__':26 Demo().mainloop()
scale check
1 "create two linked scales used to launch dialog demos" 2 3 from Tkinter import * 4 from dialogTable import demos 5 from quitter import Quitter 6 7 class Demo(Frame): 8 def __init__(self,parent=None,**options): 9 Frame.__init__(self,parent,**options)10 self.pack()11 Label(self,text ='scale demos').pack()12 self.var = IntVar()13 Scale(self,label ='pick demo num',14 command=self.onMove,15 variable=self.var,16 from_=0,to=len(demos)-1).pack()17 Scale(self,label='pick demo number',18 command=self.onMove,19 variable=self.var,20 from_=-100,to=len(demos)-1+100,21 length=200,tickinterval=10,resolution=30,22 showvalue=YES,orient='horizontal').pack()23 Quitter(self).pack(side=RIGHT)24 Button(self,text ='run demo',command=self.onRun).pack(side =LEFT)25 Button(self,text ='state',command=self.report).pack(side=RIGHT)26 def onMove(self,value):27 print('in move',value)28 def onRun(self):29 pos = self.var.get()30 print('you picked',pos)31 demo=list(demos.values())[pos]32 print(demo())33 34 def report(self):35 print self.var.get()36 if __name__ =='__main__':37 print(list(demos.keys()))38 Demo().mainloop()39
DemoALL
1 """ 2 4 demo class components(subframes) on one window; 3 there are 5 quitter buttons on this one window too,and each kills entire gui 4 gui can be resued as frames in container,indenpendent windown or process 5 """ 6 #-*- coding: utf-8 -*- 7 from Tkinter import * 8 from quitter import Quitter 9 demosModules =['demoDlg','demoCheck','demoRadio','demoScale']10 parts =[]11 def addComponents(root):12 for demo in demosModules:13 module=__import__(demo)14 part =module.Demo(root)15 part.config(bd=2,relief=GROOVE)16 part.pack(side=LEFT,expand=YES,fill=BOTH)17 parts.append(part)18 def dumpState():19 for part in parts:20 print(part.__module__+':')21 if hasattr(part,'report'):22 part.report()23 else:24 print('none')25 26 root=Tk()27 root.title('主框架'.decode('gbk'))28 Label(root,text ='多个框结构实例'.decode('gbk'),bg='white').pack()29 Button(root,text ='状态'.decode('gbk'),command=dumpState).pack(fill=X)30 Quitter(root).pack(fill=X)31 addComponents(root)32 root.iconbitmap('C:\\Users\\xlian7164584\\Documents\\GitHub\\R_D\\bg.ico') 33 root.mainloop()
Buttonbar
1 """ 2 check and radio button bar classes for apps that fetch state later 3 pass a list of options ,call state(),variable details automated 4 """ 5 6 from Tkinter import * 7 class Checkbar(Frame): 8 def __init__(self,parent= None,picks =[],side=LEFT,anchor=W): 9 Frame.__init__(self,parent)10 self.vars=[]11 for pick in picks:12 var = IntVar()13 chk =Checkbutton(self,text =pick,variable =var)14 chk.pack(side=side,anchor=anchor,expand=YES)15 self.vars.append(var)16 def state(self):17 return [var.get() for var in self.vars]18 class Radiobar(Frame):19 def __init__(self,parent=None,picks=[],side=LEFT,anchor=W):20 Frame.__init__(self,parent)21 self.var=StringVar()22 self.var.set(picks[0])23 for pick in picks:24 rad =Radiobutton(self,text =pick,value=pick,variable=self.var)25 rad.pack(side=side,anchor=anchor)26 def state(self):27 return self.var.get()28 29 if __name__=='__main__':30 root=Tk()31 lng=Checkbar(root,['python','C#','Jave','C++'])32 gui=Radiobar(root,['Win','x86','mac'],side =TOP,anchor=NW)33 tgl=Checkbar(root,['All'])34 35 gui.pack(side=LEFT,fill=Y)36 lng.pack(side=TOP,fill=X)37 tgl.pack(side=LEFT)38 lng.config(relief=GROOVE,bd=2)39 gui.config(relief=RIDGE,bd=2)40 41 def allstates():42 print(gui.state(),lng.state(),tgl.state())43 from quitter import Quitter44 Quitter(root).pack(side=RIGHT)45 Button(root,text ='Peek',command=allstates).pack()46 root.mainloop()
ButtonPic
1 from Tkinter import * 2 from glob import glob 3 import demoCheck 4 import random 5 gifdir='C:\\Users\\xlian7164584\\Documents\\GitHub\\R_D\\gif\\' 6 7 def draw(): 8 name,photo =random.choice(images) 9 lbl.config(text =name)10 pix.config(image=photo)11 12 root =Tk()13 lbl=Label(root,text ='none',bg='blue',fg='red')14 pix=Button(root,text ='press me',command=draw,bg='white')15 lbl.pack(fill=BOTH)16 pix.pack(pady=10)17 demoCheck.Demo(root,relief=SUNKEN,bd=2).pack(fill=BOTH)18 19 files=glob(gifdir+'*.gif')20 images=[(x,PhotoImage(file=x)) for x in files]21 print files22 root.mainloop()
ListBox
1 "a simple customizable scrolled listbox component" 2 from Tkinter import * 3 4 class ScrolledList(Frame): 5 def __init__(self,options,parent=None): 6 Frame.__init__(self,parent) 7 self.pack(expand=YES,fill=BOTH) # make me expandable 8 self.makeWidgets(options) 9 def handleList(self,event):10 index = self.listbox.curselection() # on list double-click11 label = self.listbox.get(index) # fetch selection text12 self.runCommand(label) # and call action here or get(ACTIVE)13 14 def makeWidgets(self,options):15 sbar=Scrollbar(self)16 list=Listbox(self,relief=SUNKEN)17 sbar.config(command=list.yview) #xlink sbar and list18 list.config(yscrollcommand=sbar.set,fg='blue') # move one moves other19 sbar.pack(side=RIGHT,fill=Y) #pack first=clip last20 list.pack(side=LEFT,expand=YES,fill = BOTH) # list clipped first21 pos=022 for label in options: # add to listbox23 list.insert(pos,label) # or insert(END,label)24 pos+=1 # or enumerate(options)25 #list.config(selectmode=SINGLE,setgrid=1) # select ,resize modes26 list.bind('',self.handleList) # set event handler27 list.bind(' ',self.handleLeftClick) # mouse button clicks28 list.bind(' ',self.onkeyPress) # all key press29 list.bind(' ',self.onLeftDrag) #click and draw30 self.listbox=list31 def runCommand(self,selection):32 print('you selected:',selection)33 34 def onkeyPress(self,event):35 print('got key press:',event.char)36 37 def handleLeftClick(self,event):38 print('mouse button press')39 self.showPosEvent(event)40 41 def onLeftDrag(self,event):42 print('got left mouse button draw')43 self.showPosEvent(event)44 45 def showPosEvent(self,event):46 print('widget =%s X=%s, Y=%s' % (event.widget,event.x,event.y))47 48 if __name__ =='__main__':49 options =(('listbox and event %s' % x) for x in range(20))50 ScrolledList(options).mainloop()51