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中的ctime()方法使用教程
May 22 Python
python写入已存在的excel数据实例
May 03 Python
python pandas修改列属性的方法详解
Jun 09 Python
Python 互换字典的键值对实例
Feb 12 Python
在python下使用tensorflow判断是否存在文件夹的实例
Jun 10 Python
python tkinter图形界面代码统计工具(更新)
Sep 18 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
Python中的wordcloud库安装问题及解决方法
May 27 Python
Python 如何调试程序崩溃错误
Aug 03 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
pytorch 使用半精度模型部署的操作
May 24 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 mysql PDO 查询操作的实例详解
2017/09/23 PHP
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
jQuery筛选器children()案例详解(图文)
2013/02/17 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
对Python中数组的几种使用方法总结
2018/06/28 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
毕业生造价工程师求职信
2013/10/17 职场文书
中华魂演讲稿
2014/05/13 职场文书
2014年征兵标语
2014/06/20 职场文书
销售经理助理岗位职责
2015/04/13 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
节水宣传标语口号
2015/12/26 职场文书
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP