pysimplegui如何根据一个drop的值改变另一个drop的可选值
时间: 2024-04-29 10:23:41 浏览: 9
在PySimpleGUI中,可以使用`sg.Combo`来创建下拉菜单控件。要根据一个下拉菜单的值来改变另一个下拉菜单的可选值,可以使用`sg.InputCombo`和`update`方法。
具体步骤如下:
1. 创建两个`sg.InputCombo`对象,分别作为两个下拉菜单控件。例如:
```python
import PySimpleGUI as sg
# 创建第一个下拉菜单控件
choices1 = ["A", "B", "C"]
input_combo1 = sg.InputCombo(choices1, default_value=choices1[0], key="-COMBO1-")
# 创建第二个下拉菜单控件,初始可选值为choices1
input_combo2 = sg.InputCombo(choices1, default_value=choices1[0], key="-COMBO2-")
```
2. 为第一个下拉菜单控件添加`change`事件的回调函数。当下拉菜单的值改变时,更新第二个下拉菜单的可选值。例如:
```python
def update_choices2(selected_value):
# 根据第一个下拉菜单的值,设置第二个下拉菜单的可选值
if selected_value == "A":
choices2 = ["a1", "a2", "a3"]
elif selected_value == "B":
choices2 = ["b1", "b2", "b3"]
else:
choices2 = ["c1", "c2", "c3"]
window["-COMBO2-"].update(values=choices2, value=choices2[0])
# 为第一个下拉菜单控件添加 change 事件的回调函数
input_combo1.bind("<ComboboxSelected>", "_COMBO1_CHANGE_")
def _COMBO1_CHANGE_(event):
selected_value = event.widget.get()
update_choices2(selected_value)
```
在回调函数中,首先获取第一个下拉菜单的当前值,然后根据该值更新第二个下拉菜单的可选值。最后使用`update`方法更新第二个下拉菜单的值和可选值。
3. 创建一个`sg.Window`对象,并将两个下拉菜单控件添加到窗口中。例如:
```python
layout = [
[sg.Text("Select Option 1:")],
[input_combo1],
[sg.Text("Select Option 2:")],
[input_combo2],
[sg.Button("OK"), sg.Button("Cancel")]
]
window = sg.Window("My Window", layout)
```
4. 进入事件循环,等待用户操作。例如:
```python
while True:
event, values = window.read()
if event == "OK":
sg.popup("You selected:", values["-COMBO1-"], values["-COMBO2-"])
elif event == "Cancel" or event == sg.WINDOW_CLOSED:
break
window.close()
```
在事件循环中,可以根据用户的操作进行相应的处理。在本例中,当用户点击"OK"按钮时,弹出一个消息框,显示用户选择的两个下拉菜单的值。
完整代码示例:
```python
import PySimpleGUI as sg
# 创建第一个下拉菜单控件
choices1 = ["A", "B", "C"]
input_combo1 = sg.InputCombo(choices1, default_value=choices1[0], key="-COMBO1-")
# 创建第二个下拉菜单控件,初始可选值为choices1
input_combo2 = sg.InputCombo(choices1, default_value=choices1[0], key="-COMBO2-")
def update_choices2(selected_value):
# 根据第一个下拉菜单的值,设置第二个下拉菜单的可选值
if selected_value == "A":
choices2 = ["a1", "a2", "a3"]
elif selected_value == "B":
choices2 = ["b1", "b2", "b3"]
else:
choices2 = ["c1", "c2", "c3"]
window["-COMBO2-"].update(values=choices2, value=choices2[0])
# 为第一个下拉菜单控件添加 change 事件的回调函数
input_combo1.bind("<ComboboxSelected>", "_COMBO1_CHANGE_")
def _COMBO1_CHANGE_(event):
selected_value = event.widget.get()
update_choices2(selected_value)
layout = [
[sg.Text("Select Option 1:")],
[input_combo1],
[sg.Text("Select Option 2:")],
[input_combo2],
[sg.Button("OK"), sg.Button("Cancel")]
]
window = sg.Window("My Window", layout)
while True:
event, values = window.read()
if event == "OK":
sg.popup("You selected:", values["-COMBO1-"], values["-COMBO2-"])
elif event == "Cancel" or event == sg.WINDOW_CLOSED:
break
window.close()
```