如何 return 格式字符串以及为什么我的按钮不显示?

How to return a format string and why my button don't show up?

我想要这样显示值This is what I want when I select 10 in listbox, but It show like this when I trying Now what its look like我找不到使用 f-string 设置它格式的方法,我还添加了一个名为“测试你自己”的按钮,在我按下它之后将使列表框(可见=假)但我不知道为什么我可以使按钮(可见=真)任何人都可以告诉我我在哪里编码错误吗?

from tkinter.constants import CHAR
import PySimpleGUI as sg
from PySimpleGUI.PySimpleGUI import Exit


def corecode(base):
    if base == 1:
        show1 = f'{1:>3d} * {1:>3d} = {1:> 3d}\n {2:>3d} * {1:>3d} = {2:> 3d}\n {3:>3d} * {1:>3d} = {3:> 3d}\n {4:>3d} * {1:>3d} = {4:> 3d}\n'
        return show1
    else:
        return ("\n"+"-"*13+"\n").join([f'{i+1:>2d} * {j:>2d} = {(i+1)*base:>3d}' for i in range(10)])
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="-Button-")],
    [sg.Button('2', enable_events=True, size=(15, 10), key="-Button-")],
    [sg.Button('3', enable_events=True, size=(15, 10), key="-Button-")],
    [sg.Button('4', enable_events=True, size=(15, 10), key="-Button-")],
]
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),
     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['-Button-'].Update(visible = True)
        window['-Test-'].Update(visible = False)

window.close()

关于可见问题图片: enter image description here 我想做成这个图片应该有4个按钮用来select 1,2,3,4回答问题,但我不知道为什么没有出现:(

一些问题

  • from PySimpleGUI.PySimpleGUI import Exit错误或者不需要,用sg.Exit()或者sg.Button('Exit').
  • 就可以了
  • 一行的宽度太长,无法适应多行的宽度,因此换行到下一行。
  • 在大多数情况下,sg.Button 选项 enable_events 不是必需的。
  • 每个元素(按钮)必须有一个唯一的键。具有相同选项 key='-Button-' 的按钮“1”、“2”、“3”和“4”是错误的。
  • 设置选项 visible=False 将获取元素丢失其位置,因此 sg.pin 用于保留位置。
  • 使用选项 expand_y=True 可在垂直方向填充 space,请记住在必要时展开其容器,否则不再 space 展开。
  • 选项expand_xexpand_y在元素设置为不可见后会丢失,因此需要在元素设置为可见时调用方法expand恢复。
  • 也许是别的。
import PySimpleGUI as sg


def corecode(base):
    j = 4 if base == 1 else 10
    return ("\n"+"-"*13+"\n").join([f'{i+1:>2d} * {base:>2d} = {(i+1)*base:>3d}' for i in range(j)])

def test():
    question = ["What is 9 X 9 ?", " 1. 81", " 2. 12", " 3. 22", " 4. 68"]
    return '\n'.join(question)

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(str(i+1), size=(15, 1), expand_y=True)] for i in range(4)]

list_values = [f'{i+1:>2d}' for i in range(10)]
show_Textbox_selectbox = [
    [sg.Multiline(size=(20, 20), expand_y=True, key='-MULTILINE-')],
    [sg.pin(sg.Listbox(values=list_values, enable_events=True, size=(15, 10), key="-LISTBOX-")),
     sg.pin(sg.Button('Test Yourselves', key="-Test-"))],
]

layout = [
    [sg.Column(showrobot_column, expand_y=True),
     sg.VSeparator(),
     sg.pin(sg.Column(showtest_column, visible=False, expand_y=True,key='-Buttons-'), expand_y=True),
     sg.Column(show_Textbox_selectbox, expand_y=True),],
]

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 in (sg.WIN_CLOSED, 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['-Buttons-'].Update(visible = True)
        window['-Buttons-'].expand(expand_y=True)
        window['-Test-'].Update(visible = False)
    elif event in (str(i+1) for i in range(4)):
        print(f"Selection is {event}")

window.close()