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中Genarator函数用法分析
Apr 08 Python
在Python中使用Mako模版库的简单教程
Apr 08 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
May 02 Python
python实现读取并显示图片的两种方法
Jan 13 Python
python实现二分查找算法
Sep 21 Python
python使用代理ip访问网站的实例
May 07 Python
使用pandas批量处理矢量化字符串的实例讲解
Jul 10 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
Jan 15 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
Python定义一个Actor任务
Jul 29 Python
一小时学会TensorFlow2之基本操作2实例代码
Sep 04 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
深入koa-bodyparser原理解析
2019/01/16 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
python加载自定义词典实例
2019/12/06 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
测试驱动开发的主要步骤是什么
2014/12/10 面试题
优秀研究生自我鉴定
2013/12/04 职场文书
建筑项目策划书
2014/01/13 职场文书
合同协议书格式
2014/04/18 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android