為了清楚起見,我重新撰寫了問題。我對任何事情都持開放態度——如果需要,可以進行徹底的重新設計。
我遇到了問題并試圖從頭開始,因為我找不到任何有效的解決方案。
我有一個包含 75 列的檔案,每一列都是一個特征。我希望用戶能夠選擇要在分析中包含哪些功能。
問題 1. 最好的小部件是什么?首先,我嘗試使用串列框,但它不會讓我選擇不連續的專案,除非在默認狀態下需要選擇每個單獨的專案(有 75 個專案,所以這將是很多點擊)。
接下來,我嘗試使用復選框。我認為這是最好的解決方案,但我在實施時遇到了問題。用戶界面如下所示:

我試圖將其與“單擊”框串列相關聯,然后我可以將其傳遞到后端以洗掉不需要的變數,因為應用程式的其余部分是資料密集型的。
全選和取消全選按鈕作業正常;我的問題是個人選擇。
這是實作這一目標的正確方法嗎?如果是這樣,這將如何實作?TIA-我昨天開始使用 tkinter,所以我知道的很少。
這是我生成以下內容的方式(簡化)
創建按鈕的代碼:
import tkinter as tk
settings.data_included_cols = ['button1'] #This is the list of clicked buttons
checkbox_buttons=dict()
checkbox_variables=dict()
button_names=['button1', 'button2', 'button3']
i=0
for i in range(len(button_names)):
checkbox_variables[i]=1
checkbox_button[i] = tk.Checkbutton(frame, text=button_names[i],
variable=checkbox_variables[i],
command=checkbox_click)
命令代碼(checkbox_click)- 我不知道這里發生了什么,但到目前為止我沒有嘗試過。最初我稱它為: command=lambda: checkbox_click(i),它試影像下面這樣作業:
def checkbox_click(i):
if i in settings.data_included_cols:
settings.data_included_cols.remove(button_name[i])
這不起作用,因為 'i' 與按鈕無關,它與回圈相關聯,因此無論最終值是什么(在本例中為 3 映射到 button3),它始終是。
有什么想法嗎?
uj5u.com熱心網友回復:
復選框不需要指定命令。
但是,它們確實需要 a StringVarorIntVar與它們關聯,因此您可以查詢這些值。
所以我會像這樣構建你的代碼:
names = {
"id", "member_id", "loan_amnt"
}
values = {}
boxes = {}
for name in names:
values[name] = tk.Intvar(value=1)
boxes[name] = ttk.Checkbox(root, text=name, variable=values[name])
用戶提交選擇后,您可以查詢 dict ofvalues以查看選擇了哪些選項。
uj5u.com熱心網友回復:
問題是,盡管您在創建它們時為每個檢查按鈕分配了不同的“功能”,但當單擊其中一個按鈕時,程式將執行該功能
lambda: feature_list(feature)
它將嘗試獲取“特征”的值,并會發現它等于串列中的最后一個。
看似唯一的解決方案是為每個復選按鈕分配一個變數,例如:
import tkinter as tk
from tkinter import ttk
def click():
temp = []
for i in range(3):
if value[i].get() == 1:
temp.append(feature[i])
print(temp)
if __name__ == "__main__":
root = tk.Tk()
feature = ["one", "two", "three"]
check = {}
value = {}
for i in range(3):
value[i] = tk.IntVar(value=0)
check[i] = ttk.Checkbutton(root, text=feature[i], variable=value[i], onvalue=1, offvalue=0, command=click)
check[i].grid(row=0, column=i)
root.mainloop()
然后當您選擇一些按鈕時,例如“一”和“三”,然后它會列印
['one', 'three']
您不應該吝嗇創建 Tk 變數,因為檢查按鈕占用的空間應該比變數占用的空間大得多。此外,創建變數以獲取小部件的狀態是您應該始終使用的最“標準”和“Pythonic”的方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/486917.html
