Python 框架实例没有调用方法

Python 框架实例没有调用方法,python,tkinter,Python,Tkinter,当你点击虚线时,我试图把它们变成填充线。相反,我在单击一行时出现以下错误: Traceback (most recent call last): File "/Users/dan/Documents/pyCatan/path_engine.py", line 106, in <module> root.mainloop() File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib

当你点击虚线时,我试图把它们变成填充线。相反,我在单击一行时出现以下错误:

Traceback (most recent call last):
  File "/Users/dan/Documents/pyCatan/path_engine.py", line 106, in <module>
    root.mainloop()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1017, in mainloop
    self.tk.mainloop(n)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1414, in __call__
    self.widget._report_exception()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1175, in _report_exception
    root = self._root()
AttributeError: Frame instance has no __call__ method
回溯(最近一次呼叫最后一次):
文件“/Users/dan/Documents/pyCatan/path_engine.py”,第106行,在
root.mainloop()
mainloop中的文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py”,第1017行
self.tk.mainloop(n)
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py”,第1414行,在调用__
self.widget.\u报告\u异常()
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py”,第1175行,在报告中
root=self.\u root()
AttributeError:Frame实例没有调用方法
类似问题的常见原因是多种用途的污染变量,但我在这里不这么做。另外,我声明了正在调用的方法,这是另一个类似问题中的错误

这是我的noobie代码:

from map_gen import MapGen
from gen_board import CatanApp
from Tkinter import *

class PathEngine(object):
    '''Use the configuration options to show or hide certain attributes.'''

    # show the edges explicitly 
    SHOW_EDGES = False 
    # show road intersections as nodes, explicitly
    SHOW_NODES = True
    # color the hexes to their resource color
    COLOR_HEXES = False

    CLICK_ADD_EDGES = True

    # dimensions
    HEIGHT = 600
    WIDTH = 800

    def __init__(self, root):
        self._model = MapGen()
        self._model.gen()
        CatanApp.set_vertices(self._model.get_map())
        self._model.prepare()
        frame = Frame(root, height=PathEngine.HEIGHT, width=PathEngine.WIDTH)
        frame.pack()
        self._canvas = MapDrawer(frame)
        self.render()
        self._canvas.config(height=PathEngine.HEIGHT, width=PathEngine.WIDTH)
        self._canvas.pack()

    def render(self):
        if PathEngine.SHOW_NODES:
            for node in self._model.get_nodes():
                self._canvas.draw_node(*node)
        self.add_edges()

    def add_edges(self):
        for edge in self._model.get_roads():
            if PathEngine.CLICK_ADD_EDGES:
                self._canvas.draw_dashed_edge(edge[0][0], edge[0][1], edge[1][0], edge[1][1])

class MapDrawer(Canvas):
    NODE_RADIUS = 20

    def __init__(self, master):
        Canvas.__init__(self, master)
        self._root = master

    def draw_dashed_edge(self, x1, y1, x2, y2, color=None):
        if color is None:color = "black"
        t = "road_%s_%s" % (str((x1, y1)), str((x2, y2)))
        self.create_line(
            x1,
            y1,
            x2,
            y2,
            fill=color,
            dash=(1, 1),
            width=3,
            tags=("road", t)
        )
        f = lambda event: self.solidify_dashed_edge(t)                  
        self.tag_bind(t, "<Button-1>", f)

    def solidify_dashed_edge(self, tag):
        self.itemconfigure(tag, dash=(0, 1))

    def draw_node(self, x, y, color=None):
        if color is None: color = "white"
        self.create_oval(
            x - MapDrawer.NODE_RADIUS / 2,
            y - MapDrawer.NODE_RADIUS / 2,
            x + MapDrawer.NODE_RADIUS / 2,
            y + MapDrawer.NODE_RADIUS / 2,
            fill=color,
            outline="black"
        )


if __name__ == "__main__":
    root = Tk()
    engine = PathEngine(root)
    root.mainloop()
