使用另一个函数中的一个函数中定义的列表。 Python 2.7

时间:2013-12-20 04:33:52

标签: python sqlite python-2.7 tkinter

我遇到以下代码问题。现在我对编程很新,并且大部分代码都是从互联网上复制出来的,我调整它以便按照我想要的方式工作。所以,如果没有简单的方法来解决它,那没关系。也许你可以指出编程或python的一些主题,我应该阅读。

我试着解释一下。我已经定义了函数query(),它对sqlite数据库进行了一些更改。输入是一个列表。如果我单独使用它,该功能就可以正常工作。

现在我正在尝试使用一个接口,我可以在其中定义该列表中应该包含的内容,具体取决于选中的复选框。然后,当我按下按钮时,我想用该特定列表执行该功能。生成的复选框也很好,按钮也是如此。此外,当我选中或取消选中按钮时,它会更新列表,并在解释器中显示新的更新列表。

问题是,该按钮不起作用: 1.它不使用新的更新列表,而是使用空列表() 2.当我输入一个非空的预定义列表时,它会自动运行query(),而不需要我点击按钮。

我可能没有解释清楚,但我希望你能理解我的问题。

感谢您的帮助

`

def chkbox_checked():
    for ix, item in enumerate(cb):
        opt[ix]=(cb_v[ix].get())
    print opt

def query(opt):
    import sqlite3
    connection = sqlite3.connect("gather.sqlite")
    cursor1 = connection.cursor()

    cursor1.execute('Drop table IF EXISTS matches')
    cursor1.execute('CREATE TABLE matches(date TEXT, team1 TEXT, team2 TEXT, league TEXT)')
    cursor1.execute('DELETE FROM "main"."matches"')

    for i in range(0, len(opt)):
        a=opt[i]
        cursor1.execute('INSERT INTO matches (date, team1, team2, league) SELECT * FROM gather WHERE team1=? or team2=? or league=?', (a,a,a,))

    cursor1.execute('Drop table IF EXISTS matchessorted')
    cursor1.execute('CREATE TABLE matchessorted(date TEXT, team1 TEXT, team2 TEXT, league TEXT)')
    cursor1.execute('DELETE FROM "main"."matchessorted"')
    cursor1.execute('INSERT INTO matchessorted (date, team1, team2, league) SELECT * FROM matches ORDER BY date')

    connection.commit()





import Tkinter as tk
from Tkinter import *

opt = []

root = tk.Tk()
mylist = [
'name1',
'name2',
'name3'
]
cb = []
cb_v = []
for ix, text in enumerate(mylist):
    cb_v.append(tk.StringVar())
    off_value=0
    cb.append(tk.Checkbutton(root, text=text, onvalue=text,offvalue=off_value,
                             variable=cb_v[ix],
                             command=chkbox_checked))
    cb[ix].grid(row=ix, column=0, sticky='w')
    opt.append(off_value)
    cb[-1].deselect()


label = tk.Label(root, width=20)
label.grid(row=ix+1, column=0, sticky='w')


button1 = Button(root, text = "Calculate", command = query(opt))
button1.grid(column=1, row=0, sticky=W)


root.mainloop()

`

2 个答案:

答案 0 :(得分:0)

关于如何构造代码的几点:您需要编写一个根据您的选择填充列表的函数。它可以返回列表调用'options',当你想在查询中执行代码时,你可以调用构造选项列表的函数。查询函数将具有如下语句:

 options = get_options() #assuming the function that populates the options is called get_options

然后执行查询函数的代码。

答案 1 :(得分:0)

button1 = Button(root, text = "Calculate", command = query(opt))

在创建Button之前立即调用query(opt),并将该调用的结果(None)作为命令参数传递给Button构造函数。你真正想要的是一个函数,当被调用时,执行查询(opt)。像这样:

def calculate_clicked():
    query(opt)
button1 = Button(root, text = "Calculate", command = calculate_clicked)

或者这个:

button1 = Button(root, text = "Calculate", command = lambda : query(opt))