Как хранить виджеты кнопки tkinter в словаре? - PullRequest
0 голосов
/ 11 ноября 2018

Две цели моей программы: # 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()

Итак, чтобы прояснить ситуацию, проблема, которую я пытаюсь решить, заключается в том, что команда кнопки не работает должным образом.При первом нажатии любой кнопки она копирует '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)

Пример кнопки

1 Ответ

0 голосов
/ 11 ноября 2018

Вам не нужно использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...