你如何在Python中绘制网格和矩形?

时间:2010-08-21 20:09:03

标签: python user-interface pygtk tkinter glade

您可以轻松地使用哪些与Python相关的代码(PyGTK,Glade,Tkinter,PyQT,wxPython,Cairo,...)来创建GUI来执行以下部分或全部操作?

  1. GUI的一部分有一个不可移动的方格。
  2. 用户可以按一个按钮来创建一个可调整大小的矩形。
  3. 用户可以将矩形拖动到网格上的任何位置,它将捕捉到网格。

3 个答案:

答案 0 :(得分:2)

PyQt附带的DiagramScene Eaxmple实现了您想要的大部分功能。它有一个固定的背景网格,你可以创建一个矩形对象,但它不可调整大小,也不会捕捉到网格。

这个SO article有关于使用鼠标调整图形对象大小的建议。它适用于C ++ Qt,但该技术应该很容易在PyQt中复制。

对于对齐网格,我认为没有任何内置功能。您可能需要重新实现itemChange(GraphicsItemChange change,const QVariant& value)函数。伪代码:

if (object not possitioned exactly on the grid):
    (possition the item on the grid)

重新定位项目会导致itemChange再次被调用,但这没关系,因为该项目将被正确放置并且不会再次移动,因此您不会陷入无限循环。

答案 1 :(得分:0)

这些行动并不那么困难。你真正需要的只是命中检测,这并不难(光标在正确的区域上?好吧,然后执行操作)。更难的部分是为正在使用的工具包找到合适的画布小部件

答案 2 :(得分:0)

我正在寻找这样的事情,最后设法用Python wx制作一个“最小”的工作示例,利用wx.lib.ogl及其Diagram和{{ 1}}类。代码(如下)产生如下结果:

test.png

注意:

  • 应用程序以添加的圆圈开始;按 SPACE 可在随机位置添加矩形
  • 单击一个对象将其选中(以显示句柄);要取消选择它,再次单击该对象(单击背景无效) - 这是ShapeCanvas的功能
  • 网格是“手动”绘制的;但是,捕捉到网格是ogl
  • 的功能
  • 对齐网格仅在使用鼠标拖动移动形状时自动工作;出于其他目的,您必须手动调用它
  • 对齐网格 - 以及通过手柄调整形状大小 - 适用于每个形状的中心(不确定ogl是否允许将该锚点更改为,例如,左下角)< / LI>

该示例使用ogl类来执行自己的绘图,并从MyPanelogl.ShapeCanvas继承(尽管可以删除带有wx.Panel的mixin,并且代码仍然可以正常工作) - 然后将其添加到wx.Panel。请注意一些注意事项的代码注释(例如使用wx.Frame阻止所有关键事件,除非首先在该窗口小部件上执行ogl.ShapeCanvas

代码:

SetFocus