Правильно настроить кнопку загрузки в tkinter и правильно отображать значения из словаря - PullRequest
0 голосов
/ 25 мая 2018

Я новичок в кодировании.Вероятно, 3 недели кодирования максимум.Мне нужна помощь, чтобы правильно настроить кнопку загрузки.В моей программе у меня есть поле ввода и кнопка, которая автоматически генерирует поля ввода, с помощью которых вы затем вводите значения для словаря.Я хочу, чтобы моя кнопка загрузки создала нужное количество полей ввода и заполнила для вас текст в полях ввода.На данный момент все, что он делает, это заполняет словарь в ярлыке, который отчасти бесполезен.

Вот мой код.

from tkinter import *
import tkinter
from math import *
from tkinter.filedialog import askopenfilename
import json
import os

class App:
    def __init__(self,root):
        self.root = root
        self.entry = Entry(self.root)
        self.button = Button(self.root, text="Input number of items in bag", command=self.command)
        self.done = Button(self.root, text="Save File", command=self.save)
        self.load = Button(self.root, text="Load File", command=self.load_data)
        self.save = Button(self.root, text="Save List", command=self.dict)
        self.frame = Frame(self.root)
        self.browsebutton = Button(root, text="Browse", command=self.browsefunc)
        self.entry.pack(side=RIGHT)
        self.button.pack(side=RIGHT) 
        self.save.pack(side=LEFT)
        self.done.pack(side=BOTTOM)
        self.load.pack(side=BOTTOM)
        self.browsebutton.pack(side=BOTTOM)
        self.frame.pack()

        global pathlabel
        pathlabel= Label(self.root)
        pathlabel.pack(side=BOTTOM)

        Label(self.root, text="Enter calculation below:").pack()
        global entry
        entry = Entry(self.root)
        entry.bind("<Return>", self.evaluate)
        entry.pack()
        global res
        res = Label(self.root)
        res.pack()

        global lbl
        lbl = Label(self.root)
        lbl.pack(side=BOTTOM)

        global DND_label
        Label(self.root)
        DND_label = Label(self.root)
        DND_label.pack(side=TOP)


    def command(self):
        self.frame.destroy()
        self.frame = Frame(self.root)
        self.text = []

        for i in range(int(self.entry.get())):
            self.text.append(Entry(self.frame, text="Item " + str(i+1) + ': '))
            self.text[i].pack()
            self.frame.pack()
        lbl.config(text="Enter amount and item name.")


    def dict(self):
        global DND
        DND = {}
        for i in range(len(self.text)):
            DND.update({self.text[i].cget("text"): self.text[i].get()})
        for k, v in DND.items():
            print(v)
        DND_label.configure(text = "Inventory: " + str(DND.values()))

    def save(self):
        DND = {}
        for i in range(len(self.text)):
            DND.update({self.text[i].cget("text"): self.text[i].get()})
        try:
            with open(filename, 'w') as f:
                newpath = os.path.splitext(filename)[0] + "_NEW.txt"
                with open(newpath, 'w') as j:
                    json.dump(DND,j)
                    DND_label.configure(text = "Inventory: " + str(DND.values()))
            for k, v in DND.items():
                print(v)

        except FileNotFoundError:
            try:
                New_dir = os.mkdir(os.path.join(os.path.expanduser('~'), 'Documents', 'DND_player_inventories'))
                filepath = os.path.join(os.path.expanduser('~'), 'Documents', 'DND_player_inventories')
                file = 'DND_inventory.txt'
                newpath = os.path.join(filepath, file)
                with open(newpath, 'w') as j:
                    json.dump(DND,j)
                    DND_label.configure(text = "Inventory: " + str(DND.values()))
                for k, v in DND.items():
                    print(v)

            except FileExistsError:
                try:
                    filepath = os.path.join(os.path.expanduser('~'), 'Documents', 'DND_player_inventories')
                    file = 'DND_inventory.txt'
                    newpath = os.path.join(filepath, file)
                    with open(newpath, 'x') as j:
                        json.dump(DND,j)
                        DND_label.configure(text = "Inventory: " + str(DND.values()))
                    for k, v in DND.items():
                        print(v)

                except FileExistsError:
                    filepath = os.path.join(os.path.expanduser('~'), 'Documents', 'DND_player_inventories')
                    file = 'DND_inventory.txt'
                    file = os.path.join(filepath, file)
                    with open(file, 'r') as f:
                        newpath = os.path.join(filepath, file[0:-4]) + "_NEW.txt"
                        with open(newpath, 'w') as j:
                            json.dump(DND,j)
                            DND_label.configure(text = "Inventory: " + str(DND.values()))
                        for k, v in DND.items():
                            print(v)

        except NameError:
            try:
                New_dir = os.mkdir(os.path.join(os.path.expanduser('~'), 'Documents', 'DND_player_inventories'))
                filepath = os.path.join(os.path.expanduser('~'), 'Documents', 'DND_player_inventories')
                file = 'DND_inventory.txt'
                newpath = os.path.join(filepath, file)
                with open(newpath, 'w') as j:
                    json.dump(DND,j)
                    DND_label.configure(text = "Inventory: " + str(DND.values()))
                for k, v in DND.items():
                    print(v)

            except FileExistsError:
                try:
                    filepath = os.path.join(os.path.expanduser('~'), 'Documents', 'DND_player_inventories')
                    file = 'DND_inventory.txt'
                    newpath = os.path.join(filepath, file)
                    with open(newpath, 'x') as j:
                        json.dump(DND,j)
                        DND_label.configure(text = "Inventory: " + str(DND.values()))
                    for k, v in DND.items():
                        print(v)

                except FileExistsError:
                    filepath = os.path.join(os.path.expanduser('~'), 'Documents', 'DND_player_inventories')
                    file = 'DND_inventory.txt'
                    file = os.path.join(filepath, file)
                    with open(file, 'r') as f:
                        newpath = os.path.join(filepath, file[0:-4]) + "_NEW.txt"
                        with open(newpath, 'w') as j:
                            json.dump(DND,j)
                            DND_label.configure(text = "Inventory: " + str(DND.values()))
                    for k, v in DND.items():
                        print(v)

    def load_data(self):
        with open(filename, 'r') as f:
            try:
                DND = json.load(f)
            except ValueError:
                DND = {}
            for k, v in DND.items():
                DND_label.configure(text = "Inventory: " + str(DND.values()))
                print(v)

    @staticmethod
    def browsefunc():
        global filename
        filename = askopenfilename()
        pathlabel.config(text=filename)

    @staticmethod
    def evaluate(self):
        res.configure(text = "Answer: " + str(eval(entry.get())))



