Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 动态创建combobox值时,它在python中未被选择_Python 2.7_Tkinter_Ttk - Fatal编程技术网

Python 2.7 动态创建combobox值时,它在python中未被选择

Python 2.7 动态创建combobox值时,它在python中未被选择,python-2.7,tkinter,ttk,Python 2.7,Tkinter,Ttk,我创建了一个Tkinter窗口窗体,根据用户选择,我动态地将combobox替换为删除现有的combobox。但问题是,当我这样做时,combobox中选择的值不会更新。它始终显示默认值。请参阅下面的代码 from Tkinter import * import ttk final=[] field_0=['1','0'] field_1=['1','2','23','45','6'] field_2=['2','5','7','8','9'] class header: def _

我创建了一个Tkinter窗口窗体,根据用户选择,我动态地将combobox替换为删除现有的combobox。但问题是,当我这样做时,combobox中选择的值不会更新。它始终显示默认值。请参阅下面的代码

from Tkinter import * 
import ttk
final=[]
field_0=['1','0']
field_1=['1','2','23','45','6']
field_2=['2','5','7','8','9']

class header:
    def __init__(self,root):
        self.parent=root
        self.row_number= 1
        self.value=0
        root.title("                                    Select fields                                     ")
        root.minsize(width=450, height=530)
        root.maxsize(width=450, height=550)
        frame=Frame(root,height=20,relief=FLAT)
        frame.grid(row=0,column=0,sticky=W)
        Label(frame,text="Enter value:").grid(row=0,column=0,padx=70,pady=5,sticky=W)
        entryValue=StringVar()
        port_e = Entry(root,width=5,textvariable=entryValue)
        port_e.delete(0,END)
        port_e.insert(0,'0')
        port_e.grid(row=0,column=0,padx=100,pady=5)
        self.value=self.value+1
        self.change_row=self.row_number
        self.combocreate(self.change_row,root,field_0)
        self.change_row=self.change_row+1
        self.combocreate(self.change_row,root,field_1)



    def  combocreate(self,row_number,msg_frame,field):
        comboBoxValue = []              # 'request'command  for sink only
        self.box_value=StringVar()
        self.combo=ttk.Combobox(root,textvariable=self.box_value,state='readonly')
        self.combo['values'] = tuple(field)
        self.combo.set(field[1])
        self.combo.grid(row = row_number, column = 1)
        self.combo.bind("<<ComboboxSelected>>",self.selected_field)
        final.append(self.combo)

    def selected_field(self,event):
       global cnt_sel
       print final[0].get()

       if(final[0].get()=='1'):
            self.control=Label(root,text="Choose one type").grid(row=self.change_row,column=0,padx=20,pady=5,sticky=W)
            self.combocreate(self.change_row,root,field_1)
            final[1]=final[2]    #replacing combobox dynamically based on selection
            del final[2]
       elif(final[0].get()=='0'):
            Label(root,text="Choose zerotype     ").grid(row=self.change_row,column=0,padx=20,pady=5,sticky=W)
            self.combocreate(self.change_row,root,field_2)
            final[1]=final[2]
            del final[2]
       else:
            pass

if __name__=="__main__":
    root=Tk()
    app=header(root)
    root.mainloop()

代码的问题是,每次调用combocreate时,它都会自动将Combobox绑定到self.selected\u字段,因此每当您更改类型Combobox的值时,都会调用self.selected\u字段,它会自动将类型重置为默认值。要解决此问题,您应该只绑定第一个组合框。这应该可以解决问题:

from Tkinter import * 
import ttk
final=[]
field_0=['1','0']
field_1=['1','2','23','45','6']
field_2=['2','5','7','8','9']

class header:
    def __init__(self,root):
        self.parent=root
        self.row_number= 1
        self.value=0
        root.title("                                    Select fields                                     ")
        root.minsize(width=450, height=530)
        root.maxsize(width=450, height=550)
        frame=Frame(root,height=20,relief=FLAT)
        frame.grid(row=0,column=0,sticky=W)
        Label(frame,text="Enter value:").grid(row=0,column=0,padx=70,pady=5,sticky=W)
        entryValue=StringVar()
        port_e = Entry(root,width=5,textvariable=entryValue)
        port_e.delete(0,END)
        port_e.insert(0,'0')
        port_e.grid(row=0,column=0,padx=100,pady=5)
        self.value=self.value+1
        self.change_row=self.row_number
        self.combocreate(self.change_row,root,field_0)
        self.change_row=self.change_row+1
        self.combocreate(self.change_row,root,field_1)



    def  combocreate(self,row_number,msg_frame,field):
        comboBoxValue = []              # 'request'command  for sink only
        self.box_value=StringVar()
        self.combo=ttk.Combobox(root,textvariable=self.box_value,state='readonly')
        self.combo['values'] = tuple(field)
        self.combo.set(field[1])
        self.combo.grid(row = row_number, column = 1)
        self.combo.bind("<<ComboboxSelected>>",self.selected_field)
        final.append(self.combo)

    def selected_field(self,event):
       global cnt_sel
       print final[0].get()

       if(final[0].get()=='1'):
            self.control=Label(root,text="Choose one type").grid(row=self.change_row,column=0,padx=20,pady=5,sticky=W)
            self.combocreate(self.change_row,root,field_1)
            final[1]=final[2]    #replacing combobox dynamically based on selection
            del final[2]
       elif(final[0].get()=='0'):
            Label(root,text="Choose zerotype     ").grid(row=self.change_row,column=0,padx=20,pady=5,sticky=W)
            self.combocreate(self.change_row,root,field_2)
            final[1]=final[2]
            del final[2]
       else:
            pass

