Выровнять кнопку по центру окна с помощью pysimplegui

В моем приложении я пытаюсь разместить мою кнопку, текст и ввод в центре окна. Я использую PySimpleGUI для разработки кнопок. Для выравнивания по центру я использовал атрибут justification='center' в моем коде, но все же он не подходит к центру окна.

Код, с которым я работаю,

import PySimpleGUI as sg
from tkinter import * 
sg.theme('DarkAmber')  
layout = [ 
        [sg.Text('Enter the value',justification='center')],
        [sg.Input(justification='center')],
        [sg.Button('Enter','center')]
     ]


  window = sg.Window('My new window', layout, size=(500,300), grab_anywhere=True)

 while True:
event, values = window.read()   # Read the event that happened and the values dictionary
print(event, values)
if event == sg.WIN_CLOSED or event == 'Exit':     # If user closed window with X or if user clicked "Exit" button then exit
    break
if event == 'Button':
  print('You pressed the button')
window.close()

Приведенный выше код выводит  введите здесь описание изображения Как разместить текст, кнопку и ввод в центре окна?


person Avinash Babu    schedule 17.05.2020    source источник
comment
Возможно, посмотрите демонстрационную программу Demo_Layout_Vertical_Centered.py на GitHub проекта.   -  person Mike from PSG    schedule 15.01.2021


Ответы (4)


этот код помещает текст, кнопку и ввод в центр окна.

import PySimpleGUI as sg
sg.theme('DarkAmber')  
layout = [ 
        [sg.Text('Enter the value',justification='center',size=(100,1))],
        [sg.Input(justification='center',size=(100,1))],
        [sg.Button('Enter','center',size=(100,1))]
     ]


window = sg.Window('My new window', layout, size=(500,300), grab_anywhere=True)

while True:
    event, values = window.read()   # Read the event that happened and the values dictionary
    print(event, values)
    if event == None or event == 'Exit':     # If user closed window with X or if user clicked "Exit" button then exit
        break
    if event == 'Button':
      print('You pressed the button')
    window.close()
person Bhargav Desai    schedule 01.06.2020
comment
@BharGav Desai - этот код не центрирует кнопку, он центрирует текст внутри кнопки во всю ширину. Если вы сделаете кнопку, например, размером (10,1), она все равно останется в левой части экрана. Element_justification = 'c' требуется для центрирования кнопки на экране, но это центрирует все. В идеале я хотел бы иметь возможность центрировать кнопки внутри фрейма, но иметь текстовые поля ввода по левому и / или правому краю в разных фреймах в одном окне. - person KantarChris; 06.01.2021
comment
Должен быть неправильный код, второй аргумент sg.Button для button_type. Все элементы не выровнены по центру окна. - person Jason Yang; 06.01.2021

Я думаю это то что ты ищешь

window = sg.Window('My new window', layout, element_justification='c')

Изменить - центрирование по вертикали

Центрирование макета по вертикали в окне - это немного сложнее. Требуются 2 элемента, которые будут расширяться при расширении окна. Это демонстрационная программа, которая является частью демонстрации на PySimpleGUI GitHub.

import PySimpleGUI as sg

"""
    Center a column in a window
    Solves a very specific kind of layout.
    If you want to have something centered in a Window, this is a good way to do it
    The "trick" here is:
        * the first row of the layout has a Text element that expands vertically
        * the row with the Column has a text element that expands horizontally
    
    This expanding Text element is what will cause the Column element to be centered

    Used with permission
"""

def main():
    column_to_be_centered = [  [sg.Text('My Window')],
                [sg.Input(key='-IN-')],
                [sg.Text(size=(12,1), key='-OUT-')],
                [sg.Button('Go'), sg.Button('Exit')]  ]

    layout = [[sg.Text(key='-EXPAND-', font='ANY 1', pad=(0, 0))],  # the thing that expands from top
              [sg.Text('', pad=(0,0),key='-EXPAND2-'),              # the thing that expands from left
               sg.Column(column_to_be_centered, vertical_alignment='center', justification='center',  k='-C-')]]

    window = sg.Window('Window Title', layout, resizable=True,finalize=True)
    window['-C-'].expand(True, True, True)
    window['-EXPAND-'].expand(True, True, True)
    window['-EXPAND2-'].expand(True, False, True)

    while True:             # Event Loop
        event, values = window.read()
        print(event, values)
        if event == sg.WIN_CLOSED or event == 'Exit':
            break
        if event == 'Go':
            window['-OUT-'].update(values['-IN-'])
    window.close()

if __name__ == '__main__':
    main()
person Mike from PSG    schedule 02.06.2020

Лучше всего должен быть вариант element_justification='center' для контейнера sg.Column, возможно, не все элементы должны быть выровнены по центру окна.

введите описание изображения здесь

import PySimpleGUI as sg

sg.theme('DarkAmber')

layout_column = [
        [sg.Text('Enter the value',justification='center')],
        [sg.Input(justification='center', key='-INPUT-')],
        [sg.Button('Enter')]
]

layout = [[sg.Column(layout_column, element_justification='center')]]

window = sg.Window('My new window', layout, grab_anywhere=True)

while True:
    event, values = window.read()
    print(event, values)
    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    if event == 'Button':
        print('You pressed the button')
window.close()
person Jason Yang    schedule 06.01.2021

Если вам нужен более прямой контроль над тем, где появляются ваши элементы, вы можете использовать ключевое слово pad почти во всех элементах (кнопка, текст, in и т. Д.).

Есть два допустимых формата:

  • pad=(<int>, <int>), где pad[0] - это отступ слева и справа, а pad[1] - это отступ над и под элементом.
  • pad=((<int>, <int>), (<int>, <int>)) где первый кортеж заполняет слева (первый элемент) и справа (второй элемент), а второй кортеж заполняет сверху (первый) и ниже (второй).

Итак, чтобы центрировать элементы в вашем примере кода с помощью ключевого слова pad, вы должны сделать что-то вроде этого:

import PySimpleGUI as sg
sg.theme('DarkAmber')
layout = [
        [sg.Text('Enter the value', pad=(190, 0))],
        [sg.Input(justification='center', pad=(75, 0))],
        [sg.Button('Enter', pad=(215, 0))]
     ]


window = sg.Window('My new window', layout,
                   size=(500, 300), grab_anywhere=True)

while True:
    # Read the event that happened and the values dictionary
    event, values = window.read()
    print(event, values)
    # If user closed window with X or if user clicked "Exit" button then exit
    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    if event == 'Button':
        print('You pressed the button')
    window.close()

ПРИМЕЧАНИЕ. Приведенный выше код был немного изменен по сравнению со стандартами PEP8.

Результат:

Изображение нового окна

person Chris Collett    schedule 14.01.2021
comment
Кроме того, вы также можете обосновать отдельные элементы, используя sg.Column(layout, justification='c') внутри вашего общего списка макетов. Не все должно быть обосновано по центру. - person Chris Collett; 05.02.2021