如何摆脱扩展列表中的花括号

时间:2015-06-02 03:30:24

标签: python python-3.x tkinter

我是Python的新手,所以请耐心等待。我试图用SQLite数据库中的行填充一个optionmenu。问题是,当单元格包含空格时,该选项会在其周围显示{}。这样做的正确方法是什么?

from tkinter import *
import sqlite3

conn = sqlite3.connect('db_name.db')
c = conn.cursor()
c.execute('''SELECT client_name FROM clients
         ORDER BY client_name''')
clients = c.fetchall()

master = Tk()
variable = StringVar(master)
variable.set("Select Client")
client = OptionMenu(master, variable, *tuple(clients))

3 个答案:

答案 0 :(得分:2)

该方法接受选项的字符串,每个选项都作为位置参数分隔(参见effbot的this example)。

你实际上是在发送元组而不是字符串;因为fetchall()将为每一行返回一个元组,而元组中的元素表示结果集中的列。

由于您只在查询中选择一列,因此结果包含一个元组(仅包含一个元素的元组):

(('Client1',), ('Client2',), ('Client 3',))
#----------^ this is a single element tuple

您需要发送到方法:

client_list = OptionMenu(master, client, 'Client1', 'Client2', 'Client3')

您实际上是在发送:

client_list = OptionMenu(master, client, ('Client1',), ('Client2',), ('Client3',))

你的修复工作的原因是因为它折叠了元组,所以不是一元组元组,而是一个字符串元组:

>>> clients = (('Client1',), ('Client2',), ('Client 3',))
>>> sum(clients, ())
('Client1', 'Client2', 'Client 3')

您的修复没有任何问题,您也可以采用其他方式实现:

clients = [i[0] for i in c.fetchall()] # Now you have gotten rid of the
                                       # inner tuple

答案 1 :(得分:0)

您可以使用正则表达式来获得类似的结果。

import re
clients = [re.sub('[{}]', '',x) for x in c.fetchall()]

答案 2 :(得分:-1)

我不明白为什么,但这有效:

client_tuple = sum(clients, ())
client_list = OptionMenu(master, client, *client_tuple)