将2.x代码移植到3.x时,tkinter会出现问题,'tkinter'模块属性不存在

Mik*_*ael 5 python porting tkinter version

更新:见下文

我一直在移植这个任务的代码:http://www.stanford.edu/class/cs221/progAssignments/PA1/search.html(整个源代码可以从那里以zip形式提供)从Python 2.x到3.x的 注意,移植不是赋值,只是我试图使代码保持最新并避免安装另一个版本的Python ...

通常2.X后- > 3.x的语法修正(印刷,异常引发,等等),并实现该模块Tkinter现在被称为tkinter在3.X(小写),我碰到的陌生人的问题,与这个片段和其他几个喜欢它:

def keys_pressed(d_o_e=tkinter.tkinter.dooneevent,d_w=tkinter.tkinter.DONT_WAIT)
Run Code Online (Sandbox Code Playgroud)

错误的类型如下:

AttributeError: 'module' object has no attribute 'tkinter'
Run Code Online (Sandbox Code Playgroud)

我的IDE中的代码完成和变量跟踪确实似乎表明该tkinter模块没有属性或子类tkinter,可以在其中引用dooneeventDONT_WAIT.但是,在互联网上还有一些使用类似结构的人参考

_tkinter.dooneevent(_tkinter.DONT_WAIT)
Run Code Online (Sandbox Code Playgroud)

将主循环向前移动,但即使像那样引用它仍然会产生相同的错误.

任何想法都非常感激.


更新:通过lambda表示法引用_root_window似乎有效,因为它在大多数情况下不再抱怨执行前的时间.然而,对于我未经训练的眼睛来说,这基本上是"神奇的",因此我不知道这个后续错误在说什么或如何解决它.该方法现在看起来像这样,我在第一行中进行了更改:

def move_to(object, x, y=None, d_o_e=lambda arg: _root_window(arg), d_w=tkinter._tkinter.DONT_WAIT):
    if y is None:
        try: x, y = x
        except: raise  'incomprehensible coordinates'

    horiz = True
    newCoords = []
    current_x, current_y = _canvas.coords(object)[0:2] # first point
    for coord in  _canvas.coords(object):
      if horiz:
        inc = x - current_x
      else:
        inc = y - current_y
      horiz = not horiz

      newCoords.append(coord + inc)

    _canvas.coords(object, *newCoords)
    d_o_e(d_w)
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

TypeError: 'Tk' object is not callable              
Run Code Online (Sandbox Code Playgroud)

引用定义方法的行(上面的第一行).

Ste*_*ski 6

它的出现Tkinter.tkinter改变为tkinter._tkinter在Python 3.比较这些文档在Python 2与这些在Python 3.此外,dooneevent不再tkinter._tkinter,但仍然是的成员Tk(也称为root)对象.

所以将代码更改为

def keys_pressed(d_o_e=lambda arg: _root_window.dooneevent(arg),
        d_w=tkinter._tkinter.DONT_WAIT):
Run Code Online (Sandbox Code Playgroud)

这需要的事实是,在你的代码链接的优点_root_windowglobal,因此,尽管_root_window是不可定义的类时,在运行拉姆达时可用.