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的一些用法分享
Oct 07 Python
Python实现的多线程http压力测试代码
Feb 08 Python
django rest framework之请求与响应(详解)
Nov 06 Python
纯python实现机器学习之kNN算法示例
Mar 01 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
Python干货:分享Python绘制六种可视化图表
Aug 27 Python
Form表单及django的form表单的补充
Jul 25 Python
python 操作hive pyhs2方式
Dec 21 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 20 Python
FP-growth算法发现频繁项集——构建FP树
Jun 24 Python
详解Python中下划线的5种含义
Jul 15 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
php strcmp使用说明
2010/04/22 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
php析构函数的简单使用说明
2015/08/24 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python合并文本文件示例
2014/02/07 Python
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
CSS3 rgb and rgba(透明色)的使用详解
2020/09/25 HTML / CSS
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
四年大学自我鉴定
2014/02/17 职场文书
公司新年寄语
2014/04/04 职场文书
学校消防安全责任书
2014/07/23 职场文书
2014年绿化工作总结
2014/12/09 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
python解析照片拍摄时间进行图片整理
2022/07/23 Python