Создайте PySimpleGUI, содержащий список

#pysimplegui

Вопрос:

Я создаю графический интерфейс с некоторыми списками значений. Каждая строка может иметь другой цвет, и строки могут быть добавлены или удалены.

Концептуально я хочу сделать что-то вроде этого:

layout = [ [sg.T('Above the data stuff')], sg.ListThing(key='-data-', [[]]) ]

чтобы я мог:

window['-data-'].update(values=[ [sg.T(v, color=c)] for (v,c) in my_data ])

Есть ли простой способ или это должна быть рамка?

Ответ №1:

В PySimpleGUI не предусмотрено никакого метода. Некоторые методы могут быть реализованы с помощью кода tkinter.

Здесь попробуйте реализовать некоторые методы list to sg.Listbox , а также настроить цвета элемента.

 from random import randint import PySimpleGUI as sg  class Listbox(sg.Listbox):   def append(self, item):  self.Widget.insert(sg.tk.END, item)  self.Values = list(self.Widget.get(0, sg.tk.END))   def extend(self, items):  self.Widget.insert(sg.tk.END, *items)  self.Values = list(self.Widget.get(0, sg.tk.END))   def insert(self, index, *item):  self.Widget.insert(index, *item)  self.Values = list(self.Widget.get(0, sg.tk.END))   def remove(self, value):  index = self.index(value)  if index is not None:  self.Widget.delete(index)  self.Values = list(self.Widget.get(0, sg.tk.END))   def pop(self, i=sg.tk.END):  widget = self.Widget  last = widget.index(sg.tk.END)  if isinstance(i, int) and (igt;=last or ilt;0):  i = sg.tk.END  item = widget.get(i)  widget.delete(i)  self.Values = list(self.Widget.get(0, sg.tk.END))  return item   def clear(self):  self.Widget.delete(0, sg.tk.END)  self.Values = list(self.Widget.get(0, sg.tk.END))   def index(self, value, start=0, end=sg.tk.END):  widget = self.Widget  last = widget.index(sg.tk.END)  while start lt; last:  if widget.get(start) == value:  return start  start  = 1  return None   def sort(self, key=None, reverse=False):  lst = list(self.Widget.get(0, sg.tk.END))  lst.sort(key=key, reverse=reverse)  self.clear()  self.insert(0, *lst)  self.Values = list(self.Widget.get(0, sg.tk.END))   def reverse(self):  lst = list(self.Widget.get(0, sg.tk.END))  lst.sort(reverse=True)  self.clear()  self.insert(0, *lst)  self.Values = list(self.Widget.get(0, sg.tk.END))   def item(self, i, value=None, bg=None, fg=None, bg_selected=None, fg_selected=None):  widget = self.Widget  last = widget.index(sg.tk.END)  if i gt;= last:  return  if value is not None:  widget.delete(i)  widget.insert(i, value)  widget.itemconfig(i, background=bg, foreground=fg, selectbackground=bg_selected, selectforeground=fg_selected)  self.Values = list(self.Widget.get(0, sg.tk.END))  lst = [randint(0, 99) for i in range(10)]  layout = [[Listbox(lst, size=(10, 10), no_scrollbar=True, key='LISTBOX')]]  window = sg.Window('Listbox', layout, finalize=True) listbox = window['LISTBOX']  settings = [  (3, 'Red', 'red', 'white'),  (4, 'Green', 'green', 'white'),  (5, 'Blue', 'blue', 'white'), ]  for i, v, bg, fg in settings:  listbox.item(i, value=v, bg=bg, fg=fg)  while True:  event, values = window.read()  if event in (sg.WINDOW_CLOSED, 'Exit'):  break  print(event, values) window.close()  

введите описание изображения здесь

Комментарии:

1. Спасибо вам за отзыв. Он отвечает на конкретный вопрос, хотя я не могу сделать то, на что надеялся. Я ищу какой-то элемент, который принимает макет или даже просто список, позволяющий добавлять атрибуты, такие как ключ. Я думаю, что это фундаментальное ограничение PySimpleGUI, но документация немного слабая.