如何自动更新pysimplegui列滚动条

2024-06-09 22:25:58 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我需要很多帮助,我有这个代码,显示一些列表框,信息,如: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)

下面是滚动条的图像,其中的行数大于产品数:

enter image description here


Tags: texteventidtruesizebuttoncolsg
1条回答
网友
1楼 · 发布于 2024-06-09 22:25:58

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

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

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

import ctypes
from random import randint
import PySimpleGUI as sg

def yscroll(self, event):   # tkinter code
    if self.canvas.yview() == (0.0, 1.0):
        return
    if event.num == 5 or event.delta < 0:
        self.canvas.yview_scroll(1, "unit")
    elif event.num == 4 or event.delta > 0:
        self.canvas.yview_scroll(-1, "unit")

ctypes.windll.user32.SetProcessDPIAware()   # Set unit of GUI to pixels
sg.theme('DarkBlue')
sg.set_options(font=('Courier New', 12))

sg.TkScrollableFrame.yscroll = yscroll      # For issue scroll region

cols = 3
rows = randint(5, 20)
rows_show = 10
col_width = 15

data = [[f'Cell ({j:0>2d} ,{i:0>2d})' for i in range(rows)] for j in range(cols)]

all_listbox = [[sg.Listbox(data[i], size=(15, rows), pad=(0, 0),
    no_scrollbar=True, enable_events=True, key=f'listbox {i}',
    select_mode=sg.LISTBOX_SELECT_MODE_SINGLE) for i in range(cols)]]

layout = [
    [sg.Text('Product'.center(col_width), pad=(0, 0)),
     sg.Text('Unit Price'.center(col_width), pad=(0, 0)),
     sg.Text('Price'.center(col_width), pad=(0, 0))],
    [sg.Column(all_listbox, size=(555, 300), pad=(0, 0), scrollable=True,
        vertical_scroll_only=True, key='Column')],
    [sg.Button('Update'), sg.Text(f"Total rows = {rows}", key='Rows')],
]
window = sg.Window("Title", layout, finalize=True)
for i in range(cols):
    listbox = window[f'listbox {i}'].Widget
    listbox.configure(justify='center')     # tkinter code

while True:
    event, values = window.read()
    if event == sg.WINDOW_CLOSED:
        break
    elif event.startswith('listbox'):
        row = window[event].get_indexes()[0]
        user_event = False
        for i in range(cols):
            listbox = window[f'listbox {i}']
            listbox.set_value([])
            listbox.Widget.selection_set(row)   # tkinter code
    elif event == 'Update':
        rows = randint(5, 20)
        print(rows)
        data = [[f'Cell ({j:0>2d} ,{i:0>2d})' for i in range(rows)] for j in range(cols)]
        for i in range(cols):
            listbox = window[f'listbox {i}']
            listbox.update(values=data[i])
            listbox.Widget.configure(height=rows)       # tkinter code to update height of listbox
        window.refresh()                                # refresh required here
        window['Column'].contents_changed()             # update scrollbar
        window['Rows'].update(f"Total rows = {rows}")

window.close()

相关问题 更多 >