我的应用程序具有不同的布局,可以明显地更新以隐藏和取消隐藏布局。隐藏这些布局并显示不同的布局是通过事件调用(按钮单击)完成的。问题是,当这些布局发生更改时,窗口不会自行调整以匹配新布局的元素。例如,布局一有 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()
我尝试在每个事件中更新窗口大小,但到目前为止没有任何效果。任何帮助将不胜感激!
当行或容器内没有任何东西时,将保留行或容器的空间。
有两种方法
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()