从map\u gen导入MapGen
从gen_board进口CatanApp
从Tkinter进口*
类路径引擎(对象):
''使用配置选项显示或隐藏某些属性''
#显式显示边
显示边=假
#将道路交叉点显式显示为节点
SHOW_NODES=True
#将六角体颜色设置为其资源颜色
颜色X=假
单击添加边=真
#尺寸
高度=600
宽度=800
定义初始化(自,根):
self.\u model=MapGen()
self._model.gen()
CatanApp.set_顶点(self._model.get_map())
self.\u model.prepare()
frame=frame(根,高度=PathEngine.height,宽度=PathEngine.width)
frame.pack()
self.\u canvas=MapDrawer(框架)
self.render()
self.\u canvas.config(高度=路径引擎高度,宽度=路径引擎宽度)
self.\u canvas.pack()
def渲染(自):
如果PathEngine.SHOW\u节点:
对于self.\u模型中的节点。获取\u节点():
self.\u canvas.draw\u节点(*节点)
self.add_边()
def添加_边(自):
对于自我中的边缘。\u模型。获取道路()
如果是PathEngine.com,请单击添加边:
self.\u canvas.绘制\u虚线\u边(边[0][0],边[0][1],边[1][0],边[1][1])
类MapDrawer(画布):
节点半径=20
定义初始(自我,主):
画布。\uuuuu初始化(自,主)
self.\u root=master
def绘制虚线边缘(自身、x1、y1、x2、y2,颜色=无):
如果颜色为“无”:color=“黑色”
t=“道路%s%s”%(str((x1,y1)),str((x2,y2)))
自创线(
x1,
y1,
x2,
y2,
填充=颜色,
破折号=(1,1),
宽度=3,
标签=(“道路”,t)
)
f=lambda事件:自固化\u虚线\u边缘(t)
self.tag_绑定(t,“,f)
def固化\u虚线\u边缘(自身,标记):
self.itemconfigure(标记,破折号=(0,1))
def draw_节点(自身、x、y、颜色=无):
如果颜色为“无”:color=“白色”
自我创造(
x-MapDrawer.NODE_半径/2,
y-MapDrawer.NODE_半径/2,
x+MapDrawer.NODE_半径/2,
y+MapDrawer.NODE_半径/2,
填充=颜色,
outline=“黑色”
)
如果名称=“\uuuuu main\uuuuuuuu”:
root=Tk()
引擎=路径引擎(根)
root.mainloop()

画布中添加属性
\u root
时,您似乎遇到了名称冲突:

>>> import Tkinter as tk
>>> a = tk.Canvas()
>>> print a._root
<bound method Canvas._root of <Tkinter.Canvas instance at 0xee1c0>>

其中,
master
是一个
Frame
对象。

画布中添加属性
\u root
时,似乎遇到了名称冲突:

>>> import Tkinter as tk
>>> a = tk.Canvas()
>>> print a._root
<bound method Canvas._root of <Tkinter.Canvas instance at 0xee1c0>>

其中,
master
是一个
Frame
对象。

我想你的缩进已经关闭了——类定义之后的所有函数都是类的一部分吗?对不起,我在Python中的缩进有问题,在StackOverflow上发布……这是一个常见问题。基本上,你只需复制粘贴它,然后点击看起来像
{}
的小按钮,它几乎总是做正确的事情。这就是我所做的,那么这个类就不是灰色部分的一部分了。我想我应该说,在点击该按钮之前,您需要确保选择了所有要缩进的代码:)。不管怎样,我为你编辑过。检查以确保我没有弄错。我想您的缩进已关闭--类定义之后的所有函数都是类的一部分吗?抱歉,我在Python中遇到缩进问题,在StackOverflow上发布…这是一个常见问题。基本上,你只需复制粘贴它,然后点击看起来像
{}
的小按钮,它几乎总是做正确的事情。这就是我所做的,那么这个类就不是灰色部分的一部分了。我想我应该说,在点击该按钮之前,您需要确保选择了所有要缩进的代码:)。不管怎样,我为你编辑过。检查一下,确保我没弄错。