Tkinter如何用lambda函数更改事件绑定的参数值?

2024-10-08 19:27:20 发布

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

我有一个名为chosenTestHolder(从myconfig文件导入)的列表,它由几个对象组成,每个对象的属性都是'sentence'。在

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

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

当我在搜索Stackoverflow时 Using lambda function to change value of an attribute你不能在lambda表达式中使用赋值,但是通过阅读我仍然没有找到解决问题的方法。在

感谢帮助!代码在下面!在

在主.py在

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

我的_配置.py在

^{pr2}$

在测试列表.py在

^{3}$

Tags: 对象lambdaimportselfconfig属性myarg
1条回答
网友
1楼 · 发布于 2024-10-08 19:27:20

你的问题是因达的任务。 你只在init中赋值。在

为了让你的代码工作,你需要重新配置你的句子。。。在

indata =[my_config.chosenTestHolder[my_config.counter] , self.myText]
self.myButton.bind('&ltButtonRelease-1&gt',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

正如你所看到的,根本不需要羔羊。在

编辑 关于你的问题:

  1. 对原始代码的更改不是有意的。
  2. 我看不到可以在代码中使用lambda的用例。
    在需要lambda的地方至少没有。
    请记住仅使用lambda且仅限使用,如果存在
    否(=空)其他选项。
  3. 使用继承(这就是机制的名称),您可以从其他类继承函数、“默认”行为。它是编程中的一种常见机制,并非python所独有。 它的用法与任何普通对象一样,只是需要调用基类的构造函数(我在init方法中使用tk.Frame.__init__(self, args, kwargs)来实现)。有关继承的更多信息,请参考该主题的大量手册和教程(google是您的朋友,现在您已经知道了该机制的名称)。在

相关问题 更多 >

    热门问题