OptionMenu在第二个函数上更改传递Tkinter Python 2.7

时间:2016-03-28 16:17:58

标签: python tkinter optionmenu

我遇到的问题是,在单击“Enter”按钮之前,在OptionMenu顶部显示所选值的第一遍中,下面的功能正常工作:

First pass

然而,在第二次传递并且任何将来传递给该函数时,在按下“Enter”按钮之前,所选值不会显示在OptionMenu的顶部(尽管如果选择它将被使用):

Second etc. passes

代码是:

def load_create_list(self):

    self.app = Toplevel(self.parent)
    self.parent.withdraw()
    self.app.title("Rgs2")

    self.student = []
    self.student1=[]
    self.gs1=0
    self.ng1=0
    options = ["2", "3", "4", "5", "6", "7"]


    self.results=[]
    self.ngg=StringVar() #for the option menu widget the variable must be a stringVar not a normal string, int etc.

    self.ng = Label(self.app, text="Number of groups")
    self.ng.grid(row=2, column=0)
    self.ngg.set("3")
    self.ng1 = OptionMenu(self.app, self.ngg, *options)

    self.ng1.grid(row=2, column=1, ipadx=10)


    for i in range(0,len(self.x3)):
        self.L1 = Label(self.app,text="Student")
        self.L1.grid(row=i+4, column=0)
        self.en = Entry(self.app)
        self.en.insert(END, self.x3[i])
        self.en.grid(row=i+4, column=1)
        self.student.append(self.en)

    self.el = int(len(self.student)+1)

    for h in range(self.el,self.el+5):

        self.L2 = Label(self.app,text="Student")
        self.L2.grid(row=h+4, column=0)
        self.em = Entry(self.app)
        self.em.grid(row=h+4, column=1)
        self.student.append(self.em)

    button=Button(self.app,text="enter",command=lambda : self.hallo2()).grid(row=h+7,column=0)
    button=Button(self.app,text="Save List",command=lambda : self.save_list2()).grid(row=h+7,column=1)

我已尝试过所有内容,但无法理解可能导致此问题的原因。任何帮助都将很高兴。看起来非常奇怪的行为可能是导致问题的功能之外的东西吗?

完整代码是:

from Tkinter import *
from tkFileDialog import askopenfile


class main_menu:

    def __init__(self, parent):

        self.myParent = parent
        self.myContainer1 = Frame(parent)
        parent.title("Random Group Sorter")
        self.myContainer1.pack()

        self.button1 = Button(self.myContainer1, command = lambda : self.hope())               
        self.button1.configure(text="Create List", height = 1, width = 20, font=("Arial", 16))
        self.button1.pack(side=TOP)
        self.button1.focus_force()

        self.button3 = Button(self.myContainer1, command = lambda : self.hope1())
        self.button3.configure(text="Load List", height = 1, width = 20, font=("Arial", 16))
        self.button3.pack(side=TOP)     

        self.button2 = Button(self.myContainer1, command = lambda : exit(), )  
        self.button2.configure(text="Exit",height = 1, width = 20, font=("Arial", 16))
        self.button2.pack(side=TOP)

    def hope(self):
        self.myParent.destroy()
        create_list()

    def hope1(self):
        self.myParent.destroy()
        load_list()

class create_list():

    def __init__(self):


        parent = Tk()


        self.parent=parent
        self.student = []
        self.student1 =[] 
        self.student2 =[] 
        self.fake_student = []     
        self.results=[]
        self.ngg = StringVar()# for the option menu widget the variable must be a stringVar not a normal string, int etc.

        self.ng = Label(text="Number of groups")
        self.ng.grid(row=2, column=0)

        self.ng = OptionMenu(parent, self.ngg, "2", "3", "4", "5","6")
        self.ng.grid(row=2, column=1)

        for i in range(3,21):
            self.L1 = Label(text="Student")
            self.L1.grid(sticky=E)
            self.en = Entry(parent)

            self.en.grid(row=i, column=1)
            self.student.append(self.en)

        button=Button(parent,text="Enter",command=lambda : self.hallo()).grid(row=23,column=0)
        button=Button(parent,text="Save List",command=lambda : self.save_list()).grid(row=23,column=1)

        parent.mainloop()


    def hallo(self):

        self.gs1 = int(len(self.student))

        self.ng1 = int(self.ngg.get())# still need to use .get even though a stringvar

        for entry in self.student:
            self.student1.append(entry.get())
        self.student1 = filter(None, self.student1) 

        for i in self.student1:# this is added as there are duplicate entries in the student list if saved
            if i not in self.student2:
                self.student2.append(i)
        self.parent.destroy()

        lis_an(self.student2,self.ng1)

    def save_list(self):


        for entry in self.student:
            self.student1.append(entry.get())
        self.student1 = filter(None, self.student1) 

        import tkFileDialog
        root = Tk()
        root.withdraw()
        file_name = tkFileDialog.asksaveasfile(parent=root)
        root.destroy() 

        print >>file_name, "\n"
        print >>file_name, "\n".join(self.student1)

        file_name.close()


