Python 如何从toplevel中的组合框中获取用户选择的选项
我是Python和Tkinter的新手,当时正在尝试创建一个用于搜索和打印数据的接口。我创建了一个非常简单的Python 如何从toplevel中的组合框中获取用户选择的选项,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我是Python和Tkinter的新手,当时正在尝试创建一个用于搜索和打印数据的接口。我创建了一个非常简单的toplevel窗口,从用户选择的组合框中获取值。但是,我发现如果设置了comboxlist2.current(0),脚本将只打印列表中的第一项,或者它将不打印任何内容,无论在框中选择了哪一项。我创建了一个示例脚本来测试这一点。如果我单击“搜索和创建”,则返回值可以根据用户在comboxlist1中的选择进行更改,而无论用户在comboxlist2中选择了什么,返回值都将返回“1”。那么,
toplevel
窗口,从用户选择的组合框中获取值。但是,我发现如果设置了comboxlist2.current(0)
,脚本将只打印列表中的第一项,或者它将不打印任何内容,无论在框中选择了哪一项。我创建了一个示例脚本来测试这一点。如果我单击“搜索和创建”,则返回值可以根据用户在comboxlist1
中的选择进行更改,而无论用户在comboxlist2
中选择了什么,返回值都将返回“1”。那么,我想问一下,问题在哪里,如何解决
提前感谢潜在的建议或解决方案
import tkinter as tk
from tkinter import ttk
from tkinter import *
def root_print():
reg_in = comboxlist1.get()
print(reg_in) #print the value selected
def on_click():
tl = Toplevel()
comvalue2 = tk.StringVar()
comboxlist2 = ttk.Combobox(tl,textvariable=comvalue2)
comboxlist2["values"] = ("1","2","3")
comboxlist2.grid()
comboxlist2.current(0) #select the first one as default
#mm = comboxlist2.get()
#print(mm) #print directly
go(comboxlist2,tl)
tl.wait_window()
return
def go(comboxlist2,tl):
mm = comboxlist2.get()
Button(tl,text='go', command=lambda:test(mm)).grid()
def test(mm):
print(mm) #do the same thing for the comboxlist2
root = Tk()
root.title('search') #create an interface
root.geometry('+400+200') #size and position
Label(text='region ').grid(row=2,column=0)
comvalue1 = tk.StringVar()
comboxlist1=ttk.Combobox(root,textvariable=comvalue1)
comboxlist1["values"]=("all","africa","asia","australia","canada","europe","mexico","southamerica","usa")
comboxlist1.grid(row=2,column=1)
comboxlist1.current(0)
Button(text='search & create', command=root_print).grid(row=0,column=4)
Button(text='click', command=on_click).grid(row=1, column=4)
loop = mainloop()#go!
这是工作代码,应该能满足您的需要。我已经删除了导入和一些无用的代码段
import tkinter as tk
from tkinter import ttk
def root_print():
reg_in = comboxlist1.get()
print(reg_in)
def on_click():
tl = tk.Toplevel()
comvalue2 = tk.StringVar()
comboxlist2 = ttk.Combobox(tl,textvariable=comvalue2)
comboxlist2["values"] = ("1","2","3")
comboxlist2.grid()
comboxlist2.current(0) #select the first one as default
tk.Button(tl,text='go', command=lambda: test(comboxlist2.get())).grid()
tl.wait_window()
def test(mm):
print(mm)
root = tk.Tk()
root.title('search') #create an interface
root.geometry('+400+200') #size and position
tk.Label(text='region ').grid(row=2,column=0)
comvalue1 = tk.StringVar()
comboxlist1=ttk.Combobox(root,textvariable=comvalue1)
comboxlist1["values"]=("all","africa","asia","australia","canada","europe","mexico","southamerica","usa")
comboxlist1.grid(row=2,column=1)
comboxlist1.current(0)
tk.Button(text='search & create', command=root_print).grid(row=0,column=4)
tk.Button(text='click', command=on_click).grid(row=1, column=4)
root.mainloop()
这是工作代码,应该能满足您的需要。我已经删除了导入和一些无用的代码段
import tkinter as tk
from tkinter import ttk
def root_print():
reg_in = comboxlist1.get()
print(reg_in)
def on_click():
tl = tk.Toplevel()
comvalue2 = tk.StringVar()
comboxlist2 = ttk.Combobox(tl,textvariable=comvalue2)
comboxlist2["values"] = ("1","2","3")
comboxlist2.grid()
comboxlist2.current(0) #select the first one as default
tk.Button(tl,text='go', command=lambda: test(comboxlist2.get())).grid()
tl.wait_window()
def test(mm):
print(mm)
root = tk.Tk()
root.title('search') #create an interface
root.geometry('+400+200') #size and position
tk.Label(text='region ').grid(row=2,column=0)
comvalue1 = tk.StringVar()
comboxlist1=ttk.Combobox(root,textvariable=comvalue1)
comboxlist1["values"]=("all","africa","asia","australia","canada","europe","mexico","southamerica","usa")
comboxlist1.grid(row=2,column=1)
comboxlist1.current(0)
tk.Button(text='search & create', command=root_print).grid(row=0,column=4)
tk.Button(text='click', command=on_click).grid(row=1, column=4)
root.mainloop()
你需要一个全局变量或类你是说把comboxlist2作为全局变量?请您详细解释一下好吗?def中的任何更改都应该声明为全局变量,但建议使用calss解决方案。是的,我同意类会更好,但这里我只想知道我哪里做错了。我还试着在“点击”的内部打印“mm”,其值似乎不正确。。所以我认为这可能不是《宣言》的问题?抱歉,这可能是一个很新的问题。您需要一个全局变量或类您的意思是将comboxlist2作为全局变量?请您详细解释一下好吗?def中的任何更改都应该声明为全局变量,但建议使用calss解决方案。是的,我同意类会更好,但这里我只想知道我哪里做错了。我还试着在“点击”的内部打印“mm”,其值似乎不正确。。所以我认为这可能不是《宣言》的问题?对不起,这可能是一个很新的问题。