Python 在Tkinter中删除或刷新树视图
我正在编写一个小程序,它从SQLite数据库获取输入,并根据组合框中的选择在GUI中打印信息。基本上,它是来自游戏自由职业者的交易信息(哪些商品在特定的基地出售)。我让它工作,直到它打印出树状视图中的第一个选择。但是,当我想要打印下一个(不同的)选择时,它不会刷新,而是在第一个选择下创建一个新的Treeview。我试过几种方法,包括destroy(),但都没用。下面是我写的代码。我用一些固定数据编辑了一些内容,而不是从SQLite数据库中提取。 “基本”按钮填充组合框。 “按基本价格出售的商品”按钮接受组合框的选择并生成树视图Python 在Tkinter中删除或刷新树视图,python,user-interface,tkinter,treeview,Python,User Interface,Tkinter,Treeview,我正在编写一个小程序,它从SQLite数据库获取输入,并根据组合框中的选择在GUI中打印信息。基本上,它是来自游戏自由职业者的交易信息(哪些商品在特定的基地出售)。我让它工作,直到它打印出树状视图中的第一个选择。但是,当我想要打印下一个(不同的)选择时,它不会刷新,而是在第一个选择下创建一个新的Treeview。我试过几种方法,包括destroy(),但都没用。下面是我写的代码。我用一些固定数据编辑了一些内容,而不是从SQLite数据库中提取。 “基本”按钮填充组合框。 “按基本价格出售的商品”
from Tkinter import *
import csv, sqlite3, sys
from ttk import Combobox, Treeview
root = Tk()
root.minsize(width=500, height=300)
v = StringVar() # ========= v is a variable that stores the selection(s) from the combobox ============
dropdownBases = []
goodsSoldAtBase = []
tree_header = []
def on_field_change(index, value, op):
v = boxBases.get()
print 'v is', v
def List_bases():
data = ['base1', 'base2', 'base3', 'base4',]
for i in data:
dropdownBases.append(i)
boxBases.config(values=dropdownBases)
def List_sold_at_base():
destroy_widget()
sb=v.get()
print sb
dataFromDB = [['base1', 'Cobalt 275', 'Copper 180'],['base2', 'High Temp Alloy 280', 'Mining Machinery 130'],
['base3', 'H-Fuel 240', 'Oxygen 6', 'Water 18'], ['base4', 'Hydrocarbons 40', 'Polymers 107']]
for i in dataFromDB:
if i[0] == sb:
goodsSoldAtBase.append(i[1])
goodsSoldAtBase.append(i[2])
# --------------- print for control purpose-------------------
print i
print "\n", dataFromDB
print "\n", goodsSoldAtBase
tree_header = ["Commodity Name", "Price"]
#================== build the treeview and populate it =============================
container = Frame(printLabel)
container.pack(side= TOP, fill='both', expand=True)
# create a treeview with scrollbar
tree = Treeview(columns=tree_header, show="headings")
vsb = Scrollbar(orient="vertical", command=tree.yview)
tree.grid(column=0, row=0, sticky='nsew', in_=container)
vsb.grid(column=1, row=0, sticky='ns', in_=container)
container.grid_columnconfigure(0, weight=1)
container.grid_rowconfigure(0, weight=1)
for col in tree_header:
tree.heading(col, text=col.title())
for item in goodsSoldAtBase:
tree.insert('', 'end', values=item)
# adjust column's width if necessary to fit each value
def destroy_widget():
try:
container.destroy()
except:
pass
def selection(event):
v=boxBases.current()
def file_menu():
root.title("Freelancer trade helper")
menubar = Menu(root)
root.config(menu=menubar)
fileMenu = Menu(menubar)
fileMenu.add_command(label="Exit", command=quit)
menubar.add_cascade(label="File", menu=fileMenu)
# ================== Frames ===========================
leftFrame= Frame(root)
leftFrame.pack(side=LEFT, fill=BOTH)
rightFrame= Frame(root)
rightFrame.pack(side=RIGHT, fill=BOTH, expand=TRUE)
printLabel = Label(rightFrame, relief=SUNKEN)
printLabel .pack(side=BOTTOM, fill=BOTH, expand=TRUE)
# ================== Buttons ==========================
boxBases = Combobox(rightFrame, textvar=v, values=dropdownBases)
boxBases.bind('<<ComboboxSelected>>', selection)
boxBases.pack(side=TOP, anchor=NW, fill=X)
baseButton=Button(leftFrame, text="Bases", command=List_bases)
baseButton.pack(side=TOP, anchor=W, fill=X)
goodsButton = Button(leftFrame, text="Goods sold at base", command=List_sold_at_base)
goodsButton.pack(side=TOP)
file_menu()
root.mainloop()
从Tkinter导入*
导入csv、sqlite3、sys
从ttk导入组合框,Treeview
root=Tk()
root.minsize(宽度=500,高度=300)
v=StringVar()#==========v是一个变量,用于存储组合框中的选择============
dropdownBases=[]
goodsSoldAtBase=[]
树_头=[]
def on_字段_更改(索引、值、op):
v=boxbase.get()
打印“v是”,v
def List_bases():
数据=['base1'、'base2'、'base3'、'base4',]
对于数据中的i:
dropdownBases.append(i)
config(值=下拉列表)
def列表在_基地售出的_()
销毁小部件()
sb=v.get()
打印某人
dataFromDB=['base1'、'Cobal 275'、'Cuper 180']、['base2'、'High Temp Alloy 280'、'采矿机械130'],
[‘碱3’、‘氢燃料240’、‘氧6’、‘水18’、[‘碱4’、‘碳氢化合物40’、‘聚合物107’]]
对于dataFromDB中的i:
如果i[0]==sb:
追加(i[1])
追加(i[2])
#------打印用于控制目的-------------------
打印i
打印“\n”,dataFromDB
打印“\n”,goodsSoldAtBase
树_头=[“商品名称”,“价格”]
#===========================构建树视图并填充它=============================
容器=框架(打印标签)
container.pack(side=TOP,fill='both',expand=True)
#使用滚动条创建树视图
tree=Treeview(列=tree\u header,show=“headers”)
vsb=滚动条(orient=“vertical”,command=tree.yview)
grid(列=0,行=0,粘性=nsew',在容器中)
网格(列=1,行=0,粘性=ns',在容器中)
container.grid\u column配置(0,权重=1)
container.grid_rowconfigure(0,权重=1)
对于树_标题中的列:
tree.heading(col,text=col.title())
对于goodsSoldAtBase中的项目:
插入(“”,'end',value=item)
#如有必要,调整列的宽度以适应每个值
def destroy_widget():
尝试:
容器销毁()
除:
通过
def选择(事件):
v=boxbase.current()
def file_菜单():
root.title(“自由职业者贸易助手”)
菜单栏=菜单(根)
root.config(menu=menubar)
文件菜单=菜单(菜单栏)
fileMenu.add_命令(label=“Exit”,command=quit)
menubar.add_级联(label=“File”,menu=fileMenu)
#=========================帧===========================
leftFrame=帧(根)
leftFrame.pack(侧面=左侧,填充=两侧)
rightFrame=帧(根)
rightFrame.pack(side=RIGHT,fill=BOTH,expand=TRUE)
printLabel=标签(右框,浮雕=凹陷)
printLabel.pack(侧面=底部,填充=两侧,展开=真)
#=========================按钮==========================
BoxBase=Combobox(rightFrame,textvar=v,values=DropDownBase)
boxbase.bind(“”,选择)
箱底。包装(侧面=顶部,锚定=西北,填充=X)
baseButton=按钮(leftFrame,text=“Bases”,command=List\u base)
baseButton.pack(侧=顶部,锚=W,填充=X)
goodsButton=按钮(leftFrame,text=“基本售出商品”,command=基本售出商品列表)
goodsButton.pack(侧面=顶部)
文件菜单()
root.mainloop()
与其销毁并重新制作整个小部件,不如清除旧数据并将新数据放在同一个小部件中 那也行。我试图清理它,但没有找到一个好办法。我不确定我将如何替换它,因为现在它只是使一个新的Treeview bellow成为第一个。我想我需要去做或者忘记它,但是重新做会更好。你能给我指一下正确的方向吗?为此。很难提供更多的帮助,因为你没有提供一个完整的例子,我可以使用和测试。我很难弄明白这一点。上面的代码显示了我遇到的问题。如果按“基本”按钮并在组合框中进行选择,然后按“商品…”按钮,它将生成树视图。如果你再这样做,它只是使一个新的吼叫第一个,而不是取代它。如果我尝试删除()或忘记()框架“container”,它会在函数外部引用时出错。Try:/Except:函数开头的语句对我不起作用。感觉好像我错过了什么。。。。