Tkinter Frame добавляет себя в главное окно

1

У меня есть программа, которая должна создать новый виджет Toplevel, а затем добавить к нему фрейм. Оба класса верхнего уровня и рамки уже создаются отдельно, поэтому, когда они называются, мое окно автоматически заполняется. Но когда нажимается кнопка, появляется окно Toplevel, но кадр добавляет себя в главное окно, а не новый Toplevel

Код главного окна

class MainWindow (Tkinter.Tk):

def __init__(self,version):
    Tkinter.Tk.__init__(self)  # creates the main window
    self.title('Awana Control ' + version) # names the main window

    topframe = Tkinter.Frame(self)
    topframe.grid(column=0,row=0)

    openNewFamilyWindowButton = Tkinter.Button(topframe, text='Add a new family',command=partial(newWindow,'NewFamilyWindow'))
    openNewFamilyWindowButton.grid(row=0, column=0)

    #openEditStudentWindowButton = Tkinter.Button(topframe, text='edit current repository', command=partial(newWindow,'studentFinderWindow'))
    #openEditStudentWindowButton.grid(row=0, column=1)

    openTotalsWindowButton = Tkinter.Button(topframe, text='Total Shipping Orders', command=partial(newWindow,'totalsWindow'))
    openTotalsWindowButton.grid(row=0, column=1)

    openTotalsWindowButton = Tkinter.Button(topframe, text='Lists By Grade', command=partial(newWindow,'gradeList'))
    openTotalsWindowButton.grid(row=0, column=2)

    #bottomframe = Tkinter.Frame(self)
    #bottomframe.grid(column=0,row=1)

прямо здесь, когда он добавляет ученика класс окна поиска на главную окно. Этот класс отвечает за открытие новых окон верхнего уровня

    StudentFinderWindow().grid(column=0,row=1)


    self.mainloop()

здесь находится класс StudentFinderWindow

class StudentFinderWindow (Tkinter.Frame):

def __init__(self):
    Tkinter.Frame.__init__(self) # Create Window

    ##### window attributes
    #self.title('Edit Families') #sets window title

    ##### puts stuff into the window

    # text
    editStudentInfoLabel = Tkinter.Label(self,text='Select the family from the list below or search for one in the search box provided')
    editStudentInfoLabel.grid(row=0, column=0)

    # entry box
    self.searchRepositoryEntry = Tkinter.Entry(self)
    self.searchRepositoryEntry.grid(row=1, column=0)

    # list box
    self.searchResults = Tkinter.Listbox(self,selectmode='SINGLE')
    self.searchResults.grid(row=2, column=0)

    # create a vertical scrollbar to the right of the listbox
    #yscroll = Tkinter.Scrollbar(self, command=self.searchResults.yview, orient=Tkinter.VERTICAL)
    #yscroll.grid(row=0, column=1, sticky=Tkinter.N+Tkinter.S)
    #self.searchResults.configure(yscrollcommand=yscroll.set)
    # search results initial updater
    self.getStudentList()
    for student in self.studentList:
        self.searchResults.insert(Tkinter.END, student)

    ##### event handler 
    self.searchResults.bind('<Double-Button-1>',self.editStudentWindowInit )
    self.searchRepositoryEntry.bind('<KeyRelease>', self.updateSearch)

def updateSearch(self, event):
    parameters = self.searchRepositoryEntry.get()
    parameters = parameters.lower()
    length = len(parameters)
    self.searchResults.delete(0, Tkinter.END)
    for i in self.studentList:
        if i[0:length].lower() == parameters:
            self.searchResults.insert(Tkinter.END, i)


def getStudentList(self):
    global fileDirectory # gets the directory that all the files are in
    fileList = os.listdir(fileDirectory) # makes a list of files from the directory
    self.studentList = [] #  makes a new list
    for file in fileList: # for loop that adds each item from the file list to the student list
        if file[-3:] == 'txt':
            self.studentList.append(file[:-4])

Это функция, которая открывает новое окно, которое должно заполнить рамкой

def editStudentWindowInit(self,mevent):
    index = self.searchResults.curselection()
    student = self.searchResults.get(index)
    editStudentWindow = EditStudentWindow(student)

Вот открытый класс

class EditStudentWindow(Tkinter.Toplevel):
    def __init__(self,student):

        Tkinter.Toplevel.__init__(self)
        self.title('Edit Family Info')

        Tkinter.Button(self,text='Edit Info',command=partial(self.fillInfo,student)).grid(column=0,row=0)
        Tkinter.Button(self,text='Edit Orders',command=partial(self.fillOrder,student)).grid(column=1,row=0)

        self.fillInfo(student)

    def fillInfo(self,student):

        try:
            self.order.grid_forget()
        except:
            pass
        self.info = EditFamilyWindow(student)
        self.info.grid(column=0,row=1)

    def fillOrder(self,student):
        try:
            self.info.grid_forget()
        except:
            pass
        self.order = EditShippingWindow(student)
        self.order.grid(column=0,row=1)

и вот init класса фрейма

class EditFamilyWindow(Tkinter.Frame):

def __init__(self,student):

    Tkinter.Frame.__init__(self) 
Теги:
tkinter
frame

1 ответ

1
Лучший ответ

Суть в том, что ваш фрейм должен быть создан как потомок определенного верхнего уровня. Вы не можете переделать фрейм от одного toplevel к другому. Итак, для того, чтобы ваш код работал, вы должны сначала создать верхний слой, а затем создать свой фрейм и указать, какой он должен быть создан.

  • 0
    Но я создал верхний уровень в классе editstudentwindow. Затем я добавил кадры к этому верхнему уровню. Или, по крайней мере, я думал, что сделал
  • 0
    @ Брэндон: Вы говорите, что кадр показывает неправильный уровень. Это не может произойти случайно, ваш код помещает это туда. Это должно быть тривиально, чтобы отследить - поместите оператор печати в то место, где создан фрейм, и посмотрите, каково его окно верхнего уровня.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню