tk List控件的值与数组绑定
时间: 2024-03-14 22:48:07 浏览: 131
可以使用Tkinter中的变量类,例如StringVar、IntVar等,将List控件的值与数组绑定。
下面是一个示例代码:
```python
import tkinter as tk
root = tk.Tk()
# 创建一个StringVar类型的变量
var = tk.StringVar()
# 创建一个Listbox控件并设置绑定的变量为var
listbox = tk.Listbox(root, listvariable=var)
# 定义一个数组
array = ['apple', 'banana', 'orange']
# 将数组的值赋给变量var
var.set(tuple(array))
# 显示Listbox控件
listbox.pack()
root.mainloop()
```
在上面的代码中,我们创建了一个StringVar类型的变量var,并将Listbox控件的listvariable属性设置为var。然后将数组array的值赋给var,并将Listbox控件显示出来。这样,Listbox控件中的值就与数组array绑定了。当数组array的值改变时,Listbox控件的值也会相应地改变。
相关问题
import tkinter as tk from tkinter import ttk root = tk.Tk() def on_select(event): selected_items = [value.get() for value in values] for select in selected_items: print(select) # 创建一个 ttk.Combobox 控件 Button4 = tk.Button(root, text="退出", command=on_select) Button4.pack(side="left") # 创建多个 Checkbutton 控件 values = ['序号', '姓名', '学号', '爱好'] for item in values: var = tk.StringVar() chk = ttk.Checkbutton(root, text=item, variable=var) chk.pack() values.append(var) # 绑定 "<<ComboboxSelected>>" 事件到 on_select 函数 root.geometry("300x300") root.mainloop()这个程序为什么不生成窗口
这个程序没有生成窗口的原因是因为在创建多个 Checkbutton 控件时,将变量 var 与每个 Checkbutton 绑定,但是却将这些变量添加到了 values 列表中,导致 values 列表中的元素类型不统一,从而导致程序出错。可以将 values 列表改为一个空列表,将 var 变量直接添加到一个新的列表中即可。同时,将 Button4 和 values 的添加操作放在创建 Checkbutton 控件的 for 循环之前,即可正确生成窗口。修改后的程序如下:
```python
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
def on_select(event):
selected_items = [value.get() for value in values]
for select in selected_items:
print(select)
# 创建一个 ttk.Combobox 控件
Button4 = tk.Button(root, text="退出", command=on_select)
Button4.pack(side="left")
# 创建多个 Checkbutton 控件
var_list = []
values = []
for item in ['序号', '姓名', '学号', '爱好']:
var = tk.StringVar()
chk = ttk.Checkbutton(root, text=item, variable=var)
chk.pack()
var_list.append(var)
# 将 Checkbutton 绑定的变量添加到 values 列表中
for var in var_list:
values.append(var.get())
# 绑定 "<<ComboboxSelected>>" 事件到 on_select 函数
root.geometry("300x300")
root.mainloop()
```
class InventoryApp: def init(self, master): self.master = master master.title("物料进出库统计") self.master.state('zoomed') # 窗口最大化 # 创建左侧面板 self.container = tk.Frame(master) self.container.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 创建左上方面板 self.container_top = tk.Frame(self.container) self.container_top.pack(side=tk.TOP, fill=tk.BOTH, expand=True)# 打开Excel文件 self.wb = openpyxl.load_workbook(r"C:\Users\bing3_chen\Desktop\1.xlsx") self.record_sheet = self.wb["記錄"] self.data_sheet = self.wb["數據"] # 从工作表中获取数据并写入下拉框中 data_list = [] for row in range(2, self.data_sheet.max_row + 1): cell_value = self.data_sheet.cell(row=row, column=1).value if cell_value: data_list.append(cell_value) self.material_name11 = ttk.Combobox(self.container_top, values=data_list) # 创建标签 self.label1 = ttk.Label(self.container_top, text="PEGA-料号:") self.label1.grid(row=0, column=0, padx=5, pady=5) # 添加下拉框控件到界面上 self.material_name11.grid(row=0, column=1, padx=5, pady=5) # 为下拉框控件添加绑定事件 def on_material_name_keyrelease(event): # 获取用户输入的内容 user_input = self.material_name.get() # 根据用户输入的内容过滤下拉框的选项 filtered_options = [option for option in data_list if user_input in option] # 更新下拉框的选项 self.material_name.configure(values=filtered_options) # 展开下拉框 self.material_name.event_generate('<Down>') self.material_name11.bind('<KeyRelease>', on_material_name_keyrelease)self.label6 = ttk.Label(self.container_top, text="品名:") self.label6.grid(row=5, column=0, padx=5, pady=5) self.material_qty6 = ttk.Combobox(self.container_top, values=[]) self.material_qty6.grid(row=5, column=1, padx=5, pady=5)給這段代碼將根據物料名稱下拉輸入框中填寫的内容,去匹配excel表名為數據中第一列相應數據的第5列的值寫道物料品名的下拉框中,沒有就不寫
根据您提供的代码,我注意到在 `on_material_name_keyrelease` 函数中,您使用了 `self.material_name` 而不是 `self.material_name11`,这可能是导致问题的原因。请将以下代码:
```python
# 获取用户输入的内容
user_input = self.material_name.get()
# 根据用户输入的内容过滤下拉框的选项
filtered_options = [option for option in data_list if user_input in option]
# 更新下拉框的选项
self.material_name.configure(values=filtered_options)
# 展开下拉框
self.material_name.event_generate('<Down>')
```
修改为:
```python
# 获取用户输入的内容
user_input = self.material_name11.get()
# 根据用户输入的内容过滤下拉框的选项
filtered_options = [option for option in data_list if user_input in option]
# 更新下拉框的选项
self.material_name11.configure(values=filtered_options)
# 展开下拉框
self.material_name11.event_generate('<Down>')
```
同时,您需要根据用户输入的物料名在 `self.data_sheet` 中查找相应的数据,并将其写入 `self.material_qty6` 中。您可以在 `on_material_name_keyrelease` 函数中添加以下代码:
```python
# 获取用户输入的内容
user_input = self.material_name11.get()
# 在 data_sheet 中查找相应数据
for row in range(2, self.data_sheet.max_row + 1):
if self.data_sheet.cell(row=row, column=1).value == user_input:
# 将数据写入 material_qty6 中
self.material_qty6.configure(values=[self.data_sheet.cell(row=row, column=5).value])
break
else:
# 如果没有找到相应数据,则清空 material_qty6
self.material_qty6.configure(values=[])
```
请注意,`else` 语句块是针对 `for` 循环的,如果 `for` 循环正常结束(即没有执行 `break` 语句),则会执行 `else` 语句块中的代码。
希望这些修改可以解决您的问题。
阅读全文