你好,我需要很多帮助,我有这个代码,显示一些列表框,信息,如: 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)
下面是滚动条的图像,它的行数比产品多:
发布于 2021-01-21 01:03:12
列表框内容更改后,选项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()
https://stackoverflow.com/questions/65811804
复制相似问题