- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 python 相当陌生,正在尝试使用 cairo 和 wxpython 编写一个简单的程序。我习惯于将 cairo 与 gtk 和 C 一起使用,但我发现自己很困惑。
我使用以下代码为自己构建了一个简单的用户界面:
import wx
class Frame(wx.Frame):
def __init__(self, *args, **kwargs):
super(Frame, self).__init__(*args, **kwargs)
self.InitUI()
def InitUI(self):
#----------------------------------------------------
# Build menu bar and submenus
menubar = wx.MenuBar()
# file menu containing quit menu item
fileMenu = wx.Menu()
quit_item = wx.MenuItem(fileMenu, wx.ID_EXIT, '&Quit\tCtrl+W')
fileMenu.AppendItem(quit_item)
self.Bind(wx.EVT_MENU, self.OnQuit, quit_item)
menubar.Append(fileMenu, '&File')
# help menu containing about menu item
helpMenu = wx.Menu()
about_item = wx.MenuItem(helpMenu, wx.ID_ABOUT, '&About\tCtrl+A')
helpMenu.AppendItem(about_item)
self.Bind(wx.EVT_MENU, self.OnAboutBox, about_item)
menubar.Append(helpMenu, '&Help')
self.SetMenuBar(menubar)
#----------------------------------------------------
# Build window layout
panel = wx.Panel(self)
#panel.SetBackgroundColour('yellow')
vbox = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vbox)
midPan = wx.Panel(panel)
#midPan.SetBackgroundColour('blue')
hbox = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(midPan, 1, wx.EXPAND | wx.ALL, 12)
midPan.SetSizer(hbox)
smallPan = wx.Panel(panel)
#smallPan.SetBackgroundColour('red')
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(smallPan, 0, wx.ALIGN_RIGHT|wx.LEFT|wx.RIGHT|wx.BOTTOM, 12)
smallPan.SetSizer(hbox2)
#----------------------------------------------------
# Place buttons in correct box corresponding with panel
close_button = wx.Button(smallPan, wx.ID_CLOSE)
self.Bind(wx.EVT_BUTTON, self.OnQuit, close_button)
hbox2.Add(close_button)
#----------------------------------------------------
# Set window properties
self.SetSize((1600, 1200))
self.SetTitle('PROGRAM NAME')
self.Centre()
def OnQuit(self, e):
self.Close()
def main():
ex = wx.App()
f = Frame(None)
f.Show(True)
ex.MainLoop()
if __name__ == '__main__':
main()
我希望能够在名为 midPan 的面板中绘图。如何添加 OnDraw 函数并链接信号处理程序?
非常感谢您的帮助。
最佳答案
如果您习惯了过程式编程,那么您会感到困惑是自然的。 Python 是一种 OOP 语言,并且采用 OOP 进行编码语言完全不同。我已经清理并更新了提供的例子。用作绘图区域的面板绘制三个彩色矩形。您还没有提供OnAboutBox()
方法的实现,因此,我有注释掉该行。
#!/usr/bin/python
import wx
import wx.lib.wxcairo
import cairo
class DrawingArea(wx.Panel):
def __init__ (self , *args , **kw):
super(DrawingArea , self).__init__ (*args , **kw)
self.SetDoubleBuffered(True)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def OnPaint(self, e):
dc = wx.PaintDC(self)
cr = wx.lib.wxcairo.ContextFromDC(dc)
self.DoDrawing(cr)
def DoDrawing(self, cr):
cr.set_source_rgb (0.2 , 0.23 , 0.9)
cr.rectangle(10 , 15, 90, 60)
cr.fill()
cr.set_source_rgb(0.9 , 0.1 , 0.1)
cr.rectangle(130 , 15, 90, 60)
cr.fill()
cr.set_source_rgb(0.4 , 0.9 , 0.4)
cr.rectangle(250 , 15, 90, 60)
cr.fill()
class Frame(wx.Frame):
def __init__(self, *args, **kwargs):
super(Frame, self).__init__(*args, **kwargs)
self.InitUI()
def InitUI(self):
#----------------------------------------------------
# Build menu bar and submenus
menubar = wx.MenuBar()
# file menu containing quit menu item
fileMenu = wx.Menu()
quit_item = wx.MenuItem(fileMenu, wx.ID_EXIT, '&Quit\tCtrl+W')
fileMenu.AppendItem(quit_item)
self.Bind(wx.EVT_MENU, self.OnQuit, quit_item)
menubar.Append(fileMenu, '&File')
# help menu containing about menu item
helpMenu = wx.Menu()
about_item = wx.MenuItem(helpMenu, wx.ID_ABOUT, '&About\tCtrl+A')
helpMenu.AppendItem(about_item)
#~ self.Bind(wx.EVT_MENU, self.OnAboutBox, about_item)
menubar.Append(helpMenu, '&Help')
self.SetMenuBar(menubar)
#----------------------------------------------------
# Build window layout
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vbox)
midPan = DrawingArea(panel)
vbox.Add(midPan, 1, wx.EXPAND | wx.ALL, 12)
smallPan = wx.Panel(panel)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
vbox.Add(smallPan, 1, wx.EXPAND|wx.ALL, 12)
smallPan.SetSizer(hbox2)
#----------------------------------------------------
# Place buttons in correct box corresponding with panel
close_button = wx.Button(smallPan, wx.ID_CLOSE)
self.Bind(wx.EVT_BUTTON, self.OnQuit, close_button)
hbox2.Add(close_button)
#----------------------------------------------------
# Set window properties
#~ self.SetSize((1600, 1200))
self.SetSize((400, 250))
#~ self.Maximize()
self.SetTitle('PROGRAM NAME')
self.Centre()
def OnQuit(self, e):
self.Close()
def main():
ex = wx.App()
f = Frame(None)
f.Show(True)
ex.MainLoop()
if __name__ == '__main__':
main()
To do the drawing, we create a custom class that will serve as adrawing area. It inherits from a wx.Panel
widget.
class DrawingArea(wx.Panel):
def __init__ (self , *args , **kw):
super(DrawingArea , self).__init__ (*args , **kw)
self.SetDoubleBuffered(True)
self.Bind(wx.EVT_PAINT, self.OnPaint)
...
这是我们用于绘图的自定义类。在构造函数中我们将绘制事件绑定(bind)到 OnPaint()
方法。
def OnPaint(self, e):
dc = wx.PaintDC(self)
cr = wx.lib.wxcairo.ContextFromDC(dc)
self.DoDrawing(cr)
在OnPaint()
方法中我们创建了一个开罗绘图上下文并将实际绘图代码委托(delegate)给 DoDrawing()
方法。
midPan = DrawingArea(panel)
vbox.Add(midPan, 1, wx.EXPAND | wx.ALL, 12)
绘图区域已创建并添加到垂直框中。
#~ self.SetSize((1600, 1200))
self.SetSize((400, 250))
#~ self.Maximize()
最后一点:如果您想最大化显示窗口,请调用Maximize()
方法。计算机屏幕有不同的尺寸。
关于python - 在 wxpython 中使用 cairo 绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23661347/
过去我在学习 Cairo 时拍过一些照片,但总是继续支持其他一些图形库。我的问题是我找不到一个很好的教程来为我的表面提供一个简单的显示。我总是在 GTK 或 QT 文档中挖掘与我想做的事情无关的事情。
我的看法 @api_view(['GET']) @renderer_classes((JSONRenderer,TemplateHTMLRenderer,BrowsableAPIRendere
这听起来很简单,但我找不到将 PDF 加载到开罗的方法。我希望能够以与 cairo.ImageSurface.create_from_png 相同的方式执行 cairo.PDFSurface.crea
我在让 Pango Cairo 自动换行时遇到问题。下面是一些演示代码。我将布局的宽度设置为与红色矩形相同,因此我希望它环绕到红色矩形。实际上,它只是在每一行上放置一个单词,就好像宽度设置得很小一样。
这是我的观点: from django.conf import settings from django.http import HttpResponse from django.template.l
我想在 linux (fedora 12) 下使用 GTK 3 创建一个窗口,并使用 cairo-gl 后端在其上绘制一个简单的矩形,为此我想创建一个 cairo-gl 表面。我该怎么做,任何人都可以
我正在尝试从线程绘制到 cairo 图像表面,但出现断言错误: gtk_mt: /build/buildd/cairo-1.10.2/src/cairo-surface.c:385: _cairo_s
我收到 OSError: dlopen() failed to load a library: cairo / cairo-2在新安装后尝试执行 Django 时。使用 Windows。 根据完整的跟
我正在运行 OSX Lion 并尝试为 goocanvas 导入 python 模块, 使用 python2.7. 我设法成功编译了 pygoocanvas-0.14.1,但是当我尝试通过 pytho
我正在使用 Stack 和 Nix 构建一个 Haskell 项目,并依赖于来自 Hackage 的 cairo 库。 当我构建项目时,出现错误:无法找到 pkg-config >= 0.9.0 或
我是开罗的新手,我已经阅读了其网站上的教程/文档。 现在我可以制作线条、矩形,基本上我可以渲染图像但不能渲染文本。 我正在使用以下代码 cairo_select_font_face (cr, "mon
根据cairo example code ,以下代码 double x=25.6, y=128.0; double x1=102.4, y1=230.4, x2=153.6, y2=2
我在两个位置安装了 python,在操作系统中默认为 2.6.6,在/usr/local/bin/python2.7 中为 2.7。 我已经使用 configure/make/make install
我希望我在开罗的文本遵循绘制的路径。类似于 this . 现在这个链接来自a post在声称已经对此进行编码的开罗邮件列表中。只有代码链接位于 svn.gnome.org这似乎已被撤下。我的问题是,有
我正在尝试学习如何使用 Cairo 2D drawing library与 xlib 曲面。 我编写了一个允许创建多个窗口的小测试程序。每个函数可能有一个自定义的paint()函数,定期调用该函数以向
如果我们不检查 cairo 上下文是否存在会发生什么,如果返回 false 会发生什么,例如: bool MyClass::on_draw(const Cairo::RefPtr& cr) {
我在尝试运行以下命令时不断收到此错误: python -m weasyprint http://weasyprint.org weasyprint.pdf 错误: raise OSError("d
我有一个简单的 Cairo 程序,它试图在 600x600 PNG 中绘制由点组成的对角线。但是,每当我尝试使用对 cairo_stroke() 的一次调用来渲染所有点时,输出似乎被截断了。 具体来说
我有一个 cairo_t cr,我可以用它来使用 cairo。我想尝试在这个 cairo 图形上创建一个突出显示效果,它应该执行以下操作之一: 调亮整个图像,使其看起来更亮一些 将背景,即图像的透明部
我正在使用 C++ 和 GTK3 开发一个应用程序,但我被卡住了。我用 glade 创建了一个可视化应用程序,它具有三列,其中一列(中间一列)是 DrawingArea。在那个 DrawingArea
我是一名优秀的程序员,十分优秀!