变量值从字符串更改为实例

时间:2017-03-16 21:22:11

标签: python-2.7 user-interface types tkinter

我正在尝试整理我的第一个小程序,但我一直遇到一些困难。我正在使用来自SQLite DB的数据,但我将代码更改了一下,以便在没有DB本身的情况下可以使用它。 list_baseList_sold_at_base函数通常会从数据库中提取数据(来自Freelancer游戏的基础和商品信息,因此我可以列出哪些商品在哪个基础上销售)。

该计划应该做的是在“基地”基础上建立所有基地的清单。按下按钮并将其放在Combobox中。

Combobox中选择一个选项时,此选择应存储在变量v中,并在选择其他基础时更新。这有效。到目前为止,变量vstr类型。

Goods sold at base按钮调用一个函数,该函数使用v并使用它来检查de 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()

1 个答案:

答案 0 :(得分:0)

感谢您的投入。我通过尝试更多地使用.get()并取出基本上只调用另一个函数的1个函数来实现它。我剪掉了中间人(货物())。

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()