Python Tkinter:使用单击按钮绘制点

Python Tkinter:使用单击按钮绘制点,python,python-2.7,canvas,tkinter,Python,Python 2.7,Canvas,Tkinter,今天早上我遇到了一个严重的问题:我加载了一张图片以在画布上显示它。图片很大,所以我设置了滚动条,允许用户查看 我允许用户按下右键,以便用鼠标在图像上随机绘制点 它可以工作,但它的行为有一个缺陷:当我向右或向下滚动图像并单击鼠标右键时,会绘制点,但不会绘制在我单击的像素上。它被拉得很远,我的大脑不明白为什么 第二个但不那么令人担忧的问题是,无论我给点设置了什么颜色,点都只画成黑色 请帮我解决这个问题,或者告诉我为什么会发生这种情况,我会尝试做点什么。到目前为止,我已经与这个问题斗争了2个小时,我在

今天早上我遇到了一个严重的问题:我加载了一张图片以在画布上显示它。图片很大,所以我设置了滚动条,允许用户查看

我允许用户按下右键,以便用鼠标在图像上随机绘制点

它可以工作,但它的行为有一个缺陷:当我向右或向下滚动图像并单击鼠标右键时,会绘制点,但不会绘制在我单击的像素上。它被拉得很远,我的大脑不明白为什么

第二个但不那么令人担忧的问题是,无论我给点设置了什么颜色,点都只画成黑色

请帮我解决这个问题,或者告诉我为什么会发生这种情况,我会尝试做点什么。到目前为止,我已经与这个问题斗争了2个小时,我在这个网站和整个谷歌上都没有发现类似的问题:

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()
导入PIL.Image
导入图像
导入ImageTk
从Tkinter进口*
类示例应用程序(框架):
定义初始(自我,主):
帧。\uuuu初始化(self,master=None)
self.x=self.y=0
self.canvas=canvas(self,cursor=“cross”,宽度=600,高度=650)
self.sbarv=滚动条(self,orient=垂直)
self.sbarh=滚动条(self,orient=水平)
self.sbarv.config(命令=self.canvas.yview)
self.sbarh.config(命令=self.canvas.xview)
self.canvas.config(yscrollcommand=self.sbarv.set)
self.canvas.config(xscrollcommand=self.sbarh.set)
self.canvas.grid(行=0,列=0,粘性=N+S+E+W)
self.sbarv.grid(行=0,列=1,棒=N+S)
self.sbarh.grid(行=1,列=0,粘性=E+W)
self.canvas.bind(“,self.on_按钮按)
self.rect=None
self.start_x=无
self.start_y=无
self.im=PIL.Image.open(“Image.jpg”)
self.wazil,self.lard=self.im.size
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按钮按下(自身,事件):
打印“({},{})”格式(event.x,event.y)
self.canvas.create_oval(event.x,event.y,event.x+1,event.y+1,fill='red')
#填充选项从未生效,我不知道为什么
#当我在图像上滚动时,单击的位置不会绘制像素
如果名称=“\uuuuu main\uuuuuuuu”:
root=Tk()
app=ExampleApp(root)
app.pack()
root.mainloop()
提前感谢您的帮助。

1)您需要使用画布和画布方法。 例如,见:

2) 你的椭圆太小了,你只能看到边界线。 使用outline=代替fill=