繁体   English   中英

如何在tkinter中绑定单选按钮和combobox?

[英]how to bind the radio button with combobox in tkinter?

嗨,我有一些值的组合框(用户 select 只有一个项目),我想根据 select 允许用户从单选按钮进行 select 多选。 例如:elemnt- 用户 select 一个元素的组合框,然后是 select 许多作物 grom 单选按钮。 我无法将两者联系起来。 请帮助我的代码:

def calibration_window():
    global cb_elemnt,cb_crop
    top = tkinter.Toplevel (window)
    top.title ("Calibration")
    top.geometry ("400x400")
    ttk.Label (top, text="Select an element:",font = ("Segoe UI Light", 10)).grid (column=0, row=0)
    cb_elemnt = ttk.Combobox (top, values=ele_list)
    cb_elemnt.grid(column=0, row=1)
    ttk.Label (top, text="Select a crop:",font = ("Segoe UI Light", 10)).grid (column=2, row=0)
    # connect between element comobox to the func
    cb_elemnt.bind ("<<ComboboxSelected>>",set_radio)



def set_radio(event):
    i=0
    radios=[]
    for widget in radios:
        widget.destroy ()
    radios = []
    if StringVar().get() !="N":
         radio_values = pd.unique (df[df['elemnt'] == StringVar().get()]["crop"]) #take  the suitable crop from DB
    else:
        radio_values = pd.unique (df_nir[df_nir['elemnt'] == StringVar().get()]["crop"])

    for t in radio_values:
        i = i + 1
        b = Radiobutton (self, text=t, variable=IntVar(), value=t)
        b.grid (row=i, column=0)
        radios.append(b)

您应该在 function 之外创建IntVar和 list radio ,这样它们就不会被垃圾回收。

import tkinter as tk
from tkinter import ttk
import pandas as pd
import numpy as np

#sample data
df = pd.DataFrame({"element":np.random.choice(["Elem A","Elem B","Elem C"], 20),
                   "crops": [f"Crop {i}" for i in range(20)]})

root = tk.Tk()

r_var = tk.IntVar(value=0)
radios=[]
ttk.Label(root, text="Select an element:",font=("Segoe UI Light", 10)).grid(column=0, row=0)
cb_elemnt = ttk.Combobox(root, values=df["element"].unique().tolist())
cb_elemnt.grid(column=0, row=1)
ttk.Label(root, text="Select a crop:",font=("Segoe UI Light", 10)).grid(column=2, row=0)

def set_radio(event):
    for widget in radios:
        widget.destroy()
    if cb_elemnt.get():
        radio_values = df.loc[df["element"].eq(cb_elemnt.get()),"crops"]
        for num, t in enumerate(radio_values, 1):
            b = tk.Radiobutton(root, text=t, variable=r_var, value=t)
            b.grid (row=num, column=1)
            radios.append(b)

cb_elemnt.bind ("<<ComboboxSelected>>", set_radio)
root.mainloop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM