"将英文标题翻译成中文,并不包含任何特殊字符或引号:当将2.x代码移植到3.x时出现的tkinter困扰,'tkinter'模块属性不存在"

2024-09-23 22:19:24 发布

您现在位置:Python中文网/ 问答频道 /正文

更新:见下文

我已经移植了这个任务的代码:http://www.stanford.edu/class/cs221/progAssignments/PA1/search.html(整个源代码可以从那里获得zip) 从Python2.x到3.x。注意,移植不是我的任务,我只是想让代码保持最新,避免安装另一个版本的Python。。。在

在修复了通常的2.x->;3.x语法(打印、异常引发等)之后,我意识到模块Tkinter现在在3.x(小写)中被称为{}之后,我遇到了一些奇怪的问题,这段代码和其他类似的代码:

def keys_pressed(d_o_e=tkinter.tkinter.dooneevent,d_w=tkinter.tkinter.DONT_WAIT)

错误类型如下:

^{pr2}$

IDE中的代码完成和变量跟踪似乎确实表明tkinter模块没有属性或子类tkinter,在这些属性或子类下可以引用dooneevent或{}。然而,在互联网上也有一些关于人们使用像

_tkinter.dooneevent(_tkinter.DONT_WAIT)

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

任何想法都值得赞赏。在


更新:通过lambda符号引用_root_窗口似乎可以工作,因为在大多数情况下,它不再抱怨预执行时间。然而,对于我未经训练的眼睛来说,这基本上是“魔法”,因此我几乎不知道接下来的错误是什么,也不知道如何解决它。方法现在看起来像这样,我在第一行做了更改:

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)

我得到的错误是:

TypeError: 'Tk' object is not callable              

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


Tags: 模块代码objecttkinterdef错误coordscurrent
1条回答
网友
1楼 · 发布于 2024-09-23 22:19:24

在Python3中,Tkinter.tkinter似乎已更改为tkinter._tkinter。比较python2中的these docs和python3中的these。另外,dooneevent不再在tkinter._tkinter中,而是Tk(又名root)对象的成员。在

所以把你的代码改成

def keys_pressed(d_o_e=lambda arg: _root_window.dooneevent(arg),
        d_w=tkinter._tkinter.DONT_WAIT):

这利用了在链接代码中_root_windowglobal的事实,因此当定义类时,_root_window不可用,但在lambda运行时它将可用。在

相关问题 更多 >