python计算圆周长、面积、球体体积并画出圆
输入半径,计算圆的周长、面积、球体体积,并画出这个圆。
拖动条、输入框和图像控件的数据保持一致!
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 piclass Model:
'''
模型类
存储半径,计算周长、面积、体积
'''def __init__(self):
self._radius = 0def setRadius(self, radius):
self._radius = float(radius)def getRadius(self):
return self._radiusdef getPerimeter(self):
return pi * self._radius * 2def getArea(self):
return self._radius ** 2 * pidef 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 = vEntrydef 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 = scaledef 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 pixbufdef __init__(self, model, image):
self.model = model
self.image = imagedef 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:
passdef 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计算圆周长、面积、球体体积并画出圆
- 已知圆柱体的底面半径r和高h,计算圆柱体底面周长和面积、圆柱体侧面积以及圆柱体体积。
- Python计算圆周长和面积
- 简单的C#Windows 窗体编程,计算圆的周长、面积与体积。
- 计算圆的周长、面积、球 的体积
- 【java学习记录】2.定义一个计算矩形面积、立方体和球体体积的类,该类完成计算的方法用静态方法实现
- 【程序2】编写应用程序,创建类的对象,分别设置圆的半径、圆柱体的高,计算并分别显示圆半径、圆面积、圆周长,圆柱体的体积。
- 编写应用程序,创建类的对象,分别设置圆的半径、圆柱体的高,计算并分别显示圆半径、圆面积、圆周长,圆柱体的体积。
- Python2.X实现计算圆的面积
- 定义一个图形类及其子类(三角形类和矩形类),分别计算其面积和周长。
- 十五周任务1:窗口启蒙(计算三角形周长和面积)
- vtk计算Polydata的面积和体积
- 封闭连续区域的面积和周长计算【2】--面积与周长
- 用C语言编程,根据用户输入的半径计算球的表面积,体积,经过圆心的横切圆的面积以及以此球的半径、直径作为直径和高的圆柱体的侧面积、表面积和体积(将π定义成值为3.14的符号常量)
- C#计算圆的周长和面积(从控制台读入半径)
- 创建一个三角形类并且通过成员函数计算三角形的周长和面积《1》
- 三角形、长方形、正方形、梯形、圆等的周长计算公式和面积计算公式
- C++第三周【任务4】:(1)由键盘输入3个长方柱的长、宽、高;(2)计算长方柱的体积(volume)和表面积(areas);(3)输出这3个长方柱的体积和表面积;
- JAVA计算圆面积和周长的程序
- c语言初步经典题---计算长方形的周长和面积