python计算圆周长、面积、球体体积并画出圆


Posted in Python onApril 08, 2014

输入半径,计算圆的周长、面积、球体体积,并画出这个圆。
拖动条、输入框和图像控件的数据保持一致!

Fedora下测试通过

#https://github.com/RobberPhex/GTK-Example-CalcArea
from gi.repository import Gtk, Gdk, GdkPixbuf
from PIL import Image, ImageDraw
from io import BytesIO
from math import pi
class Model:
    '''
    模型类
    存储半径,计算周长、面积、体积
    '''
    def __init__(self):
        self._radius = 0
    def setRadius(self, radius):
        self._radius = float(radius)
    def getRadius(self):
        return self._radius
    def getPerimeter(self):
        return pi * self._radius * 2
    def getArea(self):
        return self._radius ** 2 * pi
    def getVolume(self):
        return 4 * pi * self._radius ** 3 / 3

class Controller:
    '''
    控制器类
    控制视图和模型的更新
    '''
    def __init__(self, model):
        self.model = model
        self._observers = []
    def addObserver(self, observer):
        self._observers.append(observer)
    def setRadius(self, radius):
        model.setRadius(radius)
        self.notify()
    def notify(self):
        for observer in self._observers:
            observer.update()

class TextView:
    '''
    文字视图类
    处理文本输入框的视图
    '''
    def __init__(self, model, rEntry, pEntry, aEntry, vEntry):
        '''
        :type model Model
        '''
        self.model = model
        self.rEntry = rEntry
        self.pEntry = pEntry
        self.aEntry = aEntry
        self.vEntry = vEntry
    def update(self):
        self.rEntry.set_text('%2.2f' % self.model.getRadius())
        self.pEntry.set_text('%2.2f' % self.model.getPerimeter())
        self.aEntry.set_text('%2.2f' % self.model.getArea())
        self.vEntry.set_text('%2.2f' % self.model.getVolume())

class ScaleView:
    '''
    拖动条视图
    处理拖动条的视图
    '''
    def __init__(self, model, scale):
        '''
        :type model Model
        '''
        self.model = model
        self.scale = scale
    def update(self):
        self.scale.set_value(self.model.getRadius())

class ImageView:
    '''
    图像视图
    处理图像的视图
    '''
    @classmethod
    def imgToPixbuf(cls, img):
        '''
        :type img Image
        '''
        buff = BytesIO()
        img.save(buff, 'ppm')
        contents = buff.getvalue()
        buff.close()
        loader = GdkPixbuf.PixbufLoader.new_with_type('pnm')
        loader.write(contents)
        pixbuf = loader.get_pixbuf()
        loader.close()
        return pixbuf
    @classmethod
    def ellipse(cls, radius):
        '''
        :type radius int
        '''
        image = Image.new("RGBA", (300, 300), "white")
        draw = ImageDraw.Draw(image)
        minor = 150 - radius
        major = 150 + radius
        draw.ellipse((minor, minor, major, major), outline='red')
        pixbuf = ImageView.imgToPixbuf(image)
        return pixbuf
    def __init__(self, model, image):
        self.model = model
        self.image = image
    def update(self):
        radius = self.model.getRadius()
        pixbuf = ImageView.ellipse(radius)
        self.image.set_from_pixbuf(pixbuf)

