2011-04-21 5 views
1

새로운 Toplevel 위젯을 생성하고 프레임을 추가하는 프로그램이 있습니다. 최상위 클래스와 프레임 클래스는 모두 별도로 만들어져 있으므로 내 윈도우라고 불릴 때 자동으로 채워집니다. 버튼을 클릭 할 때 최상위 레벨 창이 뜹니다하지만 프레임은Tkinter 프레임 자체 창에 자체 추가하기

클래스 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) 

이다.

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]) 

:이 클래스는 StudentFinderWindow 클래스

클래스 StudentFinderWindow (Tkinter.Frame) 새로운 최상위 창 여기

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


    self.mainloop() 

에 대한 책임을 여는입니다 이것은 ne를 여는 함수입니다. 가정되는 윈도우 프레임 자체를 채우기 위해 승

여기
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) 

를 개방되고 클래스 프레임 클래스 초기화하기이다

class EditFamilyWindow(Tkinter.Frame): 

def __init__(self,student): 

    Tkinter.Frame.__init__(self) 

답변

1

결론은 특정 최상위의 하위 항목으로 프레임을 만들어야한다는 것입니다. 하나의 최상위 프레임에서 다른 프레임으로 프레임을 다시 생성 할 수는 없습니다. 따라서 코드를 작동 시키려면 먼저 최상위를 작성한 다음 프레임을 작성하여 생성 할 최상위 레벨을 지정해야합니다.

+0

editstudentwindow 클래스에서 최상위 레벨을 작성했습니다. 그런 다음 거기에서 프레임을 그 최상위에 추가했습니다. 아니면 적어도 내가 한 것 같아 – Brandon

+0

@ 브랜 던 : 프레임이 틀린 최상위에 나타나 있다고 말합니다. 우연히 그런 일이 일어날 수는 없지만, 당신의 코드는 거기에 넣고 있습니다. 이것은 추적하기가 쉽다. 프레임이 생성 된 곳에 print 서술문을 놓고 최상위 윈도우가 무엇인지를 보라. –

+0

editstudentwindow 클래스는 최상위 레벨을 만들고 프레임을 만든 다음 .grid를 사용하여 최상위 레벨을 만들고 프레임을 주 윈도우에 표시합니다. – Brandon