如何解决在Tkinter组合框小部件中使用列表
我想使用combox小部件来显示通过查询访问数据库填充的车辆列表。 这里是相关代码
from O365 import *
import tkinter as tk
from tkinter import ttk
from tkcalendar import *
import pyodbc
root = tk.Tk()
root.title('Loan Car Manager')
root.geometry('800x1200')
style = ttk.Style(root)
load_loan_vehicle_list_button = tk.Button(root,command = get_active_loan_cars,text = "Load / Refresh")
load_loan_vehicle_list_button.place(x=50,y=50)
conn = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb,*.accdb)};UID=admin;UserCommitSync=Yes;Threads=3;SafeTransactions=0;PageTimeout=5;MaxScanRows=8;MaxBufferSize=2048;{FIL=MS Access};DriverId=25;DefaultDir=C:\Users\James\Documents;DBQ=C:\Users\James\Documents\Database1.accdb;')
cursor = conn.cursor()
def get_active_loan_cars():
global loan_list
cursor.execute("SELECT Loan_make,Loan_model,Loan_rego FROM Loan_vehicle_data WHERE is_active = True")
for row in cursor.fetchall():
loan_list = []
loan_list.append(row)
loan_car_drop_down = ttk.Combobox(root)
loan_car_drop_down.place(x=50,y=70)
loan_car_drop_down['values'] = loan_list
print(loan_list)
root.mainloop()
运行此命令时,它将按预期查询数据库并将车辆返回到列表loan_list
中。当我使用combobox
将列表插入到loan_car_drop_down['values'] = loan_list
中时,它将显示该列表但记录显示在1行上。例如:
当我print(loan_list)
返回时:
[('Hyundai','Elantra','TEST123')] [('Hyundai','I30','ABC123')]
我的问题是如何使这些记录显示在combobox
小部件的单独的行上。
这是参考我目标的图片。.忽略此示例中显示的月份,我想将这些月份替换为:
现代”,“伊兰特”,“ TEST123” 'Hyundai','I30','ABC123'
解决方法
使用extend
代替append
。
def get_active_loan_cars():
loan_list = []
cursor.execute("SELECT Loan_make,Loan_model,Loan_rego FROM Loan_vehicle_data WHERE is_active = True")
for row in cursor.fetchall():
loan_list.extend(row)
loan_car_drop_down = ttk.Combobox(root)
loan_car_drop_down.place(x=50,y=70)
loan_car_drop_down['values'] = loan_list
print(loan_list)
,
我将使用字典将记录加载到组合框上。
我将组合的索引与记录的主键耦合在一起,以将其加载到字典中。
在下面的完整示例中进行评论。
该示例加载一个记录集,当您选择一个项目时,我添加了一些项目和一个整数主键 从组合中说它是从字典中检索到的pk值。
在开头,它也位于使用pk选择的记录上。
希望您会发现它有用
#!/usr/bin/python3
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
class Main(ttk.Frame):
def __init__(self,parent):
super().__init__()
self.parent = parent
self.init_ui()
def init_ui(self):
self.pack(fill=tk.BOTH,expand=1)
f = ttk.Frame(padding = 8)
ttk.Label(f,text = "Combobox").pack()
self.cbCombo = ttk.Combobox(f,)
self.cbCombo.bind("<<ComboboxSelected>>",self.on_selected)
self.cbCombo.pack()
f.pack(fill=tk.BOTH,expand=1)
def on_open(self,):
self.set_combos()
self.on_set_combo()
def set_combos(self):
index = 0
self.dict_cars = {}
voices = []
#here your recordset,I've add some items and even a supposed primary key.....1,2,3,4,5
rs = [(1,'Hyundai','Elantra','TEST123'),(2,'I30','ABC123'),(3,'Azera',(4,'Sonata',(5,'I30 Fastback N','ABC123')]
#here we coupling self.dict_cars with the combo index...
for i in rs:
self.dict_cars[index] = i[0]
index += 1
record = "{0} {1}".format(i[1],i[2])
voices.append(record)
self.cbCombo["values"] = voices
def on_selected(self,evt=None):
#when you select an item on the combo it get the relative pk record from the dict
index = self.cbCombo.current()
pk = self.dict_cars[index]
msg = ("You have selected index {0} pk {1}".format(index,pk))
messagebox.showinfo(self.master.title(),msg,parent=self)
def on_set_combo(self):
#it'use to select,on open a specific record,in that case the 5
try:
key = next(key
for key,value
in self.dict_cars.items()
if value == 5)
self.cbCombo.current(key)
except:
pass
def on_close(self):
self.parent.on_exit()
class App(tk.Tk):
"""Start here"""
def __init__(self):
super().__init__()
self.protocol("WM_DELETE_WINDOW",self.on_exit)
self.set_title()
self.set_style()
frame = Main(self,)
frame.on_open()
frame.pack(fill=tk.BOTH,expand=1)
def set_style(self):
self.style = ttk.Style()
#('winnative','clam','alt','default','classic','vista','xpnative')
self.style.theme_use("clam")
def set_title(self):
s = "{0}".format('Simple App')
self.title(s)
def on_exit(self):
"""Close all"""
if messagebox.askokcancel("Simple App","Do you want to quit?",parent=self):
self.destroy()
if __name__ == '__main__':
app = App()
app.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。