我有一个名为chosenTestHolder
的列表(从my_config文件导入),该列表由多个对象组成,每个对象都具有属性“sentence”。
第一次按下“按”按钮时,chosenTestHolder
中第一个对象的属性“句子”应显示在文本小部件中。下次按下“按下”按钮时,应显示chosenTestHolder
中第二个对象的属性“句子”,依此类推。
我正在使用lambda事件来绑定“按下”按钮,并在每次按下“按下”按钮后尝试使用新句子作为其第一个参数。但是,它一直显示第一句话。
在搜索Stackoverflow时,我已经看过了 Using lambda function to change value of an attribute你不能在lambda表达式中使用赋值,但通过阅读我仍然没有弄清楚如何解决我的问题。
感谢帮助!代码如下!
main.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()
my_config.py
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
Testlist.py
class Testlist:
def __init__(self, sentence):
self.sentence = sentence
答案 0 :(得分: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几乎没有必要。
修改的
关于你的问题:
tk.Frame.__init__(self, args, kwargs)
方法中使用init
做什么。有关继承的更多信息,请参阅不计数的手册和教程可用于该主题(谷歌现在是您的朋友,您知道该机制的名称)。