《head first》程序设计

十、自定义窗口小部件和类

  大多数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()

 

 

转载于:https://www.cnblogs.com/codehorse/archive/2013/04/11/3015437.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值