我如何在每次按下“刷新”时用新数据填充tkinter下拉框?

2024-10-03 15:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个刷新按钮,每次按下该按钮都会从数据库中获取最新数据。我可以看到终端的新数据,但下拉列表中无法显示数据

例如: 每次我按下“刷新”按钮时,终端上都会显示新数据“newadded”:

enter image description here

但“新增”数据无法显示在tkinter下拉列表中:enter image description here

我的代码:

def MainMenuForm():

    refresh_button = Button(root, text="refresh", command=ListboxContent)
    refresh_button.place(x=130, y=17, width=50, height=22)
    
      JsonPresetLBL = Label(jsonframe, text="JSON Preset:", font=("Calibri", 11, "bold"), fg="black")
      JsonPresetLBL.place(x=200, y=170)
      global options
      options = StringVar(jsonframe)
      options.set("Select ")  # default value
      om1 = OptionMenu(jsonframe, options, *jsonprofileName, command=get)
      om1.place(x=290, y=168, width=100)


def ListboxContent():
    # ==========jsonProfileName================
    cur = con.cursor()
    sqlName = ("select jsonid, jsonprofilename from json")
    # call jsonProfileName
    global jsonprofileName
    jsonprofileName = []
    try:
        cur.execute(sqlName)
        results = cur.fetchall()
        for a in results:
            global data
            data = (a[1])
            jsonprofileName.append(data)
            print(data)
    except:
        print("Error: unable to fetch data")


Tags: 数据text终端列表datadefplacebutton
1条回答
网友
1楼 · 发布于 2024-10-03 15:26:50

一种方法是销毁旧的,并将新的放在同一位置

如果您使用place,那么您可以简单地将新的一个放置在相同的坐标上,例如

from tkinter import *

def refresh():
    global optionmenu
    data=['new','data']
    optionmenu.destroy()
    option.set('')
    optionmenu=OptionMenu(root,option,*data)
    optionmenu.place(x=100,y=50)


root=Tk()

option=StringVar()
data=['hello','world']
optionmenu=OptionMenu(root,option,*data)
optionmenu.place(x=100,y=50)

button=Button(root,text='Refresh',command=refresh)
button.pack(padx=100,pady=100)

root.mainloop()

如果使用packgrid,则需要有一个容器Frame来保存该位置,例如

from tkinter import *

def refresh():
    global optionmenu
    data=['new','data']
    optionmenu.destroy()
    option.set('')
    optionmenu=OptionMenu(op_frame,option,*data)
    optionmenu.pack()


root=Tk()

option=StringVar()
data=['hello','world']

op_frame=Frame(root)
op_frame.pack()
optionmenu=OptionMenu(op_frame,option,*data)
optionmenu.pack()

button=Button(root,text='Refresh',command=refresh)
button.pack(padx=100,pady=10)

root.mainloop()

更新

您还可以通过访问OptionMenumenu,清除它并重写所有选项来完成

def refresh():
    global optionmenu
    data=['new','data']
    menu=optionmenu['menu']
    menu.delete(0,END)
    for d in data:
        menu.add_command(label=d,command=lambda val=d: option.set(val))

相关问题 更多 >