python计算圆周长、面积、球体体积并画出圆
发布时间:2022-08-15 06:19:59
输入半径,计算圆的周长、面积、球体体积,并画出这个圆。
拖动条、输入框和图像控件的数据保持一致!
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()
猜你喜欢
- 你一定想下载一下感兴趣的网页,以便慢慢欣赏吧!利用FrontPage能够轻松做到这一点,甚至可以下载整个站点,当然这里只能下载静态的页面。启
- 一、引入这段时间一直在学习Python的东西,以前就听说Python爬虫多厉害,正好现在学到这里,跟着小甲鱼的Python视频写了一个爬虫程
- 1.单列运算在Pandas中,DataFrame的一列就是一个Series, 可以通过map来对一列进行操作:df['col2
- 介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服务器的基础结构。操作网络的时候可以直接使用so
- 从publish 表中取出第 n 条到第 m 条的记录的sql语句写法:SELECT TOP m-n+1 *&
- python DataFrame的合并方法Python的Pandas针对DataFrame,Series提供了多个合并函数,通过参数的调整可
- 在网络上的Pandas教程中,很多都提到了如何使用Pandas将已有的数据(如csv,如hdfs等)直接加载成Pandas数据对象,然后在其
- python3实现批量修改文件名,供大家参考,具体内容如下以批量修改某文件夹下所有图片名称为例,注释超详细,万能模板,读者可举一反三,适当修
- 一朋友委托我帮他投票,地址在: http://publish.sina.com.cn/04/13/413/search.php 投票的链接是
- 一、写在前面本文基于64位windows系统(鼠标右键点击桌面“此电脑”图标——属性可查看电脑系统版本)、python3.x(pycharm
- 最近论坛里总有人问幻灯片怎么从数据库里取数据,花了几分钟简单的写了下。用到的人可以自己在细化<%dim rs,sqlset&
- SQL Server四类数据仓库建模的方法主要分为以下四类。第一类是关系数据库的三范式建模,通常我们将三范式建模方法用于建立各种操作型数据库
- 1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0)
- 摘要:主要是讲解一些数据挖掘中频繁模式挖掘的Apriori算法原理应用实践当我们买东西的时候,我们会发现物品展示方式是不同,购物以后优惠券以
- 本文实例讲述了python实现颜色rgb和hex相互转换的函数。分享给大家供大家参考。具体分析如下:下面的python代码提供了两个函数分别
- 程序很简单,主要是 mp3play 模块的应用import mp3play, timefilename = "Should It
- 目录1.列表的介绍2.打印出列表的数据1.我们可以根据下标取值进行打印2.使用for循环遍历3.使用while循环遍历3.列表的添加操作1.
- 背景一次工作中,我需要完成某个文件的字符串替换。需求是这样的:文件A有个占位符,需要利用Python3,把占位符替换成文件B的内容。文件都不
- 作为摄影测量与遥感的从业者,笔者最近开始深入研究gdal,为工作打基础!个人觉得gdal也是没有什么技术含量,调用别人的api。但是想想这也
- 人体的视觉系统是一个相当神奇的存在,对于下面的一串手写图像,可以毫不费力的识别出他们是504192,轻松到让人都忘记了其实这是一个复杂的工作