在 tkiner 文本小部件中绑定标签时苦苦挣扎



我在 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()

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

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

请考虑以下代码:

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

它的行为与此代码相同:

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

你看到问题了吗?需要将可调用对象传递给绑定,并且函数未返回可调用对象

解决方案是使用 lambda 或 functools.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")

最新更新