if __name__=="__main__":
    root=Tk()
    app=header(root)
    root.mainloop()
替换

from Tkinter import * 
import ttk
final=[]
field_0=['1','0']
field_1=['1','2','23','45','6']
field_2=['2','5','7','8','9']

class header:
    def __init__(self,root):
        self.parent=root
        self.row_number= 1
        self.value=0
        root.title("                                    Select fields                                     ")
        root.minsize(width=450, height=530)
        root.maxsize(width=450, height=550)
        frame=Frame(root,height=20,relief=FLAT)
        frame.grid(row=0,column=0,sticky=W)
        Label(frame,text="Enter value:").grid(row=0,column=0,padx=70,pady=5,sticky=W)
        entryValue=StringVar()
        port_e = Entry(root,width=5,textvariable=entryValue)
        port_e.delete(0,END)
        port_e.insert(0,'0')
        port_e.grid(row=0,column=0,padx=100,pady=5)
        self.value=self.value+1
        self.change_row=self.row_number
        self.combocreate(self.change_row,root,field_0)
        self.change_row=self.change_row+1
        self.combocreate(self.change_row,root,field_1)



    def  combocreate(self,row_number,msg_frame,field):
        comboBoxValue = []              # 'request'command  for sink only
        self.box_value=StringVar()
        self.combo=ttk.Combobox(root,textvariable=self.box_value,state='readonly')
        self.combo['values'] = tuple(field)
        self.combo.set(field[1])
        self.combo.grid(row = row_number, column = 1)
        self.combo.bind("<<ComboboxSelected>>",self.selected_field)
        final.append(self.combo)

    def selected_field(self,event):
       global cnt_sel
       print final[0].get()

       if(final[0].get()=='1'):
            self.control=Label(root,text="Choose one type").grid(row=self.change_row,column=0,padx=20,pady=5,sticky=W)
            self.combocreate(self.change_row,root,field_1)
            final[1]=final[2]    #replacing combobox dynamically based on selection
            del final[2]
       elif(final[0].get()=='0'):
            Label(root,text="Choose zerotype     ").grid(row=self.change_row,column=0,padx=20,pady=5,sticky=W)
            self.combocreate(self.change_row,root,field_2)
            final[1]=final[2]
            del final[2]
       else:
            pass

if __name__=="__main__":
    root=Tk()
    app=header(root)
    root.mainloop()
self.change_row=self.row_number
self.combocreate(self.change_row,root,field_0)
self.change_row=self.change_row+1
self.combocreate(self.change_row,root,field_1)

from Tkinter import * 
import ttk
final=[]
field_0=['1','0']
field_1=['1','2','23','45','6']
field_2=['2','5','7','8','9']

class header:
    def __init__(self,root):
        self.parent=root
        self.row_number= 1
        self.value=0
        root.title("                                    Select fields                                     ")
        root.minsize(width=450, height=530)
        root.maxsize(width=450, height=550)
        frame=Frame(root,height=20,relief=FLAT)
        frame.grid(row=0,column=0,sticky=W)
        Label(frame,text="Enter value:").grid(row=0,column=0,padx=70,pady=5,sticky=W)
        entryValue=StringVar()
        port_e = Entry(root,width=5,textvariable=entryValue)
        port_e.delete(0,END)
        port_e.insert(0,'0')
        port_e.grid(row=0,column=0,padx=100,pady=5)
        self.value=self.value+1
        self.change_row=self.row_number
        self.combocreate(self.change_row,root,field_0)
        self.change_row=self.change_row+1
        self.combocreate(self.change_row,root,field_1)



    def  combocreate(self,row_number,msg_frame,field):
        comboBoxValue = []              # 'request'command  for sink only
        self.box_value=StringVar()
        self.combo=ttk.Combobox(root,textvariable=self.box_value,state='readonly')
        self.combo['values'] = tuple(field)
        self.combo.set(field[1])
        self.combo.grid(row = row_number, column = 1)
        self.combo.bind("<<ComboboxSelected>>",self.selected_field)
        final.append(self.combo)

    def selected_field(self,event):
       global cnt_sel
       print final[0].get()

       if(final[0].get()=='1'):
            self.control=Label(root,text="Choose one type").grid(row=self.change_row,column=0,padx=20,pady=5,sticky=W)
            self.combocreate(self.change_row,root,field_1)
            final[1]=final[2]    #replacing combobox dynamically based on selection
            del final[2]
       elif(final[0].get()=='0'):
            Label(root,text="Choose zerotype     ").grid(row=self.change_row,column=0,padx=20,pady=5,sticky=W)
            self.combocreate(self.change_row,root,field_2)
            final[1]=final[2]
            del final[2]
       else:
            pass

if __name__=="__main__":
    root=Tk()
    app=header(root)
    root.mainloop()

谢谢你的帮助。现在我可以访问值了。