首页 > 解决方案 > 如何从 ttk.Combobox 列表框中删除 {}?

问题描述

我是 Stack Exchange 的新手,所以如果我输入了这个问题,请多多包涵。

我正在使用 Python 3.7 和 tkinter 和 sqlite3 创建一个应用程序,该应用程序将有一个带有多个框架的窗口,可以在其中导航。我有输入字段,有人输入数据,sqlite3 将其存储在表中。然后将该数据添加到组合框中。当数据库条目是包含多个单词的字符串时,组合框会在项目周围显示 {}。

我的问题是:如何在没有 {} 的情况下将项目添加到组合框列表框?

下面是一个最小的例子。如果您在第 1 帧上输入一个多字串(例如“John Smith”),第 2 帧上的组合框将显示 {John Smith}。

# Imports
import sqlite3 as sql
import tkinter as tk
import tkinter.ttk as ttk

# Database setup
conn = sql.connect(r"C:\Users\cecke\Desktop\Table.db")
cur = conn.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS db_table([index] INTEGER PRIMARY KEY, [name] text)""")
conn.commit()


# Window
class Window(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self)
        self.frame = Frame1(self)
        self.frame.pack()
        self.geometry("300x300")

    def navigate(self, frame):
        self.frame.pack_forget()
        self.frame = frame(self)
        self.frame.pack()


# Frame 1
class Frame1(tk.Frame):
    def __init__(self, master=None, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        self.frame1_title = tk.Label(self, text="Frame 1").pack()
        self.frame1_entry = tk.Entry(self)
        self.frame1_entry.pack()
        self.frame1_button1 = tk.Button(self, text="Enter", command=self.db_enter).pack()
        self.frame1_button2 = tk.Button(self, text="Next Frame", command=self.frame2_show).pack()

    def db_enter(self):
        new_data = self.frame1_entry.get()
        cur.execute("""INSERT INTO db_table (name) VALUES (?)""", (new_data,))
        conn.commit()
        self.frame1_entry.delete(0, "end")

    def frame2_show(self):
        self.master.navigate(Frame2)


# Frame 2
class Frame2(tk.Frame):
    def __init__(self, master=None, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)
        cur.execute('''SELECT name FROM db_table''')
        frame2_combo_data = cur.fetchall()
        self.frame2_title = tk.Label(self, text="Frame 2").pack()
        self.frame2_combo = ttk.Combobox(self, value=frame2_combo_data).pack()
        self.frame2_button = tk.Button(self, text="Back", command=self.frame1_show).pack()

    def frame1_show(self):
        self.master.navigate(Frame1)


# Run
Start = Window()
Start.mainloop()

标签: python-3.xtkinter

解决方案


您正在将列表列表传递给需要字符串列表的 tkinter 函数。Tkinter 是一个围绕 tcl/tk 解释器的薄包装器。当一个 tkinter 函数被赋予它期望是一个字符串但实际上是一个列表的值时,内部 tcl/tk 解释器将使用它自己的列表到字符串算法将它转换为一个字符串。该算法添加花括号以保留内部类似列表的结构。

最简单的解决方案是让您的代码负责在将值传递给组合框之前将列表列表转换为字符串列表。


推荐阅读