#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计算圆周长、面积、球体体积并画出圆相关推荐

  1. JAVA 计算圆的面积和周长: 创建一个圆Circle类。为该类提供一个变量r表示半径,一个常量PI表示圆周率; * 同时为该类提供两个方法:方法一用于求圆的面积,方法二用于求圆的周长;

      插一句嘴,现在扎扎实实地把这些基础地敲一遍,理解了,可能还是会忘记.但是你最后学习的是做题的思路,而不是单纯的记代码.代码忘了再回过头来看一遍就好了,思路是别人偷不走的.[2022-9] * 思路 ...

  2. python圆的半径计算圆的周长列表_python计算圆周长、面积、球体体积并画出圆

    #https://github.com/RobberPhex/GTK-Example-CalcArea from gi.repository import Gtk, Gdk, GdkPixbuf fr ...

  3. python怎么求圆的体积_python计算圆周长、面积、球体体积并画出圆

    输入半径,计算圆的周长.面积.球体体积,并画出这个圆. 拖动条.输入框和图像控件的数据保持一致! Fedora下测试通过 复制代码 代码如下: #https://github.com/RobberPh ...

  4. 利用python计算圆球的体积_python计算圆周长、面积、球体体积并画出圆

    #https://github.com/RobberPhex/GTK-Example-CalcArea from gi.repository import Gtk, Gdk, GdkPixbuf fr ...

  5. python求阶乘之和_python计算阶乘前n项和

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 知道公式后就很简单了,利用for循环,第几行i+1就等于几,当然python中是 ...

  6. python怎么算积分_python计算积分

    python有多个方法计算积分,下面介绍其中三个,以下式为例: 方法一:直接用numpy计算 start = 1 stop = 2 length = 101 x = np.linspace(start ...

  7. 怎样用python计算π的值_Python 计算 π 值的简单示例

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! π是一个无数人追随的真正的神奇数字.我不是很清楚一个永远重复的无理数的迷人之处.在我看来,我乐于计 ...

  8. python计算化学浓度_python 计算化学

    信息举报 时间:2021-02-11 本页为您甄选多篇描写python 计算化学,python 计算化学精选,python 计算化学大全,有议论,叙事 ,想象等形式.文章字数有400字.600字.80 ...

  9. python怎么算阶乘_python计算阶乘

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 问题本身很简单,主要是通过这个小问题来演示python的一些用法,例如测试代码运 ...

最新文章

  1. 为什么数学是理解世界的最佳方式
  2. BAPC2014 Bamp;amp;HUNNU11582:Button Bashing(BFS)
  3. Weblogic 10.3.6 for linux 集群安装
  4. 4K观影体验需要网络端到端带宽50M-100M,时延RTT<=20ms,丢包率PLR<=3.4*10
  5. 联想android手机驱动,驱动天空 - 手机驱动 - 联想手机 lenovo
  6. 锂电系统上位—数据中心更高效率运营
  7. Java编程的逻辑 (36) - 泛型 (中) - 解析通配符
  8. 推荐《求医不如求己》,实用
  9. 为什么连续申请的两个 int 型变量的地址差值为 12 而不是 4 ?
  10. 台式电脑不拉网线上网_技巧知识:电脑不用网线也可以上网了,你知道吗?
  11. how I can force redetermination everytime
  12. 不显示参数名_Houdini自定义参数Folder的几种模式
  13. 听说麦当劳,买一个雪糕就送一个男友!
  14. vue 自定义 移动端筛选条件
  15. 数据结构知识点大汇总(四)
  16. 网页中多层效果的灵活使用
  17. 说说如何抛出Java异常
  18. custom transition animation between UIViewControllers
  19. Mcmod模组下载脚本
  20. beetle-j2ee-application-framework框架介绍.md

热门文章

  1. 球幕投影中内投球和外投球的区别
  2. Chap.15 总结《CL: An Introduction》 (Vyvyan Evans)
  3. 互联网快讯:华为正式开启二手机业务;法院审理认定阿卡索赔猿辅导20万;极米高性能投影产品获用户青睐;谷歌Pixel 6 Pro首次放弃使用高通基带
  4. 【转载】站在牛顿墓前 文/张琦(北京大学)
  5. JSP内置对象Session——setAttribute/getAttibute/removeAttribute
  6. KeyStore是什么
  7. linux vim编辑器剪切,Linux下Vim编辑器访问系统剪切板
  8. python如何查询数据库_通过Python查询数据库信息
  9. 移动开发者大会第一日观感
  10. 金立 M6 (GN8003) 解锁 BootLoader 进入第三方 recovery 刷机 ROOT