【问题标题】:Tkinter sorting grid elements alpabeticallyTkinter 按字母顺序排序网格元素
【发布时间】:2020-08-28 15:10:03
【问题描述】:

我正在开发一个用于跟踪我的投资组合的桌面小部件。 How Tkinter portfolio widget looks

目前我的投资按两个超大列(2 个超大列,每个 4 列宽)排序,每天表现最好的列在网格的左上角,而表现最差的列在右下角。

我希望能够单击标签并生成“类似 Excel”的排序。假设我点击“TICKER”标签,我的提要按字母顺序排序,或者我点击“P/L”,我的提要按照总投资按升序/降序排序。

我正在使用网格表示,这就是我的代码块的样子

                    ticker_label = Label(root,text=ticker)
                    quote_label = Label(root,text="+"+'{:.2f}'.format(quote))
                    portfolio_allocation_label = Label(root, text=invest)
                    pl_label = Label(root, text=pl)
                    ticker_label.grid(row=separator_1,column=0)
                    quote_label.grid(row=separator_1,column=1)
                    portfolio_allocation_label.grid(row=separator_1, column=2)
                    pl_label.grid(row=separator_1, column=3)

如何在 Tkinter 中从 GUI 内部按字母顺序/数字顺序对网格元素进行排序?

我不一定需要代码 sn-p,但需要大致的方向感,尽管 sn-ps 也很受欢迎!

提前非常感谢!

【问题讨论】:

  • 将第一行的标签变成按钮,编写一个函数,按照您喜欢的顺序将标签的行向下切换。或者在标签上的 button-1 上使用绑定,无论你喜欢什么。

标签: python tkinter grid


【解决方案1】:
  • 在这里,我得到了一个指定网格的从属节点,即 labelframe。
  • 我存储从站迭代它并将它们保存在一个字典和一个列表中的值。
  • 我对列表进行排序并按索引放置

import tkinter as tk
from collections import defaultdict

def alpha():
    #get data
    list_of_labels = labelframe.grid_slaves(column=0)
    label_values=[]
    data=defaultdict(list)
    for idx,_ in enumerate(list_of_labels):
        label=labelframe.grid_slaves(row=idx,column=0)[0]
        data[label].append(label['text'])
        label_values.append(label['text'])
    #use data
    sort=sorted(label_values,key=str.lower)
    for idx,value in enumerate(sort):
        for label, v in data.items():
            if v[0] == value:
                label.grid(row=idx, column=0)

root = tk.Tk()

buttonframe = tk.Frame(root)
buttonframe.pack()

button=tk.Button(buttonframe, text='alpha',command=alpha)
button.grid(column=0, row=0)

labelframe= tk.Frame(root)
labelframe.pack()

a = tk.Label(labelframe, text='a')
b = tk.Label(labelframe, text='b')
a.grid(column=0, row=1)
b.grid(column=0, row=0)

root.mainloop()

如果还有问题,请告诉我。

【讨论】:

  • 感谢您的想法!我喜欢你的做法,所以我要做一些排序功能并将其映射到按钮
  • 这只是一个例子。当我不知道您的数据结构时,我使用了不知道您是否需要的 defaultdict。你肯定可以优化它,但原理很清楚,需要的方法在这段代码里。如果字典按值,我可以宣布我得到密钥。玩得开心!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2015-04-04
  • 2020-11-26
  • 1970-01-01
相关资源
最近更新 更多