在同一窗口上更改布局时,PySimpleGUI 应用程序布局无法正确调整大小”?

问题描述 投票:0回答:1

我的应用程序具有不同的布局,可以明显地更新以隐藏和取消隐藏布局。隐藏这些布局并显示不同的布局是通过事件调用(按钮单击)完成的。问题是,当这些布局发生更改时,窗口不会自行调整以匹配新布局的元素。例如,布局一有 3 个输入元素和 2 个按钮,但布局二有一个表格元素,当切换到显示布局二时,表格小于窗口。

代码:

import PySimpleGUI as sg
from database import *

sg.set_options(font=("Courier", 12))

#get all added records from database
records = getRecords()
print(records)

#check if inputs are empty
def checkMissingInput(lst):
    for i in lst:
        if i == '':
            return True
    return False

#create window to add records
def main():
    #root/main layout
    addRecordsLayout = [
        [sg.Push(), sg.Text("Password Manager"), sg.Push()],
        [sg.Text("URL "), sg.Push(), sg.Input("www.apple.com",enable_events=True, key="input-url")],
        [sg.Text("Username/Email "), sg.Push(), sg.Input("[email protected]",enable_events=True, key="input-username")],
        [sg.Text("Password "), sg.Push(), sg.Input("john123",enable_events=True, key="input-password")],

        [sg.Button("Add Record", enable_events=True, key="add-records", expand_x=True), 
         sg.Button("Show Records", enable_events=True, key="show-records", expand_x=True), 
         sg.Button("Clear", enable_events=True, key="clear", expand_x=True)]
    ]

    #second layout, for viewing table of records
    toprows = ["Id","Url","Username","Password"]
    showRecordsLayout = [
        [sg.Push(),sg.Text("Records"),sg.Push()],
        [sg.Push(),sg.Table(key='records-table',values=records, headings=toprows, 
                  expand_x=True,
                  expand_y=True,
                  justification="center",
                  auto_size_columns=True,
                  enable_click_events=True 
                  ),sg.Push()],
        [sg.Button("Select",key="select-records",expand_x=True,enable_events=True),
         sg.Button("Exit",key="exit-show-records",expand_x=True,enable_events=True)]
    ]

    #third layout, for viewing selected layout from table
    showSelectedRecordLayout = [
        #[sg.Text(f"Record {selectRecordId}")]
        [sg.Text("Url: ")],
        [sg.Text("Username: ")],
        [sg.Text("Password: ")],

        [sg.Button("Delete", expand_x=True, key="delete-record-button"),
         sg.Button("Return", expand_x=True, key="exit-selected-record")]
    ]

    rootLayout = [[sg.Column(addRecordsLayout, key="column-1", visible=True)],
                  [sg.Column(showRecordsLayout, key="column-2", visible=False)],
                  [sg.Column(showSelectedRecordLayout, key="column-3", visible=False)]]

    window = sg.Window("Password Manager", rootLayout)
    while True:
        event, values = window.read()
    
        #events
        if event == sg.WIN_CLOSED:
            print(event)
        
            break
        elif event == 'clear':
            window['input-url'].update('')
            window['input-username'].update('')
            window['input-password'].update('')

        elif event == 'add-records':
            inputElementValues = list(values.values()) #get list all values in input elements
            try:
                if checkMissingInput(inputElementValues) == True:
                    sg.popup("Missing input values...")
                else:
                    addDbRecord(inputElementValues[0], inputElementValues[1], inputElementValues[2]) #add list of input values to database table
                    sg.popup("Record succesfully added...")

            except ValueError:
                print("ValueError")
        
        elif event == 'show-records':
            window["column-1"].update(visible=False)
            window["column-2"].update(visible=True)
            window['records-table'].update(values=getRecords()) #update records table to display new added records based on whats in database table

        if event == 'exit-show-records':
            window["column-1"].update(visible=True)
            window["column-2"].update(visible=False)

        elif event == 'select-records':
            window["column-2"].update(visible=False)
            window["column-3"].update(visible=True)
            print(values['records-table'])
        
        elif event == 'exit-selected-record':
            window["column-2"].update(visible=True)
            window["column-3"].update(visible=False)
    window.close()

if __name__ == "__main__":
    main()

我尝试在每个事件中更新窗口大小,但到目前为止没有任何效果。任何帮助将不胜感激!

python user-interface pysimplegui simplegui
1个回答
0
投票

当行或容器内没有任何东西时,将保留行或容器的空间。

有两种方法

  • 使用帮助功能
    sg.pin
    ,喜欢
    rootLayout = [
        [sg.pin(sg.Column(addRecordsLayout, key="column-1", visible=True))],
        [sg.pin(sg.Column(showRecordsLayout, key="column-2", visible=False))],
        [sg.pin(sg.Column(showSelectedRecordLayout, key="column-3", visible=False))],
    ]

  • 将所有可见/不可见元素放在同一行,例如
    rootLayout = [
        [sg.Column(addRecordsLayout, key="column-1", visible=True),
         sg.Column(showRecordsLayout, key="column-2", visible=False),
         sg.Column(showSelectedRecordLayout, key="column-3", visible=False)],
    ]

更改布局后,请记住调用以下语句将窗口中心移动到屏幕上。

window.refresh()
window.move_to_center()
© www.soinside.com 2019 - 2024. All rights reserved.