#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, но документация немного слабая.