0

我有一个名为chosenTestHolder(从 my_config 文件导入)的列表,它由几个对象组成,每个对象都具有“句子”属性。

第一次按下“按下”按钮时,chosenTestHolder文本小部件中应显示第一个对象的属性“句子”。下次按下“Press”按钮时,chosenTestHolder应该显示第二个对象的属性“sentence”,依此类推。

我正在使用 lambda 事件来绑定“按下”按钮,并在每次按下“按下”按钮后尝试使用新句子作为其第一个参数。但是,它一直显示第一句话。

在搜索 Stackoverflow 时,我在 使用 lambda 函数更改属性的值时看到,您不能在 lambda 表达式中使用赋值,但通过阅读我仍然没有弄清楚如何解决我的问题。

感谢帮助!代码如下!

主文件

from tkinter import font
import tkinter as tk
import tkinter.ttk as ttk

import my_config 
import Testlist as tl


class TestWidgetTest:

  def __init__(self):

        ram               = tk.Frame(root)
        ram.grid(in_=root,row=0, column=0) 
        self.myText       = tk.Text(ram, height = 5)
        self.myText.grid(row=0,column=1)

        my_config.counter = 0

        self.myButton    = tk.Button(ram, text = 'Press')
        self.myButton.grid(row =1, column =0, columnspan =2)
        indata =[my_config.chosenTestHolder[my_config.counter] , self.myText]
        self.myButton.bind('<ButtonRelease-1>',lambda event, arg=indata : self.TagConfigure(event, arg))


  def TagConfigure(self, event, arg):
        arg[1].delete('1.0',tk.END)
        arg[1].insert('1.0',arg[0].sentence)

        my_config.counter += 1


root  = tk.Tk()

TestWidgetTest()
root.mainloop()

我的配置文件

import Testlist as tl

testListHolder  = [ ['Fabian was very tired'],
                ['Thomas light the fire'],
                ['Anna eat a red apple ']]

chosenTestHolder = []
count = 0
while count <(len(testListHolder)):  
    chosenTestHolder.append(tl.Testlist(testListHolder[count][0]))
    count += 1  

counter = 0

测试列表.py

class Testlist:

    def __init__(self, sentence):

       self.sentence   = sentence
4

1 回答 1

0

您的问题是 indata 的分配。您只在 init 中分配。

要使您的代码正常工作,您需要重新配置您的sentecte ...

indata =[my_config.chosenTestHolder[my_config.counter] , self.myText]
self.myButton.bind('<ButtonRelease-1>',lambda event, arg=indata : self.TagConfigure(event, arg))

我建议将当前句子作为实例变量进行跟踪。

class Test_widget(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, args, kwargs)
        self.sentences=["a", "b", "c", "d"] # the data
        self.show = tk.StringVar()          # the current displayed data
        self.show.set("NULL")
        self.counter=0                      # the indexer

        tk.Label(self, textvariable=self.show).grid(row=0)
        tk.Button(self, command=self.click).grid(row=1)

    def click(self, event):
        self.show.set("%s"%self.sentences[self.counter]) # use the indexer to access the data
        self.counter = self.counter + 1                  # modify the indexer
        if self.counter = len(self.sentences):           # make sure you dont run in index-err
            self.counter = 0

如您所见,完全不需要 lambda。

编辑 您的问题:

  1. 您的原始代码中的更改不是有意的。
  2. 我没有看到可以在代码中使用 lambda 的用例。
    至少没有需要 lambda 的地方。如果没有 (== NULL)其他选项,请记住仅
    使用 lambda 。

  3. 使用继承(这就是所谓的机制),您可以从其他类继承函数,“默认”行为。它是编程中的一种常见机制,并非 Python 独有。它与任何普通对象一样使用,除了您必须调用基类的构造函数(我tk.Frame.__init__(self, args, kwargs)init方法中使用的内容。有关继承的更多信息,请参阅该主题可用的不计其数的手册和教程(谷歌现在是您的朋友)你知道这个机制叫什么)。
于 2018-02-09T11:31:01.710 回答