2017-03-16 78 views
0

我正在嘗試將我的第一個小程序放在一起,但我一直有一些困難。我正在使用來自SQLite數據庫的數據,但是我稍微改變了一下代碼,所以沒有數據庫本身就可以使用。 list_baseList_sold_at_base函數通常會從數據庫中提取數據(Freelancer遊戲中的基礎和商品信息,因此我可以列出在什麼基礎上銷售的商品)。從字符串到實例的變量值更改

該程序應該做的是建立一個所有基地列表,當'基地'按鈕被按下,並把它放在Combobox

當從Combobox中選擇一個選項時,該選項應存儲在變量v中,並在選擇另一個基準時更新。這工作。變量v到目前爲止是str類型。

Goods sold at base按鈕調用一個函數,該函數需要v並使用它來檢查DB在此基地銷售的商品,並將其打印在列表中。

但是,現在變量v不再是字符串類型(它應該是函數能正常工作),而是instance。不知怎的,這得到了改變,但我無法弄清楚在哪裏和爲什麼。我發表了一些印刷報告,看看如何以及在哪裏,但他們並沒有真正展現出這一切。

from Tkinter import * 
import csv, sqlite3, sys 
from ttk import Combobox 

root = Tk() 

v = StringVar() 


def on_field_change(index, value, op): 
    print "combobox updated to ", boxBases.get() 
    v = boxBases.get() 
    print 'v is', v 
    print type(v) 

def List_bases(): 
    dropdownBases = [] 
    for i in ['base1', 'base2', 'base3', 'base4',]: 
     dropdownBases.append(i) 
    return dropdownBases 

def List_sold_at_base(selbase): 
    goodsSoldAtBase = [] 
    sb=selbase 
    print "selbase value (v) is", selbase 
    print "selbase type is ", type(selbase) 
    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) 
    print "goods sold at base list: ", goodsSoldAtBase 
    print " " 
    print v 
    print type(v) 

def base(): 
    dropdownBases = List_bases() 
    boxBases.config(values=dropdownBases) 
    print "bases!" 

def goods(): 
    List_sold_at_base(v) 
    print '==========' 

dropdownBases = [] 

v.trace('w',on_field_change) 
boxBases = Combobox(root, textvar=v, values=dropdownBases) 
boxBases.grid(row=4, column=3, sticky='w', padx=5, pady=5) 

baseButton=Button(root, text="bases", command=base) 
baseButton.grid(row=3, column=0, sticky='w', padx=5, pady=5) 

goodsButton = Button(root, text="Goods sold at base", command=goods) 
goodsButton.grid(row=3, column=2, sticky='w', padx=5, pady=5) 

root.mainloop() 
+0

的[Tkinter的IntVar返回代替值PY \ _VAR0]可能的複製(http://stackoverflow.com/questions/24768455/tkinter-intvar-returning-py-var0-instead-of-value) – nbro

+0

謝謝,我稍後再看看! – Bowerick

+0

我不明白你爲什麼要改變它爲字符串?你可以總是使用'v.get()'來獲取它的值,並使用'v.set(「new_value」)'來改變它的值。 – Lafexlos

回答

0

感謝您的意見。我通過嘗試使用.get()多一點,並取出一個基本上只是調用另一個函數的函數來實現它。我剪掉了中間人(貨物())。

from Tkinter import * 
import csv, sqlite3, sys 
from ttk import Combobox 

root = Tk() 

v = StringVar() 


def on_field_change(index, value, op): 
    v = boxBases.get() 
    print 'v is', v 


def List_bases(): 
    dropdownBases = [] 
    for i in ['base1', 'base2', 'base3', 'base4',]: 
     dropdownBases.append(i) 
    return dropdownBases 

def List_sold_at_base(): 
    goodsSoldAtBase = [] 
    sb=v.get() 
    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) 
    print "goods sold at base list: ", goodsSoldAtBase 

def base(): 
    dropdownBases = List_bases() 
    boxBases.config(values=dropdownBases) 
    print "bases!" 

dropdownBases = [] 

v.trace('w',on_field_change) 
boxBases = Combobox(root, textvar=v, values=dropdownBases) 
boxBases.grid(row=4, column=3, sticky='w', padx=5, pady=5) 

baseButton=Button(root, text="bases", command=base) 
baseButton.grid(row=3, column=0, sticky='w', padx=5, pady=5) 

goodsButton = Button(root, text="Goods sold at base", command=List_sold_at_base) 
goodsButton.grid(row=3, column=2, sticky='w', padx=5, pady=5) 
root.mainloop()