繁体   English   中英

从 tkinter 中的绑定 combobox 检索选定值

[英]retrieve selected value from a binded combobox in tkinter

我正在尝试从绑定的 combobox 中检索选定的值。

在下面的代码中,我将名为“LSF_Combo”的 combobox 绑定到另一个 combobox“Queue _Combo”。 我正在尝试使用Queue_Combo.get()方法从“Queue_Combo”中检索所选值,但我无法这样做,因为它的 scope 被限制在LSF_fields_Enable(event)内部 function 内。 我可以使用LSF_Combo.get()方法检索 LSF_Combo 的选定值。

请让我知道是否有人对从“Queue_Combo”combobox 和进一步嵌套的组合框“MT_Combo: 和“Merge_Combo”中检索选定值有建议,以便我应该能够访问这些值并将其分配给“LSF_Fields_Enable”之外的变量function scope。

例如,如果我从“Queue_Combo”中选择了“优先级”并从“MT_Combo”中选择了“MT”,我应该能够将这些字符串分配给 LSF_Fields_Enable(event) function 之外的变量。 从“def run_program()”变量“b”的字符串应该等于“优先级”(因为我选择了这个),变量“c”的字符串应该等于“MT”。

from tkinter import *
import tkinter as tk
from tkinter import ttk

root = Tk()
root.geometry("800x450")

def Gui_main():
    Queue_Combo_list = ['normal', 'priority', 'devices', 'grid']
    Queue_Combo = ttk.Combobox(root, values=Queue_Combo_list, width=10, state="readonly")
    Merge_Combo_list = ['LST_SET_ML', 'LST_SET_EQU']
    Merge_Combo = ttk.Combobox(root, values=Merge_Combo_list, width=12)
    MT_Combo_list = ['MT', 'MTFLEX']
    MT_Combo = ttk.Combobox(root, values=MT_Combo_list, width=10)

    def LSF_Fields_Enable(event):
        # global Queue_Combo, VCO_Combo, OS_Combo
        VCO_1 = None
        if LSF_Combo.get() == 'LSF':
            # # section for Queue Type
            Queue_Combo_label = tk.Label(root, text="Queue: ").grid(row=2, column=1, padx=5,sticky=W)
            Queue_Combo.set("normal")
            Queue_Combo.grid(row=2, column=1, padx=55, pady=5, sticky=W)

            def MT_MT_flex(choice):

                    def Manage_run_mode(choice):
                        # if Merge_Combo.get() == 'LSF_SET_EQU' or 'LSF_SET_MAN':
                        if Merge_Combo.get() != 'LSF_SET_ML':
                            label = tk.Label(root, text="CPU No:").grid(row=4, column=3, padx=10,sticky=tk.W)
                            CPU_radio_button = tk.IntVar()
                            R1 = Radiobutton(root, text="2", variable=CPU_radio_button, value=1).place(x=50, y=520)

                    if MT_Combo.get() == 'MT':
                        # # section for choosing a file version
                        Merge_Combo_label = tk.Label(root, text="Merge: ").grid(row=6, column=2, padx=10,sticky=W)
                        Merge_Combo.set("LST_SET_ML")
                        Merge_Combo.grid(row=6, column=2, padx=65, pady=15, sticky=tk.E)
                        Merge_Combo.bind('<<ComboboxSelected>>',Manage_run_mode)

            MT_Combo_label = tk.Label(root, text="MT/MTflex: ").grid(row=2, column=3, padx=10,sticky=W)
            MT_Combo.set("MT")
            MT_Combo.grid(row=2, column=4, padx=5, pady=5, sticky=tk.E)
            MT_Combo.bind('<<ComboboxSelected>>',MT_MT_flex)

    # LSF_Fields_Enable()

    LSF_Combo_label = tk.Label(root, text="Fill: ").grid(row=2, column=0, sticky=W)
    LSF_Combo_list = ['LSF', 'LOCAL']
    LSF_Combo = ttk.Combobox(root, values=LSF_Combo_list, width=10, state="readonly", background='white')
    LSF_Combo.set('LSF')
    LSF_Combo.grid(row=2, column=0, padx=25, pady=5, sticky=W)
    LSF_Combo.bind('<<ComboboxSelected>>',  LSF_Fields_Enable)
    Queue_Combo.bind('<<ComboboxSelected>>', lambda _: print(Queue_Combo.get()))
    MT_Combo.bind('<<ComboboxSelected>>', lambda _: print(MT_Combo.get()))
    Merge_Combo.bind('<<ComboboxSelected>>', lambda _: print(Merge_Combo.get()))

    # a = LSF_Combo.bind("<Return", LSF_Fields_Enable)

    def run_program():
        a = LSF_Combo.get()
        print(a)
        b = Queue_Combo.get()
        print(b)
        c = MT_Combo.get()
        d = Merge_Combo.get()


    close = Button(root, text ='close', command= root.destroy).grid(row=10, column=2, pady=60, sticky=E)
    check_combo_get =Button (root, text ='check_combo_get', command = run_program).grid(row=10, column=1, padx=15,pady=60, sticky=E)
    root.mainloop()

