【问题标题】:Save and load files from Tkinter buttons从 Tkinter 按钮保存和加载文件
【发布时间】:2021-08-20 22:08:08
【问题描述】:

我想弄清楚如何保存设置,但我不知道如何保存。

我尝试保存刻度、复选框和选项菜单,并能够保存到文件中,然后在关闭程序后加载该文件以保存您的设置。

from tkinter import *


root = Tk()
root.title("config test")
root.geometry("500x500")

b4 =IntVar()
b5 =IntVar()
we =IntVar()


checkbutton1 = Checkbutton(root, text="test1", variable=b4, onvalue=35564533,offvalue=35456533).grid(row=0, column=0)
checkbutton2 = Checkbutton(root, text="test2", variable=b5, onvalue=35456533,offvalue=35564533).grid(row=0, column=1)

ma3r = StringVar(root)
ma3r.set("Normal")
r = OptionMenu(root, ma3r, "test1", "test2", "test3").grid(row=2,column=0)
Scal = Scale(root, from_=-100, to=100, orient=HORIZONTAL, variable=we).grid(row=1, column=0)

mar = StringVar(root)
mar.set("CFG1")
w = OptionMenu(root, mar, "CFG1", "CFG2", "CFG3").grid(row=3,column=0)


butto = Button(root, text="save CFG").grid(row=4,column=0)
butto = Button(root, text="load CFG").grid(row=5,column=0)

mainloop()

【问题讨论】:

  • 对于初学者,您需要在按钮中添加command= 参数以对它们进行任何操作。或者,也许您应该从“加载”某些内容的含义开始,因为似乎所有内容都是硬编码的,并且您可以硬编码一个“配置文件”开始,而不是需要从 GUI 保存任何内容......您想将数据加载到什么位置?
  • @OneCricketeer 我正在尝试从已保存的配置文件中加载,以便它可以将小部件设置为保存在配置文件中的内容。对不起,如果我没有正确回答你的问题,我还在学习。
  • 好的,所以如果您已经有一个文件,那么您需要open() 它,但您的代码中似乎缺少该文件。你试过了吗?
  • @OneCricketeer 不,先生,我还没有尝试过,但我正在尝试使用能够加载的设置保存配置。
  • 我明白这一点。我建议你一次只专注于一个问题。如果您从加载文件开始,那么您的保存会更容易,因为您已经知道文件内容需要采用什么格式

标签: python tkinter config


【解决方案1】:

借用example from online,您可以轻松地从中添加更新功能。

config.json

{"title":"config test"}

main.py

import tkinter as tk
from tkinter import ttk

import json

class App(tk.Tk):
    DEFAULT_TITLE = 'config test'

    def __init__(self):
        super().__init__()
        self.config = dict()
        with open('config.json') as f:
          self.config = json.load(f)
       
        self.title(self.config.get('title', DEFAULT_TITLE))
        self.geometry("300x80")

        self.name_var = tk.StringVar()

        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)

        self.create_widgets()

    def create_widgets(self):

        padding = {'padx': 5, 'pady': 5}
        # label
        ttk.Label(self, text='Name:').grid(column=0, row=0, **padding)

        # Entry
        name_entry = ttk.Entry(self, textvariable=self.name_var)
        name_entry.grid(column=1, row=0, **padding)
        name_entry.focus()

        # Button
        submit_button = ttk.Button(self, text='Submit', command=self.submit)
        submit_button.grid(column=2, row=0, **padding)

    def submit(self):
        """ Save the details into the config """
        self.config['title'] = self.name_var.get()
        with open('config.json', 'w') as f:
            json.dump(self.config, f)
        self.load()  # reload the GUI

    def load(self):
        self.title(self.config.get('title', DEFAULT_TITLE))

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

$ cat config.json
{"title": "Updated name"}

要更新一个 OptionMenu,你有一个列表,然后你“喷它”

# your options
options = ['1', '2', '3']
# the name to display and its value
v = tk.StringVar()
v.set(options[0])
# defining the widget
menu = tk.OptionMenu(root, v, *options)

... 
# setting new options to existing menu
new_options = ['4', '5', '6']
menu.set_menu(default=None, *new_options)

当您在菜单中选择某项时获取事件see this example

网站也有滑块和复选框示例...


一般来说,使用提交按钮来保存是最简单的,但如果你经常进行大量更改,最好让每个命令处理程序直接更新文件,而不是等待按钮单击

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多