Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter Canvas.create_oval不更新颜色_Python_Tkinter - Fatal编程技术网

Python Tkinter Canvas.create_oval不更新颜色

Python Tkinter Canvas.create_oval不更新颜色,python,tkinter,Python,Tkinter,我正试图改变我在画布上画的线条的颜色,使用函数change\u red。单击运行函数的按钮后,self.color的值将变为红色,但线条仍以黑色绘制 from PIL import Image, ImageTk import tkinter as tk class Window(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.color = "black" menubar = t

我正试图改变我在画布上画的线条的颜色,使用函数change\u red。单击运行函数的按钮后,self.color的值将变为红色,但线条仍以黑色绘制

from PIL import Image, ImageTk
import tkinter as tk

class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.color = "black"
        menubar = tk.Menu(self)
        self.config(menu=menubar)
        operation_menu = tk.Menu(menubar, tearoff=0)
        config_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Change Color", menu=operation_menu)
        menubar.add_cascade(label="Help", menu=config_menu)
        config_menu.add_command(label="Exit", command=lambda: exit())
        operation_menu.add_command(label="Red", command=lambda: self.change_red())
        self.im = ImageTk.PhotoImage(Image.open("Test.png"))
        self.geometry("500x500")
        self.title("Image Editor")
        self.resizable(False, False)
        self.im_cv = tk.Canvas(width=300, height=200)
        self.im_cv.pack(expand="yes", fill="both")
        self.im_cv.create_image(50, 10, image=self.im, anchor="nw")
        self.im_cv.bind("<B1-Motion>", self.paint)

    def change_red(self):
        self.color = "red"

    def paint(self, event):
        print(self.color)
        x1, y1 = (event.x - 1), (event.y - 1)
        x2, y2 = (event.x + 1), (event.y + 1)
        self.my_canvas = self.im_cv.create_oval(x1, y1,x2,y2, fill=self.color, width=5)

window = Window()
window.mainloop()
我尝试在init方法中更改self.color,但它仍然只绘制黑色

from PIL import Image, ImageTk
import tkinter as tk

class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.color = "black"
        menubar = tk.Menu(self)
        self.config(menu=menubar)
        operation_menu = tk.Menu(menubar, tearoff=0)
        config_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Change Color", menu=operation_menu)
        menubar.add_cascade(label="Help", menu=config_menu)
        config_menu.add_command(label="Exit", command=lambda: exit())
        operation_menu.add_command(label="Red", command=lambda: self.change_red())
        self.im = ImageTk.PhotoImage(Image.open("Test.png"))
        self.geometry("500x500")
        self.title("Image Editor")
        self.resizable(False, False)
        self.im_cv = tk.Canvas(width=300, height=200)
        self.im_cv.pack(expand="yes", fill="both")
        self.im_cv.create_image(50, 10, image=self.im, anchor="nw")
        self.im_cv.bind("<B1-Motion>", self.paint)

    def change_red(self):
        self.color = "red"

    def paint(self, event):
        print(self.color)
        x1, y1 = (event.x - 1), (event.y - 1)
        x2, y2 = (event.x + 1), (event.y + 1)
        self.my_canvas = self.im_cv.create_oval(x1, y1,x2,y2, fill=self.color, width=5)

window = Window()
window.mainloop()
从PIL导入图像,ImageTk
将tkinter作为tk导入
类窗口(tk.tk):
定义初始化(自):
tk.tk.\uuuuu初始化(self)
self.color=“黑色”
菜单栏=传统菜单(自身)
self.config(menu=menubar)
操作菜单=传统菜单(菜单栏,TEAROF=0)
配置菜单=tk.menu(菜单栏,tearof=0)
菜单栏。添加\u级联(标签=“更改颜色”,菜单=操作\u菜单)
menubar.add\u级联(label=“Help”,menu=config\u menu)
配置菜单。添加命令(label=“Exit”,command=lambda:Exit())
操作菜单。添加命令(label=“Red”,command=lambda:self.change\u Red())
self.im=ImageTk.PhotoImage(Image.open(“Test.png”))
自几何(“500x500”)
self.title(“图像编辑器”)
自我调整大小(False,False)
self.im_cv=tk.Canvas(宽度=300,高度=200)
self.im\u简历包(expand=“yes”,fill=“两者”)
self.im\u cv.create\u image(50,10,image=self.im,anchor=“nw”)
self.im_cv.bind(“,self.paint)
def更改_红色(自身):
self.color=“红色”
def喷漆(自身、事件):
打印(自身颜色)
x1,y1=(事件x-1),(事件y-1)
x2,y2=(事件x+1),(事件y+1)
self.my_canvas=self.im_cv.create_oval(x1,y1,x2,y2,fill=self.color,width=5)
window=window()
window.mainloop()

您需要意识到
create_oval
函数中的
width
属性实际上是围绕椭圆外侧的边框宽度。默认值为1像素。因此,即使颜色已更改,您也无法从视觉上看到它。为此,您需要更改椭圆/椭圆的厚度或设置
width=0
,即无边框。以下是一个例子:

#I didn't have ImageTk so I have changed it accordingly
import tkinter as tk

class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.color = "black"
        self.t = 2
        menubar = tk.Menu(self)
        self.config(menu=menubar)
        operation_menu = tk.Menu(menubar, tearoff=0)
        config_menu = tk.Menu(menubar, tearoff=0)
        menubar.add_cascade(label="Change Color", menu=operation_menu)
        menubar.add_cascade(label="Help", menu=config_menu)
        config_menu.add_command(label="Exit", command=lambda: exit())
        operation_menu.add_command(label="Red", command=lambda: self.change_red())
        self.im = tk.PhotoImage(file="ex.png")
        self.geometry("500x500")
        self.title("Image Editor")
        self.resizable(False, False)
        self.im_cv = tk.Canvas(self, width=300, height=200)
        self.im_cv.pack(expand="yes", fill="both")
        self.im_cv.create_image(50, 10, image=self.im, anchor="nw")
        self.im_cv.bind("<B1-Motion>", self.paint)

    def change_red(self):
        self.color = "red"

    def paint(self, event):
        # print(self.color)
        x1, y1 = (event.x - self.t), (event.y - self.t)
        x2, y2 = (event.x + self.t), (event.y + self.t)
        self.my_canvas = self.im_cv.create_oval(x1, y1, x2, y2, fill=self.color, width=0)

window = Window()
window.mainloop()
#我没有ImageTk,所以我相应地对其进行了更改
将tkinter作为tk导入
类窗口(tk.tk):
定义初始化(自):
tk.tk.\uuuuu初始化(self)
self.color=“黑色”
self.t=2
菜单栏=传统菜单(自身)
self.config(menu=menubar)
操作菜单=传统菜单(菜单栏,TEAROF=0)
配置菜单=tk.menu(菜单栏,tearof=0)
菜单栏。添加\u级联(标签=“更改颜色”,菜单=操作\u菜单)
menubar.add\u级联(label=“Help”,menu=config\u menu)
配置菜单。添加命令(label=“Exit”,command=lambda:Exit())
操作菜单。添加命令(label=“Red”,command=lambda:self.change\u Red())
self.im=tk.PhotoImage(file=“ex.png”)
自几何(“500x500”)
self.title(“图像编辑器”)
自我调整大小(False,False)
self.im_cv=tk.Canvas(self,宽度=300,高度=200)
self.im\u简历包(expand=“yes”,fill=“两者”)
self.im\u cv.create\u image(50,10,image=self.im,anchor=“nw”)
self.im_cv.bind(“,self.paint)
def更改_红色(自身):
self.color=“红色”
def喷漆(自身、事件):
#打印(自身颜色)
x1,y1=(event.x-self.t),(event.y-self.t)
x2,y2=(event.x+self.t),(event.y+self.t)
self.my_canvas=self.im_cv.create_oval(x1,y1,x2,y2,fill=self.color,width=0)
window=window()
window.mainloop()

你好,斯托夫,谢谢你的回答。没有自我。我的画布不是未定义的。我创建了self.my_canvas,因为我试图用itemconfigure更改函数change_red中的填充。谢谢Miraj,这解决了我的问题!这意味着外框的宽度太大了。@bitbyte是的,你是对的。使用
self.t
可以控制图形的厚度。使用“宽度”属性可以控制边框的厚度。