我正在創建一個節目跟蹤器,在實際的跟蹤器頁面上,我想為檢索到的每個劇集加載一個帶有復選框的滾動 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
我怎樣才能使生成的每個復選框都不同且不相互關聯?
uj5u.com熱心網友回復:
您可以使用 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”和許多其他值,并且它們中的兩個或多個可以共存,因此輸出將是這些字串的串列。查看檔案
我沒有檢查我的代碼,所以請檢查一下
uj5u.com熱心網友回復:
我認為您可以使用串列而不是變數。然后,您可以將每一集設定為串列中的一項。像這樣:
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
現在每個復選框將在串列中定義一個專案...
希望我有所幫助。
喬納森
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497226.html
