【发布时间】: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 加载的数据。
我尝试过:('<<ComboboxSelected>>', 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:时创建Label或Button时这不是问题,但不幸的是,我似乎无法将其与ComboBox一起使用。我总是可以创建 5 个不同的ComboBoxes,每个都有单独的代码和一个唯一的StringVar,但我试图教自己如何使用for循环来做到这一点,这样我就可以让它从其他可能需要的脚本中调用不同数量的ComboBoxes。如果您知道如何执行此操作,请发布它,我们将欢迎您的帮助。:)
标签: python-3.x for-loop tkinter combobox