Tkinter:使用按钮单击绘制一个点
Tkinter: draw a point using a button click
今天早上我遇到了一个严重的问题:我加载了一张图片以在 Canvas 上显示它。图片很大,所以我设置了滚动条让用户查看。
我允许用户按下右键以便用鼠标在图像上绘制随机点。
它有效,但它的行为有一个错误:当我向右或向下滚动图像并单击鼠标右键时,点被绘制但不在我单击的像素上。画的很远,脑子不明白为什么。
第二个但不那么令人担忧的问题是,无论我为它们设置什么颜色,这些点都只以黑色绘制。
请帮我解决这个问题或者告诉我为什么会这样,我会尝试做一些事情。到目前为止,我已经为这个问题奋斗了 2 个小时,我在这个网站和整个网站上都没有发现类似的问题 Google:
import PIL.Image
import Image
import ImageTk
from Tkinter import *
class ExampleApp(Frame):
def __init__(self,master):
Frame.__init__(self,master=None)
self.x = self.y = 0
self.canvas = Canvas(self, cursor="cross",width=600,height=650)
self.sbarv=Scrollbar(self,orient=VERTICAL)
self.sbarh=Scrollbar(self,orient=HORIZONTAL)
self.sbarv.config(command=self.canvas.yview)
self.sbarh.config(command=self.canvas.xview)
self.canvas.config(yscrollcommand=self.sbarv.set)
self.canvas.config(xscrollcommand=self.sbarh.set)
self.canvas.grid(row=0,column=0,sticky=N+S+E+W)
self.sbarv.grid(row=0,column=1,stick=N+S)
self.sbarh.grid(row=1,column=0,sticky=E+W)
self.canvas.bind("<ButtonPress-1>", self.on_button_press)
self.rect = None
self.start_x = None
self.start_y = None
self.im = PIL.Image.open("image.jpg")
self.wazil,self.lard=self.im.size
self.canvas.config(scrollregion=(0,0,self.wazil,self.lard))
self.tk_im = ImageTk.PhotoImage(self.im)
self.canvas.create_image(0,0,anchor="nw",image=self.tk_im)
def on_button_press(self,event):
print"({}, {})".format(event.x,event.y)
self.canvas.create_oval(event.x,event.y, event.x+1,event.y+1,fill='red')
# the fill option never takes effect, I do not know why
# When I scroll over the image, the pixels are not drawn where I click
if __name__ == "__main__":
root=Tk()
app = ExampleApp(root)
app.pack()
root.mainloop()
在此先感谢您对我的帮助。
1) 你需要使用canvasx和canvasy方法。
参见示例:
http://effbot.org/tkinterbook/canvas.htm#coordinate-systems
2) 你的椭圆太小了,你只能看到边界线。
使用 outline= 而不是 fill=
今天早上我遇到了一个严重的问题:我加载了一张图片以在 Canvas 上显示它。图片很大,所以我设置了滚动条让用户查看。
我允许用户按下右键以便用鼠标在图像上绘制随机点。
它有效,但它的行为有一个错误:当我向右或向下滚动图像并单击鼠标右键时,点被绘制但不在我单击的像素上。画的很远,脑子不明白为什么。
第二个但不那么令人担忧的问题是,无论我为它们设置什么颜色,这些点都只以黑色绘制。
请帮我解决这个问题或者告诉我为什么会这样,我会尝试做一些事情。到目前为止,我已经为这个问题奋斗了 2 个小时,我在这个网站和整个网站上都没有发现类似的问题 Google:
import PIL.Image
import Image
import ImageTk
from Tkinter import *
class ExampleApp(Frame):
def __init__(self,master):
Frame.__init__(self,master=None)
self.x = self.y = 0
self.canvas = Canvas(self, cursor="cross",width=600,height=650)
self.sbarv=Scrollbar(self,orient=VERTICAL)
self.sbarh=Scrollbar(self,orient=HORIZONTAL)
self.sbarv.config(command=self.canvas.yview)
self.sbarh.config(command=self.canvas.xview)
self.canvas.config(yscrollcommand=self.sbarv.set)
self.canvas.config(xscrollcommand=self.sbarh.set)
self.canvas.grid(row=0,column=0,sticky=N+S+E+W)
self.sbarv.grid(row=0,column=1,stick=N+S)
self.sbarh.grid(row=1,column=0,sticky=E+W)
self.canvas.bind("<ButtonPress-1>", self.on_button_press)
self.rect = None
self.start_x = None
self.start_y = None
self.im = PIL.Image.open("image.jpg")
self.wazil,self.lard=self.im.size
self.canvas.config(scrollregion=(0,0,self.wazil,self.lard))
self.tk_im = ImageTk.PhotoImage(self.im)
self.canvas.create_image(0,0,anchor="nw",image=self.tk_im)
def on_button_press(self,event):
print"({}, {})".format(event.x,event.y)
self.canvas.create_oval(event.x,event.y, event.x+1,event.y+1,fill='red')
# the fill option never takes effect, I do not know why
# When I scroll over the image, the pixels are not drawn where I click
if __name__ == "__main__":
root=Tk()
app = ExampleApp(root)
app.pack()
root.mainloop()
在此先感谢您对我的帮助。
1) 你需要使用canvasx和canvasy方法。 参见示例: http://effbot.org/tkinterbook/canvas.htm#coordinate-systems
2) 你的椭圆太小了,你只能看到边界线。 使用 outline= 而不是 fill=