在Tkinter画布小部件上点绘的最简单方法是什么?
我有一个Tkinter的画布组件,我想在上面创建一个点状图案。我知道可以用create_line这个方法手动来做。不过,我觉得应该有更好的方法。希望能得到一些帮助。
这是我现在正在做的。(按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()
1 个回答
0
最简单的方法?这要看你怎么理解“简单”了。有一种方法是用绘图软件先画好你想要的背景图,然后把它放到画布上。这种方法需要你事先知道画布的大小。其实,把一张图片插入到画布上没有比这更简单的了。
还有一种变体,就是先创建一个小图块,然后利用tkinter的图像处理功能,把原始图像重复拼接成一个合适大小的新图像。每次画布大小改变时都可以这样做。你可以在下面的链接中看到一些例子,虽然它们是用Tcl语言写的,但转换成Python非常简单,所以别被这个吓到:
不过,老实说,对于简单的点画来说,你现在做的已经很好了。我建议把点画的部分放到一个函数里,这样每当画布大小变化时(比如收到一个<Configure>
事件),就可以重新运行这个函数。