我在画布小部件上创建椭圆形状时遇到问题,所以我在构造函数中的框架上声明了一个画布小部件。
class Map(Frame):
def __init__(self, master = none):
Frame.__init__(self, master)
....... ##lines of code
c = Canvas(master, width = 500,height = 500,relief = "groove")
c.pack(side = "right")
def operation(self):
.............. ##lines of code
self.createoval() ##call create oval method after loop code
def createoval(self):
x = 0
y = 0
c1 = canvas.create_oval(x-5, y-5, x+10, y+10, fill = "red")
##error map object has no create_oval.
c1.coords(c1, x, y)
c1.move(c1, 500, 500)
return c1
理想情况下,我想要的是在循环结束后创建椭圆形状,所以我会调用处理它的方法,但是我有两个问题。
第一。我遇到的第一个问题是在构造函数中建立的画布上创建椭圆。当我尝试这样做时,我得到消息“画布未定义”或当我使用self.canvas.createoval时,我收到消息“地图对象没有属性画布”
所以我的问题是如何创建一个可以在构造函数中建立的画布上创建椭圆的方法?
第二期:
c1 = canvas.create_oval(x-5, y-5, x+10, y+10, fill = "red")
我得到x未定义的错误,即使它已经定义并且我使用了coords()方法但是这并没有解决问题。
答案 0 :(得分:0)
您对此代码存在许多问题。下面是在我的画布上创建一个椭圆形的代码(虽然给出了你的坐标,它部分偏离屏幕)。
from tkinter import *
class Map(Frame):
def __init__(self, master = None):
Frame.__init__(self, master)
self.c = Canvas(master, width = 500,height = 500,relief = "groove")
self.c.pack(side = "right")
def operation(self):
self.createoval() ##call create oval method after loop code
def createoval(self):
x = 0
y = 0
c1 = self.c.create_oval(x-5, y-5, x+10, y+10, fill = "red")
return c1
m = Map(Tk())
m.createoval()
解决您的一些问题:
none
时使用None
。它区分大小写!self
的一部分。这意味着当您使用c = Canvas(...
创建画布时,您需要实际拥有self.c = Canvas(...
。否则c
将仅存在于__init__
的范围内,并且不会存在于其他任何地方。canvas
变量创建椭圆,但此变量来自何处?它以前从未定义过。您在c
方法中专门调用了画布变量__init__
,因此您需要在createoval
方法中将其称为相同的内容。请注意,您还需要使用self.c
。c1.coords(c1,x,y)
大概设置了椭圆的位置。但是椭圆的创建已经设定了位置,所以如果这是你的意图,这是一条冗余线。它也没有被正确使用。创建的变量c1
是一个简单的整数,它是画布上椭圆的ID。您需要使用coords
使用canvas对象调用self.c.coords(c1,x,y)
方法。这会将画布c1
上的self.c
椭圆的坐标重置为(x,y)
位置,但是因为您在创建椭圆后从未更改x
或y
,它会将它设置到相同的位置,你不会注意到任何变化。move
的{{1}}电话相同,您发现同样的问题。