python 在for循环中创建,但不能引用数据

eaf3rand  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(121)

我有一个tkinter项目,最终目标是有一个窗口,其中json文件中的所有数据都显示为单独的对象(一个按钮或一个按钮旁边),然后可以单击这些对象来更改数据并将其保存回json文件,以及添加新级别的选项。
复杂的是,因为我将其设置为“未来证明”,所以我必须在循环中创建按钮,因此它们的名称不会被定义以供以后引用。(),在tkinter中传递它们,v.focus_get(),而且没有一个是正确的。有那么一秒钟我以为。网格()在同一行上可能会使我引用网格对象,虽然没有错,但改变它并没有解决这个问题。使用cget()给了我“.”作为我试图拉取的任何信息。
我没有结婚,我的格式,它可以是一个弹出窗口,通过文本框,我只是不想把所有的信息都放在一个列表框中,有人可能会搞砸json格式,我将简化json文件和下面的代码中的数据。

{
    "fabrication_cost": 17,
    "mark_up": 0.7,
    "stone_levels": {
        "granite1": {
            "Name": "Granite Level 1",
            "Colors": [
                "Azul Platino",
                "Blanco Tulum",
                "Caledonia",
                "Luna Pearl"
            ],
            "Price": 7.5
        },
        "granite2": {
            "Name": "Granite Level 2",
            "Colors": [
                "Fantasy Brown",
                "Gray Mist",
                "Santa Cecilia",
                "New Venetian Gold"
            ],
            "Price": 10
        },
        "granite3": {
            "Name": "Granite Level 3",
            "Colors": [
                "Nero Mist Honed",
                "Salinas White",
                "Steel Grey Polished",
                "Steel Grey Brushed"
            ],
            "Price": 12
        },
        "quartz1": {
            "Name": "Quartz Level 1",
            "Colors": [
                "Frost White",
                "Iced White",
                "Manhattan Gray",
                "Peppercorn White"
            ],
            "Price": 17
        },
        "quartz2": {
            "Name": "Quartz Level 2",
            "Colors": [
                "Carrara Grigio",
                "Carrara Mist",
                "Fossil Gray",
                "Midnight Majesty"
            ],
            "Price": 22.5
        },
        "quartz3": {
            "Name": "Quartz Level 3",
            "Colors": [
                "Babylon Gray",
                "Calacatta Classique",
                "Calacatta Vicenza",
                "Gray Lagoon"
            ],
            "Price": 25.5
        }
    },
    "edge_pricing": {
        "Roundover/Bevel": 8,
        "Half Bullnose": 10,
        "Full Bullnose": 15,
        "Ogee": 30,
        "Mitered": 50
    },
    "add_ons": {
        "trip_Charge": 250,
        "raw_Cutout": 50,
        "radii": 50,
        "arcs": 100,
        "splay": 100,
        "waterfall": 650,
        "farm_sink_cutout": 100,
        "undermount_Sink_Install": 100,
        "standard_18ga_Sink": 110,
        "upgrade_18ga_Sink": 240,
        "porcelain_Vanity_Sink": 45,
        "customer_Sink": 100
    }
}
import json
import tkinter as tk

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        #load data from json file
        with open("pricing_data.json","r") as pricing_data_json:
            pricing_data = json.load(pricing_data_json)
        self.stone_levels = pricing_data['stone_levels']

        #create main frame
        self.main_frame = tk.Frame()
        self.main_frame.grid(row=0,column=0)

        self.create_widgets()

    def create_widgets(self):
        r=0
        for granite_level in self.stone_levels:

            lvl_name = self.stone_levels[granite_level]['Name']
            
            lvl_colors = self.stone_levels[granite_level]['Colors']

            tk.Button(master=self.main_frame, text=lvl_name).grid(row=r, column=0, sticky='news')
            tk.Button(master=self.main_frame, text=lvl_colors).grid(row=r+1, column=0, sticky='news')
            tk.Button(master=self.main_frame,text='Add New Level').grid(row=r+2, column=0)
            r+=3

app= App()
app.mainloop()
kr98yfug

kr98yfug1#

解决:最主要的问题是不命名按钮就不能引用按钮,而且使用tkinter内置的name函数不允许引用。我必须为按钮创建一个类,使用tk.IntVar()来命名按钮。

import json
import tkinter as tk

#make buttons
class GregButton(tk.Button):
    def __init__(self, window, name="", *args, **kwargs):
        self.name = tk.IntVar()
        self.name.set(name)
        super(GregButton, self).__init__(
            window, *args, textvariable=self.name, command=self.button_do, **kwargs
        )

    def button_do(self):
        print("hello")
        # Top level window
        frame = tk.Tk()
        frame.title("TextBox Input")
        frame.geometry("400x200")
        # Function for getting Input
        # from textbox and printing it
        # at label widget

        def printInput():
            inp = inputtxt.get(1.0, "end-1c")
            lbl.config(text="Provided Input: " + inp)
            self.name.set(inp)

        # TextBox Creation
        inputtxt = tk.Text(frame, height=5, width=20)

        inputtxt.pack()

        # Button Creation
        printButton = tk.Button(frame, text="Print", command=printInput)
        printButton.pack()

        # Label Creation
        lbl = tk.Label(frame, text="")
        lbl.pack()
        frame.mainloop()

# load data from json file
with open("pricing_data.json", "r") as pricing_data_json:
    pricing_data = json.load(pricing_data_json)

#levels
stone_levels = pricing_data["stone_levels"]
#window no frame
window = tk.Tk()
#lsit of buttons for later?
btns = []
#make and add buttons to list
for granite_level in stone_levels:
    btns.append(GregButton(window, stone_levels[granite_level]["Name"]))
#pack buttons onto window
for btn in btns:
    btn.pack()
window.mainloop()

相关问题