Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在tkinter中正确配置加载按钮,并正确显示字典中的值_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 在tkinter中正确配置加载按钮,并正确显示字典中的值

Python 在tkinter中正确配置加载按钮,并正确显示字典中的值,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我不熟悉编码。可能最多3周。我需要一些帮助来正确配置我的加载按钮。在我的程序中,我有一个输入框和按钮,可以自动生成输入框,然后用它为字典输入值。我想要我的加载按钮做的是创建适当数量的输入框,并为您填充输入框中的文本。到目前为止,它所做的只是在标签中填充字典,这是一种无用的操作 这是我的密码 from tkinter import * import tkinter from math import * from tkinter.filedialog import askopenfilename i

我不熟悉编码。可能最多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()
我需要帮助的另一件事是显示字典中的值,而不显示额外的措辞。我使用下面的代码,它显示了字典中的内容,只是看起来不太好

DND_label.configure(text = "Inventory: " + str(DND.values()))
示例字典,将其保存在文本文件中并浏览到它以加载它。文本文件的名称无关紧要

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

我正在使用tkinter作为gui。这只是一个帮助我学习的项目。非常感谢您对如何以及为什么进行深入解答。我相信有更简单的编码方法,但这对我来说是可以理解的。

忽略我在代码中看到的所有其他问题,下面是一个简单的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()
结果:

按下按钮前:

之后:

现在,这个例子是非常基本的,我们可以做更多的工作来管理格式化和重置帧以加载其他内容,但是这个例子是在您请求的manor中加载字典的非常基本的方法

更新:

要回答下面评论中的问题,我们可以通过更改
for
循环的操作,将值加载到标签上。在for循环中,我们检查字典中每个键/值对的键和键值,然后用这些信息做一些事情。我们所需要做的就是告诉标签的文本是该对的
部分

更改此项:

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)
结果:


如前所述,这只是一个简单的例子。在基本工作完成后,您可以担心格式化等问题。

我们需要的是。如果没有它,我们将猜测你试图完成的部分或大部分。那就是说你试过什么?你试过什么了吗?@Mike SMT代码工作正常,只是不是我想要的。老实说,我不确定从哪里开始或结束。如果需要,我可以在这里发布代码。大约只有100行。我想让它做的是从文件中加载数据,这是一个包含字典的文本文件,并使用输入框中已经填充的值创建输入框。命令函数通过输入数字来填充输入框,并生成字典和键。我知道您要做什么。我的评论是为了帮助您将问题表述为与我们对堆栈溢出的预期一致。我提供的链接将告诉您有关提供MCVE供我们测试和详细说明的所有信息。例如,您没有显示导入,并且没有要加载的此词典的示例。我们不知道什么样的数据或你的字典是如何格式化的。这是提供响应时的重要信息。我们需要复制您的代码,然后将其粘贴到我们的IDE并能够运行它。或者至少可以看到确切的错误。@Mike SMT好的,我将编辑我的问题以包含所需内容。我不知道该发什么。很多新来的人都知道该发什么。这就是我和其他人提供MCVE帖子链接的原因。谢谢迈克!我将使用它,看看我能用它做些什么。所以,你知道如何将字典中的值填充到标签中吗?是的。这只是将正确的数据从字典加载到标签的文本字段的问题。因此,以我的例子来说,你希望标签上写的是“30岁”还是“30岁”?如果我想标签上写的是30岁,我该如何编码?@hydro_boy我在我的答案中添加了一个更新,以在评论中提供关于你问题的示例。
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)