if __name__ == "__main__":
    global root
    root = Tk()
    root.title('DND Player inventories')
    App(root)
    root.mainloop()

Это то, что у меня есть для кнопки загрузки.

    def load_data(self):
        with open(filename, 'r') as f:
            try:
                DND = json.load(f)
            except ValueError:
                DND = {}
            for k, v in DND.items():
                DND_label.configure(text = "Inventory: " + str(DND.values()))
                print(v)

Другая вещь, с которой мне нужна помощь, - это отображение словаря.значения без лишних формулировок там.Я использую приведенный ниже код, который показывает, что находится в словаре, просто не очень хорошо выглядит.

DND_label.configure(text = "Inventory: " + str(DND.values()))

Пример словаря, сохраните его в текстовом файле и перейдите к нему для загрузки.Имя текстового файла не имеет значения.

{"Item 1: ": "test", "Item 2: ": "test 1", "Item 3: ": "test 3", "Item 4: ": "test 4"}

Я использую tkinter для графического интерфейса.Это просто проект, который поможет мне учиться.Глубоко ответы на вопросы, как и почему будет очень ценится.Я уверен, что есть более простые способы, чтобы закодировать это, но это понятно для меня, поскольку я изучаю.

1 Ответ

0 голосов
/ 25 мая 2018

