PySimpleGUI f-string格式设置及Test按钮点击后选项按钮不显示求助
PySimpleGUI 开发问题解决方案
1. 乘法表字符串对齐问题
问题原因
corecode函数else分支的列表推导式中误用了未定义的变量j,实际应该使用传入的参数base作为乘数- 格式配置不统一:base=1的分支乘数用了
>3d宽度,其他分支用>2d,且部分行开头存在多余的前置空格,导致多行内容错位
修正方案
统一所有行的格式化规则:两个乘数都用>2d右对齐,乘积用>3d右对齐,移除多余的前置空格,修正变量引用错误。
修正后的corecode函数:
def corecode(base): lines = [] for i in range(1, 11): lines.append(f'{i:>2d} * {base:>2d} = {i*base:>3d}') return ("\n"+"-"*13+"\n").join(lines)
2. 选项按钮无法显示问题
问题原因
- 4个选项按钮使用了重复的key
-Button-,PySimpleGUI要求所有控件的key必须全局唯一,重复key会导致控件定位异常 - 4个按钮放在初始隐藏的
showtest_column列容器中,父容器处于隐藏状态时,即使修改子控件的可见性也无法正常显示
修正方案
- 给
showtest_column添加唯一key,点击Test按钮时直接修改该列的可见性即可批量控制内部所有按钮的显隐 - 将4个选项按钮的key改为唯一值,方便后续绑定答题逻辑
关键修改点:
- 给列添加key:
sg.Column(showtest_column, visible=False, key="-TEST_COL-") - 点击Test按钮时修改列的可见性,而非单独修改按钮:
window["-TEST_COL-"].update(visible=True) - 按钮key修改为
-BUTTON1-、-BUTTON2-、-BUTTON3-、-BUTTON4-
完整修正后代码
import PySimpleGUI as sg def corecode(base): lines = [] for i in range(1, 11): lines.append(f'{i:>2d} * {base:>2d} = {i*base:>3d}') return ("\n"+"-"*13+"\n").join(lines) def test(): showquestion = "What is 9 X 9 ? \n 1. 81 \n 2. 12 \n 3. 22 \n 4. 68 " return showquestion sg.theme('LightBlue') sg.set_options(font=("Courier New", 12)) showrobot_column = [ [sg.Image('E:/img/Gif_robot.gif', size = (700, 700))], [sg.Exit()] ] showtest_column =[ [sg.Button('1', enable_events=True, size=(15, 10), key="-BUTTON1-")], [sg.Button('2', enable_events=True, size=(15, 10), key="-BUTTON2-")], [sg.Button('3', enable_events=True, size=(15, 10), key="-BUTTON3-")], [sg.Button('4', enable_events=True, size=(15, 10), key="-BUTTON4-")], ] list_values = [f'{i+1:>2d}' for i in range(10)] show_Textbox_selectbox = [ [sg.Multiline(size=(15, 20), expand_y=True, key='-MULTILINE-')], [sg.Listbox(values=list_values, enable_events=True, size=(15, 10), key="-LISTBOX-"),sg.Button('Test Yourselves',key="-Test-")], ] layout = [ [sg.Column(showrobot_column), sg.VSeparator(), sg.Column(showtest_column,visible = False, key="-TEST_COL-"), sg.Column(show_Textbox_selectbox),], ] window = sg.Window("First Test", layout, finalize=True) multiline = window['-MULTILINE-'] multiline.update(value=corecode(1)) listbox = window['-LISTBOX-'] listbox.update(set_to_index=0) while True: event, values = window.read() if event == sg.WIN_CLOSED or event == 'Exit': break elif event == '-LISTBOX-': base = int(values[event][0]) multiline.update(value=corecode(base)) elif event == '-Test-': multiline.update(value =test()) window['-LISTBOX-'].Update(visible = False) window['-TEST_COL-'].Update(visible = True) window['-Test-'].Update(visible = False) window.close()
内容的提问来源于stack exchange,提问作者Toby
相关产品推荐
相关产品推荐

