如何在字典中存储Tkinter按钮小部件?

时间:2018-11-11 18:21:37

标签: python python-3.x dictionary tkinter widget

程序的两个目标:#1单击按钮后将笔记复制到剪贴板;和#2使按钮小部件在程序重新启动后仍然存在。 (本文仅关注目标1)。按钮已按预期填充,但命令无法正常运行(尽管没有错误)。我尝试了其他剪贴板模块,例如pyperclip,但没有运气。抱歉,如果很难做到这一点,我上周刚开始学习python作为我的第一门编程语言。

我想知道如何使按钮将相应的注释复制到剪贴板。

from tkinter import *
import json

root = Tk()
root.title("CopyNotes")
root.geometry()

json_file = open("dictionary.json", encoding="utf-8")
mynotes = json.load(json_file)

for keys in mynotes:
    btnz = Button(root, text=mynotes[keys][0], font="Helvetica 10 bold", bg="silver", command=root.clipboard_append(mynotes[keys][1]), height=2, width=13).pack(side=TOP, fill=BOTH, expand=YES)

root.mainloop()

因此,为了清楚起见,我要解决的问题是button命令无法正常工作。第一次按下任何按钮时,它都会复制“ button1notebutton2notebutton3note”,然后完全停止工作。 我想要第一个按钮实现的效果:root.clipboard_append(button1note) 其余的等等。

弄清楚如何做到这一点之后,我打算接受用户输入以通过添加到字典中来添加自己的按钮。 编辑:修复了剪贴板问题-

    mynotes = pickle.load(open("note.p", "rb"))
    print(mynotes)
    for keys in mynotes:
        thenotes = mynotes[keys][1]
        mybtnz = Button(ctowin, text=mynotes[keys][0], font="Helvetica 10 bold", bg="silver",
                                command=lambda thenotes=thenotes: pyperclip.copy(thenotes), height=2, width=13)\
            .pack(side=TOP, fill=BOTH, expand=YES)

Button example

1 个答案:

答案 0 :(得分:1)

您不需要使用json,因为您不是在使用JSON对象而是python字典。

在这里,您的代码经过了重构,以使用3个按钮填充应用程序;

[更新]尽管您将需要完全重构代码,因为您的for循环会立即用字典中的所有内容填充剪贴板。

from tkinter import *
from tinydb import TinyDB, Query

db = TinyDB('clipboard.json')

root = Tk()
root.title("CopyNotes")
root.geometry()

mynotes = {
    "B1": ["button1label","button1note"], 
    "B2":["button2label","button2note"], 
    "B3":["button3label","button3note"]
}

def cp_to_cb_and_db(note, key):
    root.clipboard_append(note[key][1])
    print('[+] Adding note: {} to clipboard.'.format(note))
    db.insert({key: note})


for key in mynotes:
    btnz = Button(
        root, 
        text=mynotes[key][0], 
        font="Helvetica 10 bold", 
        bg="silver", 
        command=cp_to_cb_and_db(mynotes, key), 
        height=2, 
        width=13).pack(side=TOP, fill=BOTH, expand=YES)

root.mainloop()