【问题标题】:Creating unique comboboxes in tabs of a notebook using tkinter and python 3使用 tkinter 和 python 3 在笔记本的选项卡中创建独特的组合框
【发布时间】:2016-10-12 14:46:41
【问题描述】:

我正在尝试创建一个程序来保存射频定向耦合器的扫描值。

我有 5 个耦合器,每个耦合器有 4 个转发端口。

我已设法在 tk 笔记本的单独选项卡上获得 5 个耦合器,并从 excel 中为单个端口加载存储的数据。当我想使用组合框为不同的端口重新加载 UI 数据时,问题就来了。

我现在的代码是:

def __init__(self, parent, controller):

    tk.Frame.__init__(self, parent)
    Notebook_Tabbed = ttk.Notebook(self)
    VHF_1, VHF_2 = ttk.Frame(Notebook_Tabbed), ttk.Frame(Notebook_Tabbed)
    Notebook_Tabbed.grid(column = 2, row = 2, columnspan = 5, sticky = "nwes")
    Notebook_Tabbed.add(VHF_1, text = ' VHF 1 '), Notebook_Tabbed.add(VHF_2, text = ' VHF 2 ')

    # Dictionaries to hold each couplers variables
    vhf_1_dict = {1 : [2, 7, 4, 5], 3 : [2, 7, 9, 10]}
    vhf_2_dict = {1 : [9, 14, 4, 5], 3 : [9, 14, 9, 10]}

    # Dictionary to hold above dictionaries
    var_dict = {VHF_1 : vhf_1_dict, VHF_2 : vhf_2_dict}

    def populate_table_tab(self, tab, Row_Start, Row_End, Column_Start,
                           Column_End, Coupler_Type, port):
        print(tab, Row_Start, Row_End, Column_Start,
                           Column_End, Coupler_Type, port)

    # Load data for chosen port
    def change_port(self, tab, port):
        populate_table_tab(self, tab, var_dict[tab][port][0], var_dict[tab][port][1], 
                          var_dict[tab][port][2], var_dict[tab][port][3], 'VHF', port)

    # Generate comboboxes for each tab of the notebook
    ports = StringVar()
    ports.set(1)

    def generate_port_selections(self, tab, row_num):
        port_selection = ttk.Combobox(tab, textvariable = ports, state = 'readonly',
                                      justify = "center")
        port_selection['values'] = (1, 3)
        port_selection.grid(column = 2, row = row_num, sticky = "nwes")
        port_selection.bind('<<ComboboxSelected>>', 
                             lambda _: change_port(self, tab, int(ports.get())))
        # _ denotes a throwaway argument required to make lambda work with a combobox event

    # Generate port selection comboboxes on each tab
    for tab, row_num in {VHF_1 : 4, VHF_2 : 11}.items():
        generate_port_selections(self, tab, row_num)

此代码确实有效,但它同时更改了所有其他选项卡上的组合框,而不更改从 excel 加载的数据。

我尝试过:('&lt;&lt;ComboboxSelected&gt;&gt;', lambda i = i: change_port(self, tab, port_selection_list[i].get())) 但出现了TypeError: list indices must be integers or slices, not Event

任何帮助将不胜感激,而且我在工作和忙碌时匆忙发布了这个,所以如果我错过了任何必要的代码/信息,请询问。

编辑:通过将单行变为多行来格式化代码以使其可读。

编辑 2:简化代码。

编辑 3:您现在应该能够在此代码的空白容器和框架中运行代码。

【问题讨论】:

  • 您是否尝试将port 保存为对象的属性?也许它正在收集垃圾。
  • @Bryan 如果添加 self.port = port 到 change_port() 是你的意思,那么是的。不幸的是,这并没有什么不同。我还在此方法中的方法调用中将端口更改为 self.port。
  • 请阅读How to Create a Minimal, Complete, and Verifiable Example (MCVE)。由于问题似乎与多个页面有关,因此 MCVE 将需要在组合框中包含不超过两个,并且可能不超过两个值,并且没有其他非严格必要的小部件。
  • 您只有一个StringVar,并且您将其分配给所有Comboboxes,因此所有Comboboxes 都显示来自此StringVar 的相同值。每个Combobox 都需要自己的StringVar
  • @furas 在使用lambda i=i: 时创建LabelButton 时这不是问题,但不幸的是,我似乎无法将其与ComboBox 一起使用。我总是可以创建 5 个不同的ComboBoxes,每个都有单独的代码和一个唯一的StringVar,但我试图教自己如何使用for 循环来做到这一点,这样我就可以让它从其他可能需要的脚本中调用不同数量的ComboBoxes。如果您知道如何执行此操作,请发布它,我们将欢迎您的帮助。 :)

标签: python-3.x for-loop tkinter combobox


【解决方案1】:

您遇到了问题,因为您只创建了一个 StringVar (ports = StringVar()) 并将其与所有 Combobox( textvariable=ports ) 一起使用,因此它们共享相同的信息。

您必须在generate_port_selections() 中使用ports = StringVar() 来为新的Combobox 创建新的唯一ports

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多