class MainWindow(Gtk.Window):
    '''
    主窗口类
    负责整体界面的显示
    '''
    def textCallback(self, widget, controller):
        '''
        文本输入回调
        '''
        try:
            radius = float(widget.get_text())
            controller.setRadius(radius)
        except ValueError as e:
            pass
    def scaleCallback(self, widget, controller):
        '''
        拖动条回调
        '''
        radius = widget.get_value()
        controller.setRadius(radius)
    def __init__(self):
        Gtk.Window.__init__(self, title="Title")
        self.set_default_size(600, 400)
        self.set_position(Gtk.WindowPosition.CENTER)
        hbox = Gtk.HBox(spacing=5)
        self.add(hbox)
        vbox = Gtk.VBox(spacing=5)
        hbox.pack_start(vbox, True, True, 2)
        table = Gtk.Table.new(4, 2, False)
        vbox.pack_start(table, True, True, 2)
        label = Gtk.Label('半径:')
        table.attach_defaults(label, 0, 1, 0, 1)
        label = Gtk.Label('周长:')
        table.attach_defaults(label, 0, 1, 1, 2)
        label = Gtk.Label('面积:')
        table.attach_defaults(label, 0, 1, 2, 3)
        label = Gtk.Label('体积:')
        table.attach_defaults(label, 0, 1, 3, 4)
        self.radiusEntry = Gtk.Entry.new()
        self.radiusEntry.connect('changed', self.textCallback, controller)
        table.attach_defaults(self.radiusEntry, 1, 2, 0, 1)
        self.perimeterEntry = Gtk.Entry.new()
        self.perimeterEntry.set_sensitive(False)
        self.perimeterEntry.set_text('周长')
        table.attach_defaults(self.perimeterEntry, 1, 2, 1, 2)
        self.areaEntry = Gtk.Entry.new()
        self.areaEntry.set_sensitive(False)
        self.areaEntry.set_text('面积')
        table.attach_defaults(self.areaEntry, 1, 2, 2, 3)
        self.volumeEntry = Gtk.Entry.new()
        self.volumeEntry.set_sensitive(False)
        self.volumeEntry.set_text('体积')
        table.attach_defaults(self.volumeEntry, 1, 2, 3, 4)
        self.scale = Gtk.HScale.new_with_range(0, 100, 1)
        self.scale.connect('value-changed', self.scaleCallback, controller)
        vbox.pack_start(self.scale, False, False, 2)
        pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 300, 300)
        pixbuf.fill(0xaaaaaaaa)
        self.image = Gtk.Image.new_from_pixbuf(pixbuf)
        hbox.pack_start(self.image, True, True, 2)
        self.connect('delete-event', Gtk.main_quit)

model = Model()
controller = Controller(model)
if __name__ == '__main__':
    Gdk.threads_init()
    Gdk.threads_enter()
    win = MainWindow()
    iv = ImageView(model, win.image)
    controller.addObserver(iv)
    tv = TextView(model, win.radiusEntry, win.perimeterEntry, win.areaEntry, win.volumeEntry)
    controller.addObserver(tv)
    sv = ScaleView(model, win.scale)
    controller.addObserver(sv)
    win.show_all()
    Gtk.main()
    Gdk.threads_leave()

python计算圆周长、面积、球体体积并画出圆

Python 相关文章推荐
python中的字典详细介绍
Sep 18 Python
Python中文分词实现方法(安装pymmseg)
Jun 14 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
Python装饰器用法实例总结
May 26 Python
Python实现字符串匹配的KMP算法
Apr 04 Python
python多进程读图提取特征存npy
May 21 Python
pow在python中的含义及用法
Jul 11 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
用python3读取python2的pickle数据方式
Dec 25 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
Django Auth用户认证组件实现代码
Oct 13 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 Python
python实现类似ftp传输文件的网络程序示例
Apr 08 #Python
Python collections模块实例讲解
Apr 07 #Python
python操作xml文件示例
Apr 07 #Python
python生成随机验证码(中文验证码)示例
Apr 03 #Python
python读取html中指定元素生成excle文件示例
Apr 03 #Python
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 #Python
python模拟登陆阿里妈妈生成商品推广链接
Apr 03 #Python
You might like
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
献给php初学者(入门学习经验谈)
2010/10/12 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
JavaScript lodash常见用法系列小结
2016/08/24 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
angular动态表单制作
2018/02/23 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
python中遍历文件的3个方法
2014/09/02 Python
如何在Python中编写并发程序
2016/02/27 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
Python使用struct处理二进制的实例详解
2017/09/11 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
python操作redis数据库的三种方法
2020/09/10 Python
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
捐赠仪式主持词
2014/03/19 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
幼儿园春季开学通知
2015/07/16 职场文书