在For循环中创建不同的复选框,可以单独引用



我正在创建一个节目跟踪器,并且在实际的跟踪器页面上,我想要加载一个滚动的ScrolledText框,其中每个检索到的剧集都有一个复选框(我选择了ScrolledText框,因为它允许我滚动,如果剧集的数量填满了屏幕)。下面的代码完美地做到了这一点,但是每个复选框都被引用为相同的变量,因此每次我单击一个剧集编号时,它都会选择所有剧集。

for alignment in range(1,int(showDisplay_episodesAmount)+1):
# create a radio button
self.showDisplay.episodeCheckbox = Checkbutton(self.showDisplay.episodesScrollBox, text=alignment,variable=var1, onvalue=1, offvalue=0)
self.showDisplay.episodeCheckbox.grid(column=0, row=grid_column)
self.showDisplay.episodesScrollBox.window_create('end', window=self.showDisplay.episodeCheckbox)
self.showDisplay.episodesScrollBox.insert('end', 'n')
grid_column += 1

我希望每个复选框对应于一个单独的剧集号(例如复选框1指的是剧集1等),在for循环中创建,因为我无法预先确定各种各样的节目的剧集数量。我已经尝试了列表方法,使这段代码,既不创建单独的复选框,并禁用滚动条:

for alignment in range(1,int(showDisplay_episodesAmount)+1):
# create a radio button
self.showDisplay.episodeCheckbox[alignment] = {}
self.showDisplay.episodeCheckbox[alignment]['name'] = alignment
self.showDisplay.episodeCheckbox[alignment]['checkbox'] = Checkbutton(self.showDisplay.episodesScrollBox, text=alignment,variable=var1, onvalue=1, offvalue=0).grid(column=0, row=grid_column)
#self.showDisplay.episodesScrollBox.window_create('end', window=self.showDisplay.episodeCheckbox[alignment])
self.showDisplay.episodesScrollBox.insert('end', 'n')
grid_column += 1

如何使生成的每个复选框不同且不相互链接?

您可以使用Jhonatan的简单版本,但您也可以做一些更复杂的事情,例如创建一个字典,其中键是插曲的渐进计数器(您的对齐方式),值是复选框本身,您可以从中访问状态。我不使用普通的tk复选框,而是使用ttk,所以这里有一个ttk的例子:

from tkinter import ttk
checkboxes_dictionary={}
for alignment in range(1,int(showDisplay_episodesAmount)+1):
checkboxes_dictionary[alignment]=ttk.Checkbutton(self.showDisplay.episodesScrollBox, text=alignment)
checkboxes_dictionary[alignment].pack()

这里我假设您只对显示复选框的状态感兴趣,所以我省略了var.

你可以用下面这行来访问复选框的状态:

checkboxes_dictionary[my_episode].state()

my_episode是一个介于0和showDisplay_episodesAmount之间的整数。您还可以扫描此字典以打印所有剧集的状态(已选中/未选中)。

最后注意,在ttk中,state()方法的返回值不是二进制的,而是一个包含多个值的字符串("selected"、"focus"、"focus")。还有许多其他字符串,其中两个或两个以上可以共存,因此输出将是这些字符串的列表。查看文档

我还没有检查我的代码,所以请检查一下

我想你可以用列表代替变量。然后,您可以将每一集设置为列表中的一个项目。这样的:

listofvar = []
for alignment in range(1,int(showDisplay_episodesAmount)+1):
listosvar.append(tk.StringVar())
# create a radio button
self.showDisplay.episodeCheckbox = Checkbutton(self.showDisplay.episodesScrollBox, text=alignment,variable=listofvar[alignment-1], onvalue=1, offvalue=0)
self.showDisplay.episodeCheckbox.grid(column=0, row=grid_column)
self.showDisplay.episodesScrollBox.window_create('end', window=self.showDisplay.episodeCheckbox)
self.showDisplay.episodesScrollBox.insert('end', 'n')
grid_column += 1

现在每个复选框将定义列表中的一个项目…

希望我帮到你。

乔纳森

最新更新