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编写百度贴吧的简单爬虫
Apr 02 Python
python绘图方法实例入门
May 19 Python
Python按行读取文件的实现方法【小文件和大文件读取】
Sep 19 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
python语言元素知识点详解
May 15 Python
python for和else语句趣谈
Jul 02 Python
Python 实现大整数乘法算法的示例代码
Sep 17 Python
python lambda函数及三个常用的高阶函数
Feb 05 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
python中复数的共轭复数知识点总结
Dec 06 Python
Python离线安装openpyxl模块的步骤
Mar 30 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
关于尾递归的使用详解
2013/05/02 PHP
PHP小技巧之函数重载
2014/06/02 PHP
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
php自定文件保存session的方法
2014/12/10 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
Pandas删除数据的几种情况(小结)
2019/06/21 Python
python实现简单图书管理系统
2019/11/22 Python
某公司面试题
2012/03/05 面试题
开办大学饮食联盟创业计划书
2014/01/29 职场文书
元旦活动感言
2014/03/08 职场文书
农村党员对照检查材料
2014/09/24 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