Python 如何自动更新pysimplegui列滚动条

Python 如何自动更新pysimplegui列滚动条,python,python-3.x,pysimplegui,Python,Python 3.x,Pysimplegui,你好,我需要很多帮助,我有这个代码,显示一些列表框,信息,如:Id,产品,数量和价格。但是,我希望根据库存产品的数量,一列显示一个滚动条,滚动条的行数与产品数量相同 Nome = '' Quantidade = '' Preco = '' Id = '' cols = 4 rows = 20 col_width = 22 all_listbox = [[sg.Listbox(Nom

你好,我需要很多帮助,我有这个代码,显示一些列表框,信息,如:Id,产品,数量和价格。但是,我希望根据库存产品的数量,一列显示一个滚动条,滚动条的行数与产品数量相同

    Nome = ''
    Quantidade = ''
    Preco = ''
    Id = ''
    
          
    cols = 4
    rows = 20
    col_width = 22
    
    
    all_listbox = [[sg.Listbox(Nome,size=(15, rows), pad=(0, 0),
    no_scrollbar=True, enable_events=False, key=f'listbox {i}',
    select_mode=sg.LISTBOX_SELECT_MODE_SINGLE) for i in range(cols)]]



    #layout
    layout = [
        [sg.Text('Selecione a classe que deseja ver:',size= 
         (15,0)),sg.InputCombo(('Circuito','Transistor','Membrana'),size=(20,0),key='combo')],
        [sg.Button('Consultar')], 
         [sg.Text('Id'.center(col_width), pad=(0, 0)),
          sg.Text('Nome'.center(col_width), pad=(0, 0)),
          sg.Text('Quantidade'.center(col_width), pad=(0, 0)),
          sg.Text('Preço'.center(col_width), pad=(0, 0))],
        [sg.Column(all_listbox, size=(440, 200), pad=(0, 0),scrollable=True,
         vertical_scroll_only=True,key='test')],

        [sg.Button('Deletar')],
        [sg.Button('Sair'),sg.Button('Voltar')]
        ]
        
    #janela
    window = sg.Window("adicionar ao Estoque",layout)



    while True:
        event,values = window.read()

        try:
            if event.startswith('listbox'):
                row = window[event].get_indexes()[0]
                user_event = False
                for i in range(cols):
                    window[f'listbox {i}'].set_value([])
                    window[f'listbox {i}'].Widget.selection_set(row)

            
            if event == 'Consultar':
                f = values['combo']
                Id = filtrar2(f)
                Nome = filtrar(f)
                Quantidade = filtrar3(f)
                Preco = filtrar4(f)
                
                
                window.find_element(f'listbox {1}').Update(Nome)
                window.find_element(f'listbox {0}').Update(Id)
                window.find_element(f'listbox {2}').Update(Quantidade)
                window.find_element(f'listbox {3}').Update(Preco)
下面是滚动条的图像,其中的行数大于产品数:


更改列表框内容后,
size
选项未更改。更改
size
后,调用元素
sg.Column
的方法
contents\u changed
,然后计算新的滚动区域以匹配新的内容

另一个错误滚动区域的问题可以通过新的
scroll
功能解决,PySimpleGUI将来可能会更新

源代码不完整,不可执行,所以旧的例子为您

导入ctypes
从随机导入randint
将PySimpleGUI导入为sg
def yscroll(自我,事件):#tkinter代码
如果self.canvas.yview()=(0.0,1.0):
返回
如果event.num==5或event.delta<0:
self.canvas.yview_卷轴(1,“单位”)
elif event.num==4或event.delta>0:
self.canvas.yview\u卷轴(-1,“单位”)
ctypes.windell.user32.SetProcessDPIAware()#将GUI的单位设置为像素
sg.theme(“暗蓝色”)
设置选项(字体=('Courier New',12))
sg.TkScrollableFrame.yscroll=yscroll#用于问题滚动区域
cols=3
行=randint(5,20)
行显示=10
柱宽=15
数据=[[f'Cell({j:0>2d},{i:0>2d})表示范围内的i(行)]表示范围内的j(cols)]
all_listbox=[[sg.listbox(数据[i],大小=(15行),pad=(0,0),
no_scrollbar=True,enable_events=True,key=f'listbox{i},
为范围内的i(cols)选择模式=sg.LISTBOX\u选择模式(单个)]
布局=[
[sg.Text('Product'.center(col_-width),pad=(0,0)),
sg.Text('单价')。中心(柱宽),垫=(0,0)),
sg.Text('Price'.center(col_-width),pad=(0,0))],
[sg.Column(all_listbox,size=(555300),pad=(0,0),scrollable=True,
垂直滚动(仅为True,key='Column')],
[sg.Button('Update'),sg.Text(f“Total rows={rows}”,key='rows'),
]
window=sg.window(“Title”,布局,finalize=True)
对于范围内的i(cols):
listbox=window[f'listbox{i}'].Widget
listbox.configure(justify='center')#tkinter代码
尽管如此:
事件,值=window.read()
如果事件==sg.WINDOW\u关闭:
打破
elif event.startswith('listbox'):
行=窗口[事件]。获取索引()[0]
用户事件=False
对于范围内的i(cols):
listbox=window[f'listbox{i}']
listbox.set_值([])
listbox.Widget.selection_set(行)#tkinter代码
elif事件=='更新':
行=randint(5,20)
打印(行)
数据=[[f'Cell({j:0>2d},{i:0>2d})表示范围内的i(行)]表示范围内的j(cols)]
对于范围内的i(cols):
listbox=window[f'listbox{i}']
更新(值=数据[i])
listbox.Widget.configure(高度=行)#更新listbox高度的tkinter代码
window.refresh()#此处需要刷新
窗口['Column']。内容已更改()#更新滚动条
窗口['Rows'].update(f“总行数={Rows}”)
window.close()

非常感谢,帮了我很多忙