【问题标题】:Create a PySimpleGUI holding a list创建一个包含列表的 PySimpleGUI
【发布时间】:2021-11-18 00:56:47
【问题描述】:

我正在创建一个带有一些值列表的 GUI。每行可能有不同的颜色,并且可以添加或删除行。

从概念上讲,我想做这样的事情:

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 ])

有简单的方法还是必须是框架?

【问题讨论】:

    标签: pysimplegui


    【解决方案1】:

    PySimpleGUI 中没有提供方法。有些方法可以通过tkinter代码实现。

    这里尝试实现listsg.Listbox的一些方法,同时配置item的颜色。

    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 (i>=last or i<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 < 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 >= 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()
    

    【讨论】:

    • 感谢您的报道。它处理一个特定的问题,虽然我不能做我希望的事情。我正在寻找某种元素,它需要一个布局,甚至只是一个列表,它允许添加像键这样的属性。我认为这是 PySimpleGUI 的一个基本限制,但文档有点松懈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多