class load_list:
    def __init__(self):
        self.x = []
        self.x3 = []
        self.load_clean()
        self.root = Tk()


    def load_clean(self):#option to load an already created file, cleans unwanted info from the list

        import tkFileDialog
        root = Tk()
        root.withdraw()
        file_name = tkFileDialog.askopenfile(parent=root)
        root.destroy()

        self.x = file_name.readlines()
        file_name.close()
        x2 =self.x[:]
        for z in self.x:
            if z [0:6]== "Random" or z == '\n' or z[0:5] == "Group":
                x2.remove(z)     

        for c in range (0,len(x2)):
            v = x2[c].rstrip()# this strip spaces and \n from each list item and returns the cleaned up string
            self.x3.append(v)

        self.load_create_list()   

    def load_create_list(self):
        parent = Tk()

        self.parent=parent
        self.student = []
        self.student1=[]
        self.gs1=0
        self.ng1=0



        self.results=[]
        self.ngg = StringVar()# for the option menu widget the variable must be a stringVar not a normal string, int etc.

        self.ng = Label(text="Number of groups")
        self.ng.grid(row=2, column=0)

        self.ng = OptionMenu(parent, self.ngg, "2", "3", "4", "5", "6")
        self.ng.grid(row=2, column=1)



        for i in range(0,len(self.x3)):
            self.L1 = Label(text="Student")
            self.L1.grid(row=i+3, column=0)
            self.en = Entry(parent)
            self.en.insert(END, self.x3[i])
            self.en.grid(row=i+3, column=1)
            self.student.append(self.en)

        self.el = int(len(self.student)+1)

        for h in range(self.el,self.el+5):

            self.L2 = Label(text="Student")
            self.L2.grid(row=h+3, column=0)
            self.em = Entry(parent)
            self.em.grid(row=h+3, column=1)
            self.student.append(self.em)

        button=Button(parent,text="enter",command=lambda : self.hallo2()).grid(row=h+6,column=0)
        button=Button(parent,text="Save List",command=lambda : self.save_list2()).grid(row=h+6,column=1)
        parent.mainloop()   

    def hallo2(self):
        self.student2= []
        self.gs1 = int(len(self.student))
        self.ng1 = int(self.ngg.get())# still need to use .get even though a stringvar
        for entry in self.student:
            self.student1.append(entry.get())
        self.student1 = filter(None, self.student1) 
        for i in self.student1:# this is added as there are duplicate entries in the student list if saved
            if i not in self.student2:
                self.student2.append(i)
        self.parent.destroy()

        lis_an(self.student2,self.ng1)

    def save_list2(self):
        for entry in self.student:
            self.student1.append(entry.get())
        self.student1 = filter(None, self.student1) 

        import tkFileDialog
        root = Tk()
        root.withdraw()
        file_name = tkFileDialog.asksaveasfile(parent=root)
        root.destroy() 

        print >>file_name, "\n"
        print >>file_name, "\n".join(self.student1)

        file_name.close()




class lis_an:        
     def __init__(self,student1,ng1):
        self.student1 = student1
        self.ng1=ng1
        self.results = []
        self.randomList()

     def randomList(self): # this creates a random list of students on the course
        import random
        studentb = self.student1[:]# this is added as otherwise the student list is overwritten

        studentc = [] 
        for i in range(len(studentb)): 
            element = random.choice(studentb) 
            studentb.remove(element) 
            studentc.append(element) 
        self.student1 = studentc

        self.partition()

     def partition(self): # this creates sub list of the student list containing the groups of students

        increment = len(self.student1) / float(self.ng1)
        last = 0
        i = 1
        while last < len(self.student1):
            idx = int(round(increment * i))
            self.results.append(self.student1[last:idx])
            last = idx
            i += 1

        output(self.results, self.ng1)  

class output:
    def __init__(self, student, ng1):

        self.ng1 = ng1
        self.student = student
        self.parent = Tk()


        for item1 in range (0,len(self.student)):

            test1 = "Group " + str(item1+1)+ ":"
            v = Label(self.parent, text=test1, font=("Arial", 13))
            test = "\n".join(self.student[item1])

            w = Label(self.parent, text=test, justify = LEFT, font=("Arial", 12))
            v.pack(side="top", anchor="w")
            w.pack(side="top", anchor="w")

        button=Button(self.parent,text="Repeat",command=lambda : self.join_list()).pack(side="top", anchor="w")
        button=Button(self.parent,text="Main Menu",command=lambda : self.menu_link()).pack(side="top", anchor="w")

        mainloop()

    def join_list(self):#this function creates a new undivided version of student to feed back to lis_an
        self.parent.destroy()
        self.student = [j for i in self.student for j in i] 
        lis_an(self.student,self.ng1)

    def menu_link(self):#destroys the parent frame and returns back to main menu
        self.parent.destroy()
        main()

def main():
    parent = Tk()
    myapp = main_menu(parent)
    parent.mainloop()

main()

这个问题非常简单的解决方案。我没有在父窗口小部件中将self.ngg定义为StringVar,所以:

self.ngg = StringVar()

会导致错误,

self.ngg = StringVar(self.app)

解决问题。不太确定为什么会在第二次和后续使用函数时发生这种情况,而不是第一次使用。

0 个答案:

没有答案