在tkinter菜单中区分两个相同项目的问题

时间:2016-01-10 03:24:17

标签: python python-3.x menu tkinter popupmenu

我创建的程序允许用户键入的键盘上的任何字母都写在乌龟图形画布上。在我的程序中,我还创建了一个Python菜单,每次用户执行函数/绘制一个字母时,都会向其中写入一个Point对象(对于每个字母函数)。但是,由于我的程序的性质,用户还可以将两个相同的功能附加到菜单。如果两个相同的东西被附加到菜单上,例如两个函数,我需要一种方法来以某种方式区分它们。为此,我在另一个函数中创建了一个计数器,并在写入菜单的函数中调用了该计数器函数,如下所示:

计数器功能:

def increase():
    if not hasattr(increase, "counter"):
        increase.counter = 0
    increase.counter += 1

菜单写入时的代码块:

global loki
kli.config(state = NORMAL)
loki = ("{}".format(po.getfunction()))
increase() #<-- Counter function
undo1.add_command(label = str(increase.counter) + Point.__str__(po), command = lambda: selectundo(undo1.index(po)))

Point.__str__是Point类中的这个方法:

def __str__(self):
    return "({})".format(self.function)

但是,每当我从菜单中选择某些内容时,我都会收到此错误:

undo1.add_command(label = str(increase.counter) + Point.__str__(po), command = lambda: selectundo(undo1.index(po)))
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/tkinter/__init__.py", line 2782, in index
i = self.tk.call(self._w, 'index', index)
tkinter.TclError: bad menu entry index "(<function draw_O at 0x105834d90>)"

我认为它与以下功能有关,它取消了从菜单中选择的功能,但我不确定:

def selectundo(x):
    # This function undoes the function selected from the menu
    for ty in range(x, len(function)):
        undoHandler()
        update()
        listen()

虽然在我将str(increase.counter)连接到Point.__str__(po)之前,它的效果非常好。

所以,我在这里做错了什么?非常感谢任何帮助! :)

编辑:为了清理我想要做的事情以及为什么,我试图区分两个(或更多)相同的功能,如果它们被写入菜单而我是这样做是因为selectundo函数(如上所示),因为,例如,如果用户绘制两个(或更多)相同的字母,我需要能够区分它们,因为现在,当我不能,selectundo函数撤消该字母的所有实例,而不是只是菜单上按下的内容的第一个实例,这是我实际上希望程序执行的操作。如果我想要完成任务是不可能的,或者有更好的方法来完成任务,请告诉我可以用来完成任务的任何其他方式。我希望这有助于缓解任何混乱! :)

0 个答案:

没有答案