if __name__ == "__main__":
    Gui_main()

在您的设置中没有一种简单的方法可以解决此问题。 但是解决方案很简单,如果你只是提前 go 并稍微重组你的代码:

  1. 在 LSF_Fields_Enable function 之外定义combobox并在启动时分配其值。 Queue_Combo_list = ['normal', 'priority', 'devices', 'grid'] Queue_Combo = ttk.Combobox(root, values=Queue_Combo_list, width=10, state="readonly")

  2. 现在将ComboboxSelected事件绑定到您想要的任何 function (在此示例中为简单打印)。 Queue_Combo.bind('<<ComboboxSelected>>', lambda _: print(Queue_Combo.get()))

还有你 go。 现在,每次队列组合框的选择更改时,都会执行打印 function。

希望这可以帮助:)

完整代码:

from tkinter import *
import tkinter as tk
from tkinter import ttk

root = Tk()
root.geometry("300x250")

def Gui_main():
    Queue_Combo_list = ['normal', 'priority', 'devices', 'grid']
    Queue_Combo = ttk.Combobox(root, values=Queue_Combo_list, width=10, state="readonly")
    def LSF_Fields_Enable(event):
        # global Queue_Combo, VCO_Combo, OS_Combo
        VCO_1 = None
        if LSF_Combo.get() == 'LSF':
            # # section for Queue Type
            Queue_Combo_label = tk.Label(root, text="Queue: ").grid(row=2, column=1, padx=10,sticky=W)
            Queue_Combo.set("normal")
            Queue_Combo.grid(row=2, column=1, padx=55, pady=5, sticky=W)
        print(Queue_Combo.get())
        return Queue_Combo.get()

    # LSF_Fields_Enable()

    LSF_Combo_label = tk.Label(root, text="Fill: ").grid(row=2, column=0, sticky=W)
    LSF_Combo_list = ['LSF', 'LOCAL']
    LSF_Combo = ttk.Combobox(root, values=LSF_Combo_list, width=10, state="readonly", background='white')
    LSF_Combo.set('LSF')
    LSF_Combo.grid(row=2, column=0, padx=25, pady=5, sticky=W)
    LSF_Combo.bind('<<ComboboxSelected>>', LSF_Fields_Enable)
    Queue_Combo.bind('<<ComboboxSelected>>', lambda _: print(Queue_Combo.get()))
    # a = LSF_Combo.bind("<Return", LSF_Fields_Enable)

    def test_bind():
        print(LSF_Combo.get())
        print(Queue_Combo.get())
    test_bind()

    close = Button(root, text ='close', command= root.destroy).grid(row=10, pady=60, sticky=E)
    root.mainloop()

if __name__ == "__main__":
    Gui_main()

暂无
暂无

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

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