十、自定义窗口小部件和类
大多数GUI(包括tkinter)允许你从一组其他窗口小部件中创建自定义窗口小部件,而tkinter包含了一种名为框架(Frame)的特别窗口小部件。框架就像画框一样,他在里面包含了其他的东西。他是方形的,可以包含其他窗口小部件。
在程序的设计中采用模块化的编程方式。
模块sound_panel中包涵ScalePanel类:
1 from tkinter import * 2 class SoundPannel(Frame): 3 def __init__(self, app, mix, sound_file):#首先是初始化方法。注意这个方法在Python中必须命名为“__init__”. 4 Frame.__init__(self, app) 5 self.track=mix.Sound(sound_file) 6 self.fippler=IntVar() 7 Checkbutton(self, text=sound_file, command=self.track_toggle, variable=self.fippler).pack() 8 9 self.volume= DoubleVar() 10 self.volume.set(self.track.get_volume()) 11 volume_scale=Scale(self, variable=self.volume, from_=0.0, to=1.0,\ 12 resolution=0.1, label='Volume', \ 13 command=self.change_volume,orient=HORIZONTAL) 14 15 volume_scale.pack() 16 def change_volume(self, v): 17 self.track.set_volume(self.volume.get()) 18 19 def track_toggle(self): 20 if self.fippler.get()==1: 21 self.track.play(loops=-1) 22 else: 23 self.track.stop()
主程序:
1 import pygame.mixer 2 import tkinter.messagebox 3 from sound_panel import * 4 5 app=Tk() 6 app.title('Head First Mixer') 7 8 mix=pygame.mixer 9 mix.init() 10 11 panel=SoundPannel(app, mix, 'headmusic/39147_M_RED_beep_line.wav') 12 panel.pack() 13 panel=SoundPannel(app, mix, 'headmusic/39484__M_RED__trance_trumpet_loop.wav') 14 panel.pack() 15 16 def shutdown(): 17 if tkinter.messagebox.askokcancel('Are you sure?', 'Do you really want to quit?'): 18 mix.stop() #关闭窗口的时,同时关闭正在播放的音乐 19 app.destroy() #关闭窗口 20 app.protocol('WM_DELETE_WINDOW', shutdown) #使用tkinter的协议属性,实现对窗口的管理 21 22 app.mainloop()
另外一种实现的方式,采用函数的方式同样可以实现相同的功能。
同样在程序的设计中采用模块化的编程方式,模块sound_panel中包涵create_gui()函数:
1 from tkinter import * 2 def create_gui(app,mix,sound_file): #函数中需要传递三个参数 3 def change_volume(v): 4 track.set_volume(volume.get()) 5 6 def track_toggle(): 7 if fippler.get()==1: 8 track.play(loops=-1) 9 else: 10 track.stop() 11 12 track=mix.Sound(sound_file) 13 fippler=IntVar() 14 Checkbutton(app, text=sound_file, command=track_toggle, variable=fippler).pack() 15 16 volume= DoubleVar() 17 track.set_volume(volume.get()) 18 volume_scale=Scale(app, variable=volume, from_=0.0, to=1.0,\ 19 resolution=0.1, label='Volume', \ 20 command=change_volume,orient=HORIZONTAL) 21 22 volume_scale.pack()
主程序的实现:
1 import pygame.mixer 2 import tkinter.messagebox 3 from sound_panel import * 4 5 app=Tk() 6 app.title('Head First Mixer') 7 8 mix=pygame.mixer 9 mix.init() 10 11 create_gui(app, mix, 'headmusic/39147_M_RED_beep_line.wav') 12 create_gui(app, mix, 'headmusic/39484__M_RED__trance_trumpet_loop.wav') 13 14 def shutdown(): 15 if tkinter.messagebox.askokcancel('Are you sure?', 'Do you really want to quit?'): 16 mix.stop() 17 app.destroy() 18 app.protocol('WM_DELETE_WINDOW', shutdown) 19 20 app.mainloop()