【问题标题】:How to get rid of curly braces from expanded list如何从扩展列表中删除花括号
【发布时间】:2015-06-02 13:10:02
【问题描述】:

我是 Python 新手,请多多包涵。我正在尝试使用 SQLite 数据库中的行填充选项菜单。问题是当一个单元格包含一个空格时,该选项会在其周围出现 {}。这样做的正确方法是什么?

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

【问题讨论】:

  • tuple(clients) 的结果是什么?
  • @Ignacio Vazquez-Abrams 你的意思是没有星号?然后一切都在一条线上
  • 我不是要你使用它,我是要你打印出来
  • @Ignacio Vazquez-Abrams 一行中的不同项目,由空格分隔,但其中一个空格被双花括号包围。
  • 然后在你的数据库中修复它,因为这就是问题所在。

标签: python python-3.x tkinter


【解决方案1】:

该方法接受选项字符串,每个选项都作为位置参数分隔(参见 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

【讨论】:

    【解决方案2】:

    你可以使用正则表达式得到类似的结果。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-04-08
        • 1970-01-01
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多