Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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_User Interface_Tkinter_Treeview - Fatal编程技术网

Python 在Tkinter中删除或刷新树视图

Python 在Tkinter中删除或刷新树视图,python,user-interface,tkinter,treeview,Python,User Interface,Tkinter,Treeview,我正在编写一个小程序,它从SQLite数据库获取输入,并根据组合框中的选择在GUI中打印信息。基本上,它是来自游戏自由职业者的交易信息(哪些商品在特定的基地出售)。我让它工作,直到它打印出树状视图中的第一个选择。但是,当我想要打印下一个(不同的)选择时,它不会刷新,而是在第一个选择下创建一个新的Treeview。我试过几种方法,包括destroy(),但都没用。下面是我写的代码。我用一些固定数据编辑了一些内容,而不是从SQLite数据库中提取。 “基本”按钮填充组合框。 “按基本价格出售的商品”

我正在编写一个小程序,它从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:函数开头的语句对我不起作用。感觉好像我错过了什么。。。。