在Tkinter组合框小部件中使用列表

如何解决在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行上。例如:

enter image description here

当我print(loan_list)返回时:

[('Hyundai','Elantra','TEST123')] [('Hyundai','I30','ABC123')]

我的问题是如何使这些记录显示在combobox小部件的单独的行上。 这是参考我目标的图片。.忽略此示例中显示的月份,我想将这些月份替换为:

现代”,“伊兰特”,“ TEST123” 'Hyundai','I30','ABC123'

enter image description here

解决方法

使用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()

enter image description here

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-