2011-01-29 31 views
0

我有一个Tkinter的画布组件,我想在其上创建点画模式。我知道我可以使用create_line方法做手工。不过,我认为似乎有更好的办法。任何帮助将非常感激。什么是点画一个Tkinter的帆布插件的最简单的方法?

我目前正在工作什么。 (按Alt-F4退出程序)

import Tkinter, re 

class StippleCanvas(Tkinter.Tk): 
    def __init__(self, parent): 
     Tkinter.Tk.__init__(self, parent) 


     self.overrideredirect(1) 
     self.resizable(False,False) 
     self.wm_attributes("-topmost", 1) 
     self.attributes("-alpha", 0.9) 

     w = 90 
     h = 90 

     self.Ca = Tkinter.Canvas(self, width=w, height=h, highlightthickness=0, bd=0, bg='grey25') 
     self.Ca.grid(column=0, row=0) 
     self.bind('<Button-1>', self.relative_mouse_position) 
     self.bind('<ButtonRelease-1>', self.wid_unbind) 

     i0 = 0 
     while i0 < w: 
      i1 = 0 
      while i1 < h: 
       self.Ca.create_line(i1, i0, i1+1, i0, fill='grey20', width=1) 
       i1 = i1 + 2 
      i0 = i0 + 2 

    def geom_grab (self): 
     Cursorgfltr = re.compile(r"(\d+), (\d+)") 
     CursorPos = self.winfo_pointerxy() 
     CursorPosGr = Cursorgfltr.search(str(CursorPos)) 
     self.CursorX = int(CursorPosGr.group(1)) 
     self.CursorY = int(CursorPosGr.group(2)) 

     gfltr = re.compile(r"(\d+)?x?(\d+)?([+-])(\d+)([+-])(\d+)") 

     gf = gfltr.search(self.wm_geometry()) 
     self.X = int(gf.group(4)) 
     self.Y = int(gf.group(6)) 

    def relative_mouse_position (self, event): 
     self.geom_grab() 

     RelX = self.CursorX - self.X 
     RelY = self.CursorY - self.Y 

     self.Ca.bind("<Motion>", lambda event: self.wid_drag(event, RelX, RelY)) 

    def wid_drag (self, event, RelX, RelY): 


     self.geom_grab() 

     X = self.CursorX - RelX 
     Y = self.CursorY - RelY 

     if X < 0: 
      X = 0 

     if Y < 0: 
      Y = 0 

     self.wm_geometry('+' + str(X) + '+' + str(Y)) 


    def wid_unbind (self, event): 
     self.Ca.unbind("<Motion>") 

def run(): 
    StippleCanvas(None).mainloop() 
if __name__ == '__main__': 
    run() 

回答

0

最简单的?这取决于你对“简单”的定义。一种方法是使用绘图程序为背景创建想要的图像,然后将其放置在画布上。这假定您提前知道画布的大小。没有什么比将单个图像插入画布更简单的了。

关于这一主题的变化是创建一个小瓦,并且使用的Tkinter的图像处理,以创建适当大小的新形象与新的图像平铺原始图像。这可以在每次画布调整大小时完成。其中一些例子可以在下面的链接中可以看出,虽然他们是在Tcl中,而不是Python的(将其转换为蟒是非常直接的,所以不要让这种幽灵你):

http://wiki.tcl.tk/4389

虽然坦率地说,对于简单的点画,你所做的很好。我想移动点画,绘图功能,以便可以重新运行每当画布变化尺寸(即:当它得到一个<Configure>事件)。

相关问题