PySimpleGui 右对齐框架中的按钮
PySimpleGui right justify a button in a frame
我正在使用 pysimplegui
构建一个简单的 GUI,并希望右对齐框架内的按钮。我找到了有关如何使用文本而不是按钮执行此操作的详细信息。
例如,我希望下面的按钮能够捕捉到框架的右侧,并且周围有凹槽。我想要这个:
看起来更像这样:
但不必添加手动调整的空白文本元素来关闭它,因为这通常不会正确排列(请注意下面注释掉的 sg.Text("", size=(22, 1))
行)。
import sys
import PySimpleGUI as sg
sg.theme("Light Blue 2")
layout = [
[
sg.Text("Target folder", size=(9, 1)),
sg.InputText(default_text="Choose a folder...", size=(59, 1)),
sg.FolderBrowse(),
],
[
sg.Frame(
layout=[
[
sg.Text("First parameter", size=(15, 1)),
sg.InputText(default_text="2", size=(3, 1),),
],
[
sg.Text("Second parameter", size=(15, 1)),
sg.InputText(default_text="8", size=(3, 1),),
# sg.Text("", size=(22, 1)),
sg.Submit("A nice button", size=(23, 1)),
],
[sg.ProgressBar(1, orientation="h", size=(50, 20))],
],
title="Cool subpanel",
relief=sg.RELIEF_GROOVE,
)
],
]
window = sg.Window("Test window", layout)
while True:
event, values = window.read()
if event == "Cancel" or event is None:
sys.exit()
您可以将框架部分的内容拆分为两个 sg.Column
,然后将 expand_x
设置为 True
,将 element_justification
设置为 right
,然后vertical_alignment
到 bottom
这将得到你的定位。
import sys
import PySimpleGUI as sg
sg.theme("Light Blue 2")
l_col = sg.Column(
[
[
sg.Text("First parameter", size=(15, 1)),
sg.InputText(default_text="2", size=(3, 1)),
],
[
sg.Text("Second parameter", size=(15, 1)),
sg.InputText(default_text="8", size=(3, 1)),
],
]
)
r_col = sg.Column(
[[sg.Submit("A nice button", size=(23, 1))]],
element_justification="right",
vertical_alignment="bottom",
expand_x=True,
)
layout = [
[
sg.Text("Target folder", size=(9, 1)),
sg.InputText(default_text="Choose a folder...", size=(59, 1)),
sg.FolderBrowse(),
],
[
sg.Frame(
layout=[
[l_col, r_col],
[sg.ProgressBar(1, orientation="h", size=(50, 20))],
],
title="Cool subpanel",
relief=sg.RELIEF_GROOVE,
)
],
]
window = sg.Window("Test window", layout)
while True:
event, values = window.read()
if event == "Cancel" or event is None:
sys.exit()
在 macOS 上尺寸似乎有点偏差,但这应该可以满足需要。
用零填充的列元素替换内联按钮也可以,并且需要更少的代码修改。
对于旧版本的 PySimpleGUI,未定义 expand_x
参数,因此您必须为列分配一个键并显式调用扩展方法:
import sys
import PySimpleGUI as sg
sg.theme("Light Blue 2")
layout = [
[
sg.Text("Target folder", size=(9, 1)),
sg.InputText(default_text="Choose a folder...", size=(59, 1)),
sg.FolderBrowse(),
],
[
sg.Frame(
layout=[
[
sg.Text("First parameter", size=(15, 1)),
sg.InputText(default_text="2", size=(3, 1),),
],
[
sg.Text("Second parameter", size=(15, 1)),
sg.InputText(default_text="8", size=(3, 1),),
sg.Column(
[[sg.Submit("A nice fat button", size=(23, 1))]],
element_justification="right",
expand_x=True,
key="c1",
pad=(0, 0),
),
],
[sg.ProgressBar(1, orientation="h", size=(50, 20))],
],
title="Cool subpanel",
relief=sg.RELIEF_GROOVE,
)
],
]
window = sg.Window("Test window", layout)
# window['c1'].expand(True, False, False) # use this when 'expand_x' flag is not available
while True:
event, values = window.read()
if event == "Cancel" or event is None:
sys.exit()
你的问题刚刚错过了 PySimpleGUI 的一个版本,它使这个操作变得微不足道。
Whosebug 的一个问题是——“没有死”……包括旧的解决方案。这是一个真正的问题,我还没有找到可靠的解决方案。
此技术于 2021 年 9 月在版本 4.48.0 中发布,并使用了当时新的 Push
元素。顾名思义,Push
将推动元素。通过在元素之间放置一个,它会将元素推开。
这是您的代码,在您想要右对齐的按钮之前添加了 Push
。
import sys
import PySimpleGUI as sg
sg.theme("Light Blue 2")
layout = [
[
sg.Text("Target folder", size=(9, 1)),
sg.InputText(default_text="Choose a folder...", size=(59, 1)),
sg.FolderBrowse(),
],
[
sg.Frame(
layout=[
[
sg.Text("First parameter", size=(15, 1)),
sg.InputText(default_text="2", size=(3, 1),),
],
[
sg.Text("Second parameter", size=(15, 1)),
sg.InputText(default_text="8", size=(3, 1),),
sg.Push(),
sg.Button("A nice button", size=(23, 1)),
],
[sg.ProgressBar(1, orientation="h", size=(50, 20))],
],
title="Cool subpanel",
relief=sg.RELIEF_GROOVE,
)
],
]
window = sg.Window("Test window", layout)
while True:
event, values = window.read()
if event == "Cancel" or event is None:
sys.exit()
这是结果:
注意(这不是特别重要)- 我用 Button
替换了 Submit
,因为使用 Submit
可能会造成混淆。 Submit
只不过是 returns 一个带有文本 "Submit"
的 Button
元素的函数。它没有做任何特别的事情,实际上提供的参数可能比 Button
.
少
我正在使用 pysimplegui
构建一个简单的 GUI,并希望右对齐框架内的按钮。我找到了有关如何使用文本而不是按钮执行此操作的详细信息。
例如,我希望下面的按钮能够捕捉到框架的右侧,并且周围有凹槽。我想要这个:
看起来更像这样:
但不必添加手动调整的空白文本元素来关闭它,因为这通常不会正确排列(请注意下面注释掉的 sg.Text("", size=(22, 1))
行)。
import sys
import PySimpleGUI as sg
sg.theme("Light Blue 2")
layout = [
[
sg.Text("Target folder", size=(9, 1)),
sg.InputText(default_text="Choose a folder...", size=(59, 1)),
sg.FolderBrowse(),
],
[
sg.Frame(
layout=[
[
sg.Text("First parameter", size=(15, 1)),
sg.InputText(default_text="2", size=(3, 1),),
],
[
sg.Text("Second parameter", size=(15, 1)),
sg.InputText(default_text="8", size=(3, 1),),
# sg.Text("", size=(22, 1)),
sg.Submit("A nice button", size=(23, 1)),
],
[sg.ProgressBar(1, orientation="h", size=(50, 20))],
],
title="Cool subpanel",
relief=sg.RELIEF_GROOVE,
)
],
]
window = sg.Window("Test window", layout)
while True:
event, values = window.read()
if event == "Cancel" or event is None:
sys.exit()
您可以将框架部分的内容拆分为两个 sg.Column
,然后将 expand_x
设置为 True
,将 element_justification
设置为 right
,然后vertical_alignment
到 bottom
这将得到你的定位。
import sys
import PySimpleGUI as sg
sg.theme("Light Blue 2")
l_col = sg.Column(
[
[
sg.Text("First parameter", size=(15, 1)),
sg.InputText(default_text="2", size=(3, 1)),
],
[
sg.Text("Second parameter", size=(15, 1)),
sg.InputText(default_text="8", size=(3, 1)),
],
]
)
r_col = sg.Column(
[[sg.Submit("A nice button", size=(23, 1))]],
element_justification="right",
vertical_alignment="bottom",
expand_x=True,
)
layout = [
[
sg.Text("Target folder", size=(9, 1)),
sg.InputText(default_text="Choose a folder...", size=(59, 1)),
sg.FolderBrowse(),
],
[
sg.Frame(
layout=[
[l_col, r_col],
[sg.ProgressBar(1, orientation="h", size=(50, 20))],
],
title="Cool subpanel",
relief=sg.RELIEF_GROOVE,
)
],
]
window = sg.Window("Test window", layout)
while True:
event, values = window.read()
if event == "Cancel" or event is None:
sys.exit()
在 macOS 上尺寸似乎有点偏差,但这应该可以满足需要。
用零填充的列元素替换内联按钮也可以,并且需要更少的代码修改。
对于旧版本的 PySimpleGUI,未定义 expand_x
参数,因此您必须为列分配一个键并显式调用扩展方法:
import sys
import PySimpleGUI as sg
sg.theme("Light Blue 2")
layout = [
[
sg.Text("Target folder", size=(9, 1)),
sg.InputText(default_text="Choose a folder...", size=(59, 1)),
sg.FolderBrowse(),
],
[
sg.Frame(
layout=[
[
sg.Text("First parameter", size=(15, 1)),
sg.InputText(default_text="2", size=(3, 1),),
],
[
sg.Text("Second parameter", size=(15, 1)),
sg.InputText(default_text="8", size=(3, 1),),
sg.Column(
[[sg.Submit("A nice fat button", size=(23, 1))]],
element_justification="right",
expand_x=True,
key="c1",
pad=(0, 0),
),
],
[sg.ProgressBar(1, orientation="h", size=(50, 20))],
],
title="Cool subpanel",
relief=sg.RELIEF_GROOVE,
)
],
]
window = sg.Window("Test window", layout)
# window['c1'].expand(True, False, False) # use this when 'expand_x' flag is not available
while True:
event, values = window.read()
if event == "Cancel" or event is None:
sys.exit()
你的问题刚刚错过了 PySimpleGUI 的一个版本,它使这个操作变得微不足道。
Whosebug 的一个问题是——“没有死”……包括旧的解决方案。这是一个真正的问题,我还没有找到可靠的解决方案。
此技术于 2021 年 9 月在版本 4.48.0 中发布,并使用了当时新的 Push
元素。顾名思义,Push
将推动元素。通过在元素之间放置一个,它会将元素推开。
这是您的代码,在您想要右对齐的按钮之前添加了 Push
。
import sys
import PySimpleGUI as sg
sg.theme("Light Blue 2")
layout = [
[
sg.Text("Target folder", size=(9, 1)),
sg.InputText(default_text="Choose a folder...", size=(59, 1)),
sg.FolderBrowse(),
],
[
sg.Frame(
layout=[
[
sg.Text("First parameter", size=(15, 1)),
sg.InputText(default_text="2", size=(3, 1),),
],
[
sg.Text("Second parameter", size=(15, 1)),
sg.InputText(default_text="8", size=(3, 1),),
sg.Push(),
sg.Button("A nice button", size=(23, 1)),
],
[sg.ProgressBar(1, orientation="h", size=(50, 20))],
],
title="Cool subpanel",
relief=sg.RELIEF_GROOVE,
)
],
]
window = sg.Window("Test window", layout)
while True:
event, values = window.read()
if event == "Cancel" or event is None:
sys.exit()
这是结果:
注意(这不是特别重要)- 我用 Button
替换了 Submit
,因为使用 Submit
可能会造成混淆。 Submit
只不过是 returns 一个带有文本 "Submit"
的 Button
元素的函数。它没有做任何特别的事情,实际上提供的参数可能比 Button
.