在列表框/python中保存颜色更改

Posted

技术标签:

【中文标题】在列表框/python中保存颜色更改【英文标题】:Save color changes in listbox / python 【发布时间】:2017-03-24 11:23:18 【问题描述】:

我制作了一个收集数据的 gui,数据保存在 sqlite3 中并显示在列表框中。

创建了一个函数,该函数向用户发送一封包含所选行数据的邮件,并将该行设为黄色。

问题是程序没有保存这些颜色变化。当我退出并再次运行程序时,颜色又变回白色。

做了一个简单的例子来说明问题:

from tkinter import *

top = Tk()
top.geometry("800x400+0+0")

Lb1 = Listbox(top)
Lb1.insert(1, "Python")
Lb1.insert(2, "Perl")
Lb1.insert(3, "C")
Lb1.insert(4, "php")
Lb1.insert(5, "JSP")
Lb1.insert(6, "Ruby")
Lb1.pack()

def color_yellow():
    Lb1.itemconfig(Lb1.curselection()[0], 'bg':'Yellow')

b1=Button(top,text="color row Yellow",width=16,command=color_yellow)
b1.place(relx=0.5, rely=0.6, anchor=CENTER)


top.mainloop()

尝试了泡菜,但无法正常工作:

from tkinter import *
import pickle

top = Tk()
top.geometry("800x400+0+0")

Lb1 = Listbox(top)
Lb1.insert(1, "Python")
Lb1.insert(2, "Perl")
Lb1.insert(3, "C")
Lb1.insert(4, "PHP")
Lb1.insert(5, "JSP")
Lb1.insert(6, "Ruby")
Lb1.pack()

def color_yellow():
        Lb1.itemconfig(Lb1.curselection()[0], 'bg':'Yellow')
        return

pickle_out = open("dict.pickle","wb")
pickle.dump(color_yellow, pickle_out)
pickle_out.close()

pickle_in = open("dict.pickle","rb")
color_yellow = pickle.load(pickle_in)

b1=Button(top,text="color row Yellow",width=16,command=color_yellow)
b1.place(relx=0.5, rely=0.6, anchor=CENTER)


top.mainloop()

【问题讨论】:

好吧,我。目前还不清楚您要实现什么。但是,一般来说,如果您想从循环中保存一些数据,我建议您让函数返回所需数据或将其附加到外部列表中但可从函数内部访问(作为函数参数或(如果绝对必要)作为全局列表)。 感谢您的回复。我添加了一些信息。希望现在清楚一点。 根据您提供的新输入编辑我的答案 【参考方案1】:

编辑

好的,鉴于您的最新改编,问题变得更加完整。但是,它仍然不是minimum, complete, and verifiable example。这使得很难确定导致您的问题的原因。

通过我重新创建您的问题的另一次尝试变得清晰。但是,在我的示例中,一旦按下按钮,列表项就会保持颜色。意思是,我可以将所有列表项涂成黄色。为什么这不会发生,你可能有多种原因......现在很难说。 (例如,我想知道:您是否可能在列表框上设置了显式选择模式?例如 SINGLE、BROWSE、MULTIPLE 或 EXTENDED)

from tkinter import * # Asterix import for test purposes, try to avoid copying this.

master = Tk()

listbox = Listbox(master)
listbox.pack()

listbox.insert(END, "a list entry")

for item in ["one", "two", "three", "four"]:
    listbox.insert(END, item)

def select(listbox):
    listbox.itemconfig(listbox.curselection()[0], bg='yellow')

button = Button(master, text='Select', command=lambda: select(listbox))
button.pack()

mainloop()

【讨论】:

感谢您指出最小、完整且可验证的示例。让我自己更清楚。只是做了一个清楚的例子来说明这个问题。希望现在很清楚:) 好的,所以我今天可能会帮助你,但时间不多。快速猜测:尝试将您的 Lb1.pack() 语句移动到插入的末尾。所以在定义和调用你的函数之前。看看是否有帮助。否则,留下评论,我明天再看。 不,当我重新启动程序时,行又是白色的。也许我可以以某种方式将函数的输出复制到另一个脚本,然后输入该脚本? 啊等等..现在我明白了,您想在应用程序停止后保存颜色..嗯,让我考虑一下..您当然可以将列表属性存储在外部文件并从那里读取它们,但这会很难看..我从未开发过需要在不同运行中保存数据的程序,但我相信存在复杂的方法..我相信有一个特定的python库..让我们看看能不能找到.. 啊,是的,你看,pickle 模块可能就是你要找的。 As described here

以上是关于在列表框/python中保存颜色更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在.net中更改平面列表框的黑色边框颜色? [复制]

asp.net:更改列表框项目的颜色

更改选定颜色列表框

有没有办法更改 Microsoft Access 中下拉列表的组合框按钮的颜色

更改选定列表框项目的背景颜色

如何通过Powershell代码更改特定WPF列表框项的背景颜色?