首页 > 解决方案 > 我正在尝试使用 tkinter 创建一个带有两个组合框的简单 GUI。但是第一个组合框选择的值被第二个组合框覆盖

问题描述

如果您运行此代码,您将看到它会生成一个带有两个下拉框和一个按钮的窗口。当您从第一个下拉框中选择一个值时,它会反映在第二个!这就是要解决的问题。

注意:要使此代码清晰运行,您需要创建一个表并向其中添加一些记录,至少两行两列。这样可以填充下拉框。

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import pandas as pd
import sqlite3
# Creating tkinter window
conn = sqlite3.connect('test.db')
print('Opened Database successfully');
tempAge = []
Salary = []
cursor = conn.execute('''Select * from Company''')
for row in cursor:
    tempAge.append(row[2])
    Salary.append(row[4])
data_dict = {'name': pd.Series(tempAge), 'age':pd.Series(Salary)}
dframe = pd.DataFrame(data_dict)
window = tk.Tk()
window.title('Combobox')
window.geometry('500x250')

# label text for title
ttk.Label(window, text="GFG Combobox Widget",
          background='green', foreground="white",
          font=("Times New Roman", 15)).grid(row=0, column=1)

# label
ttk.Label(window, text="Select the Age :",
          font=("Times New Roman", 10)).grid(column=0,
                                             row=5, padx=10, pady=25)

# Combobox creation
n = tk.StringVar()
agechoosen = ttk.Combobox(window, width=27, textvariable=n)
salchoosen = ttk.Combobox(window, width=27, textvariable=n)

agechoosen['values'] = (tempAge)
salchoosen['values'] = (Salary)
ageVar=''
salVar=''
def salComboSelect():
    if salchoosen.current()==-1:
        s=0
    else:
        salVar = salchoosen.get()
        messagebox.showinfo('Message',str(salVar))
def comboselect():
    if agechoosen.current()==-1 and salchoosen.current()==-1:
        s=0
    else:
        ageVar=agechoosen.get()
        salVar = salchoosen.get()
        tempStr = str(ageVar)+" & "+str(salVar)
        messagebox.showinfo('Message',str(tempStr))
        # print(monthchoosen.current(), monthchoosen.get())
button = ttk.Button(window, text='Submit', command=comboselect, width=20)
ttk.Label(window, text="Select the Age :",
          font=("Times New Roman", 10)).grid(column=0,
                                             row=5, padx=10, pady=25)

agechoosen.grid(column=1, row=5)
salchoosen.grid(column=1, row=6)
button.grid(column=1, row=7)
agechoosen.current()
window.mainloop()

我认为问题出在下面提到的几行中,但不确定。请帮忙。

agechoosen['values'] = (tempAge)
salchoosen['values'] = (Salary)

在此处输入图像描述

标签: pythontkinter

解决方案


根据上面评论中@acw1668 的建议。我添加了 n = tk.StringVar() 和 m = tk.StringVar() 并且它起作用了。这是最终的代码。

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import pandas as pd
import sqlite3
# Creating tkinter window
conn = sqlite3.connect('test.db')
print('Opened Database successfully');
tempAge = []
Salary = []
cursor = conn.execute('''Select * from Company''')
for row in cursor:
    tempAge.append(row[2])
    Salary.append(row[4])
data_dict = {'name': pd.Series(tempAge), 'age':pd.Series(Salary)}
dframe = pd.DataFrame(data_dict)
window = tk.Tk()
window.title('Combobox')
window.geometry('500x250')

# label text for title
ttk.Label(window, text="GFG Combobox Widget",
          background='green', foreground="white",
          font=("Times New Roman", 15)).grid(row=0, column=1)

# label
ttk.Label(window, text="Select the Age :",
          font=("Times New Roman", 10)).grid(column=0,
                                             row=5, padx=10, pady=25)

# Combobox creation
n = tk.StringVar()
m = tk.StringVar()
agechoosen = ttk.Combobox(window, width=27, textvariable=n)
salchoosen = ttk.Combobox(window, width=27, textvariable=m)
# print("dframe['name']", dframe['name'])
# agechoosen['values'] = (tempAge)
agechoosen['values'] = (tempAge)
salchoosen['values'] = (Salary)
ageVar=''
salVar=''
def salComboSelect():
    if salchoosen.current()==-1:
        s=0
    else:
        salVar = salchoosen.get()
        messagebox.showinfo('Message',str(salVar))
def comboselect():
    if agechoosen.current()==-1 and salchoosen.current()==-1:
        s=0
    else:
        ageVar=agechoosen.get()
        salVar = salchoosen.get()
        tempStr = str(ageVar)+" & "+str(salVar)
        messagebox.showinfo('Message',str(tempStr))
        # print(monthchoosen.current(), monthchoosen.get())
button = ttk.Button(window, text='Submit', command=comboselect, width=20)
ttk.Label(window, text="Select the Age :",
          font=("Times New Roman", 10)).grid(column=0,
                                             row=5, padx=10, pady=25)
# print(monthchoosen.selection_get())
# monthchoosen['values'] = (pd.Series(tempAge))
# Adding combobox drop down list
# monthchoosen['values'] = (' January',
#                           ' February',
#                           ' March',
#                           ' April',
#                           ' May',
#                           ' June',
#                           ' July',
#                           ' August',
#                           ' September',
#                           ' October',
#                           ' November',
#                           ' December')
agechoosen.grid(column=1, row=5)
salchoosen.grid(column=1, row=6)
button.grid(column=1, row=7)
agechoosen.current()
window.mainloop()

推荐阅读