Игнорируя все другие проблемы, которые я вижу в вашем коде, вот простой пример MCVE, как загрузить словарь из файла в вашу программу со значениями, помещаемыми в поле ввода.

Пожалуйста, используйте мой нижеприведенный пример при формулировании будущих вопросов, поскольку приведенный ниже пример показывает Минимальный, Полный и Проверяемый пример .Минимум, чтобы воспроизвести проблему или поведение, связанное с вашим вопросом.Как вы можете видеть, я не включаю такие вещи, как заголовок или различные другие функции или переменные, которые не связаны с конкретными вопросами.

В моем примере будут использоваться атрибуты пары классов для хранения словаря и списка используемыхдля создания различных полей.

Я использую список таким образом, потому что могу легко получить информацию об индексе и использовать ее для программного создания правильных меток и полей ввода в правильных строках и столбцах.

Создав этот список, мы также можем использовать его для хранения новых значений и сохранения их в файл, но это ответ на другой вопрос, если вы не можете его обработать.

Вот мой пример словаря:

{"Age":"30", "Name":"Mike", "Job":"Network Engineer"}

Вот мой код: имейте в виду, что вам потребуется использовать собственный путь к файлу словаря.

import tkinter as tk
import json


class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.button_frame = tk.Frame(self)
        self.button_frame.grid(row=0, column=0)
        self.data_frame = tk.Frame(self)
        self.data_frame.grid(row=0, column=2)
        self.loaded_dict = {}
        self.data_list = []

        tk.Button(self.button_frame, text="Load dictionary data",
                  command=self.load_dict).grid(row=0, column=0)

    def load_dict(self):
        self.loaded_dict = {}
        with open(".path/to/dict_file.txt", "r") as f:
            self.loaded_dict = json.load(f)
        if self.loaded_dict != {}:
            for key, value in self.loaded_dict.items():
                self.data_list.append([tk.Label(self.data_frame, text=key), tk.Entry(self.data_frame), value])
            for ndex, item in enumerate(self.data_list):
                item[0].grid(row=ndex, column=0)
                item[1].grid(row=ndex, column=1)
                item[1].insert(0, item[2])

if __name__ == "__main__":
    root = App()
    root.mainloop()

Результаты:

Перед нажатиемкнопка:

enter image description here

После:

enter image description here

Теперь этот примерочень простой иможно сделать гораздо больше для управления форматированием и сбросом фрейма, чтобы загрузить что-то еще, однако этот пример является очень простым способом загрузки словаря в запрошенном вами поместье.

Обновление:

Чтобы ответить на ваш вопрос в комментариях ниже, мы можем загрузить только значение в метку, изменив то, что мы делаем в цикле for.В цикле for мы проверяем ключ и значение ключа каждой пары ключ / значение в словаре, а затем что-то делаем с этой информацией.Все, что нам нужно сделать, это указать, чтобы текст вашего ярлыка был частью value этой пары.

Измените это:

for key, value in self.loaded_dict.items():
                    self.data_list.append([tk.Label(self.data_frame, text=key), tk.Entry(self.data_frame), value])
                for ndex, item in enumerate(self.data_list):
                    item[0].grid(row=ndex, column=0)
                    item[1].grid(row=ndex, column=1)
                    item[1].insert(0, item[2])

На это:

for key, value in self.loaded_dict.items():
                self.data_list.append([tk.Label(self.data_frame, text=value), tk.Entry(self.data_frame), value])
            for ndex, item in enumerate(self.data_list):
                item[0].grid(row=ndex, column=0)
                item[1].grid(row=ndex, column=1)

Результаты:

enter image description here

Как указано выше, это простой пример.Вы можете позаботиться о таких вещах, как форматирование, после того, как начнете работать с основами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...