我是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))
答案 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)