绑定文本文本小部件中的标签时遇到困难

问题描述 投票:-2回答:1

我在tkinter模块中的文本小部件上有点挣扎。我添加了尝试将功能绑定到的标签。

无论我如何键入,它都会发生以下两种情况之一。我可以在文本小部件中单击,但是弹出的唯一功能是针对最后一项的,而不管我单击的位置如何。发生的第二件事是它只是自动弹出所有功能。

对原始帖子进行了修改,并删除了我输入的编码。在这里进行了与原始编码相同的函数调用(此处减少了15k的不必要代码):

 #!/usr/bin/en python
 # *-* coding: utf-8 *-*

 import platform as platform
 from tkinter import *

 class guidelen:
      def __init__(self, master):
           self.master = master
           self.master.title("programmet")
           self.master.geometry("400x400")

           self.populate()

      def populate(self):
           self.meny = Menu(self.master, tearoff=0)
           self.startmeny = Menu(self.meny, tearoff=0)
           self.startmeny.add_command(label="Avslutt",command=self.master.quit)
           self.meny.add_cascade(label="Start", menu=self.startmeny)
           self.master.config(menu=self.meny)
           self.tekstfelt = Text(self.master)
           self.tekstfelt.pack(fill=BOTH, expand=True)



      setninger = ["første setningen","andre setningen","tredje setningen"]
           start = 0
           posisjon = 1
           while start < len(setninger):
               pos = str(posisjon) + ".0"
               b = len(setninger[start])
               pos2 = str(posisjon) +"."+ str(b)
               setning = setninger[start] + "\n"
               self.tekstfelt.insert(pos, setning)
               setning.replace("\n","")
               self.tekstfelt.tag_add(setning, pos, pos2)
               self.tekstfelt.tag_bind(setning, "<Button-1>", self.utskrift2(start))
               print(start)
               posisjon += 1
               start += 1

       def utskrift(self, event):
           print("Prøver tag bindingen")

       def utskrift2(self, event):
           if event == 0:
               print("Taggen til første linjen")
           if event == 1:
               print("Taggen til andre linjen")
           if event == 2:
               print("Taggen til tredje linjen")


 if __name__ == "__main__":
       start = Tk()
       guidelen(start)
       start.mainloop()

因此,无论我如何更改功能,它始终对文本小部件中的所有项目提供相同的绑定,或者只是自动弹出所有绑定/函数调用。

有没有人知道我在做什么错?

tkinter widget bind
1个回答
0
投票

考虑此代码:

self.tekstfelt.tag_bind(setning, "<Button-1>", self.utskrift2(start))

它具有与此代码相同的行为:

result = self.utskrift2(start)
self.tekstfelt.tag_bind(setning, "<Button-1>", result)

您看到问题了吗?您需要将callable传递给绑定,并且您的函数没有返回可调用的对象。

解决方案是使用类似lambdafunctools.partial的名称。我更喜欢lambda,主要是因为它不需要额外的导入。使用lambda,您需要该函数接受tkinter传递的event,并且还需要传递起始值。它看起来像这样:

self.tekstfelt.tag_bind(setning, "<Button-1>", lambda event, start=start: self.utskrift2(start))

由于您使用单个参数调用utskrift2,并且该参数是start值而不是event,因此您需要重新定义utskrift2如下所示:

def utskrift2(self, start):
    if start == 0:
        print("Taggen til første linjen")
    if start == 1:
        print("Taggen til andre linjen")
    if start == 2:
        print("Taggen til tredje linjen")
© www.soinside.com 2019 - 2024. All rights reserved.