我有一个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()
1条答案
按热度按时间kr98yfug1#
解决:最主要的问题是不命名按钮就不能引用按钮,而且使用tkinter内置的name函数不允许引用。我必须为按钮创建一个类,使用tk.IntVar()来命名按钮。