2014-01-09 3 views
0

Я создаю простой контактный компилятор, который в настоящее время использует три модуля: один для класса person, который принимает информацию, один для класса newContact Frame, который позволяет пользователю отправлять информацию, и один для первой страницы Класс кадра, в котором перечислены имена контактов, и дает пользователям параметры для редактирования списка.Проблема закрытия рамки wxpython из другого модуля

Проблема, с которой я столкнулась, - это когда я вызываю основную функцию класса newContact внутри класса передней страницы, он не выходит из MainLoop. Несмотря на то, что я уничтожил окно newContact, и обе программы закрываются нормально, когда они не вызываются друг от друга. Вот соответствующий код:

import wx 
import person 

contacts = [] 
names = [] 

class newContact(wx.Frame): 

    def __init__(self, *args, **kwargs): 
     super(newContact, self).__init__(*args, **kwargs) 

     self.basicWindow() 
     self.Show() 

    def basicWindow(self): 

     panel = wx.Panel(self) 

     vertical = wx.BoxSizer(wx.VERTICAL) 


     heading = wx.StaticText(panel, label = 'Create New Contact') 
     vertical.Add(heading, flag = wx.LEFT | wx.TOP, border = 5) 

     nameBox = wx.BoxSizer(wx.HORIZONTAL) 
     nameText = wx.StaticText(panel, label = 'Name:') 
     nameBox.Add(nameText) 
     self.nameEntry = wx.TextCtrl(panel) 

     nameBox.Add(self.nameEntry, proportion = 1, flag = wx.LEFT, border = 50) 
     vertical.Add(nameBox, flag = wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, border = 10) 

     phoneBox = wx.BoxSizer(wx.HORIZONTAL) 
     phoneText = wx.StaticText(panel, label = 'Number:') 
     phoneBox.Add(phoneText) 
     self.phoneEntry = wx.TextCtrl(panel) 
     phoneBox.Add(self.phoneEntry, proportion = 1, flag = wx.LEFT, border = 38) 
     vertical.Add(phoneBox, flag = wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, border = 10) 

     mailBox = wx.BoxSizer(wx.HORIZONTAL) 
     mailText = wx.StaticText(panel, label = 'Email:') 
     mailBox.Add(mailText) 
     self.mailEntry = wx.TextCtrl(panel) 
     mailBox.Add(self.mailEntry, proportion = 1, flag = wx.LEFT, border = 53) 
     vertical.Add(mailBox, flag = wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, border = 10) 

     submit = wx.Button(panel, label = 'Submit', size = (70,30)) 
     vertical.Add(submit, flag = wx.ALIGN_RIGHT | wx.TOP | wx.RIGHT, border = 10) 

     self.Bind(wx.EVT_BUTTON, self.registerData) 

     panel.SetSizer(vertical) 


    def registerData(self, e): 
     name = self.nameEntry.GetValue() 
     name = name.title() 
     while True: 
      try: 
       number = int(self.phoneEntry.GetValue()) 
       break 
      except ValueError: 
       number = 'a' 
       break 
     email = self.mailEntry.GetValue() 

     contact = person.Person(name, number, email) 
     names.append(name) 
     contacts.append(contact) 

     print('hello') 

     self.quit() 

    def quit(self): 
     self.Destroy() 


def main(): 
    app = wx.App() 
    newContact(None, title = 'New Contact', size = (405, 200), style= wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX) 
    app.MainLoop() 

import wx 
import newContact 

class Front(wx.Frame): 

    def __init__(self, *args, **kwargs): 
     super(Front, self).__init__(*args, **kwargs) 

     self.interaction() 

    def interaction(self): 

     panel = wx.Panel(self) 

     wholeGrid = wx.BoxSizer(wx.VERTICAL) 

     mainBox = wx.BoxSizer(wx.HORIZONTAL) 

     title = wx.StaticText(panel, label = ' Contact List') 
     wholeGrid.Add(title, flag = wx.TOP | wx.LEFT, border = 10) 

     self.contactList = wx.ListBox(panel) 
     mainBox.Add(self.contactList, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 10) 

     buttonList = wx.BoxSizer(wx.VERTICAL) 
     new = wx.Button(panel, id = wx.ID_NEW, label = 'New', size = (100,30)) 
     buttonList.Add(new) 
     edit = wx.Button(panel, id = wx.ID_EDIT, label = 'Edit', size = (100,30)) 
     buttonList.Add(edit, flag = wx.TOP, border = 5) 
     delete = wx.Button(panel, id = wx.ID_DELETE, label = 'Delete', size = (100,30)) 
     buttonList.Add(delete, flag = wx.TOP, border = 5) 
     mainBox.Add(buttonList, flag = wx.ALIGN_RIGHT | wx.TOP | wx.RIGHT, border = 10) 

     wholeGrid.Add(mainBox, proportion = 1, flag = wx.EXPAND) 

     panel.SetSizer(wholeGrid) 

     self.Bind(wx.EVT_BUTTON, self.createNew, id = wx.ID_NEW) 


     menu = wx.MenuBar() 
     fileMenu = wx.Menu() 
     fileMenu.Append(wx.ID_EXIT, 'Exit') 
     menu.Append(fileMenu, 'File') 
     self.SetMenuBar(menu) 

     self.Show(True) 

    def createNew(self, e): 
     newContact.main() 



def main(): 
    app = wx.App() 
    Front(None, title = "Contacts", size = (405,600), style = wx.SYSTEM_MENU | wx.CLOSE_BOX | wx.CAPTION) 
    app.MainLoop() 

Спасибо за любую помощь, синтаксис кода комментарии также будут оценены.

+0

Полосатый до минимального кода, который может быть запущен, и представляет проблему, с которой вам легче будет реагировать. – Yoriz

ответ

0

Мне кажется, что вы просто закрываете рамку newContact, а не переднюю рамку верхнего уровня. Вы должны быть в состоянии сделать что-то подобное в вашей newContact вышли из метода:

import wx 

class newContact(wx.Frame): 

    def __init__(self, *args, **kwargs): 
     super(newContact, self).__init__(*args, **kwargs) 

     self.basicWindow() 
     self.Show() 

    def basicWindow(self): 

     panel = wx.Panel(self) 

     vertical = wx.BoxSizer(wx.VERTICAL) 


     heading = wx.StaticText(panel, label = 'Create New Contact') 
     vertical.Add(heading, flag = wx.LEFT | wx.TOP, border = 5) 

     nameBox = wx.BoxSizer(wx.HORIZONTAL) 
     nameText = wx.StaticText(panel, label = 'Name:') 
     nameBox.Add(nameText) 
     self.nameEntry = wx.TextCtrl(panel) 

     nameBox.Add(self.nameEntry, proportion = 1, flag = wx.LEFT, border = 50) 
     vertical.Add(nameBox, flag = wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, border = 10) 

     phoneBox = wx.BoxSizer(wx.HORIZONTAL) 
     phoneText = wx.StaticText(panel, label = 'Number:') 
     phoneBox.Add(phoneText) 
     self.phoneEntry = wx.TextCtrl(panel) 
     phoneBox.Add(self.phoneEntry, proportion = 1, flag = wx.LEFT, border = 38) 
     vertical.Add(phoneBox, flag = wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, border = 10) 

     mailBox = wx.BoxSizer(wx.HORIZONTAL) 
     mailText = wx.StaticText(panel, label = 'Email:') 
     mailBox.Add(mailText) 
     self.mailEntry = wx.TextCtrl(panel) 
     mailBox.Add(self.mailEntry, proportion = 1, flag = wx.LEFT, border = 53) 
     vertical.Add(mailBox, flag = wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, border = 10) 

     submit = wx.Button(panel, label = 'Submit', size = (70,30)) 
     vertical.Add(submit, flag = wx.ALIGN_RIGHT | wx.TOP | wx.RIGHT, border = 10) 

     self.Bind(wx.EVT_BUTTON, self.registerData) 

     panel.SetSizer(vertical) 


    def registerData(self, e): 
     #name = self.nameEntry.GetValue() 
     #name = name.title() 
     #while True: 
      #try: 
       #number = int(self.phoneEntry.GetValue()) 
       #break 
      #except ValueError: 
       #number = 'a' 
       #break 
     #email = self.mailEntry.GetValue() 

     #contact = person.Person(name, number, email) 
     #names.append(name) 
     #contacts.append(contact) 

     self.quit() 

    def quit(self): 
     parent = self.GetParent() 
     parent.Close() 


class Front(wx.Frame): 

    def __init__(self, *args, **kwargs): 
     super(Front, self).__init__(*args, **kwargs) 

     self.interaction() 

    def interaction(self): 

     panel = wx.Panel(self) 

     wholeGrid = wx.BoxSizer(wx.VERTICAL) 

     mainBox = wx.BoxSizer(wx.HORIZONTAL) 

     title = wx.StaticText(panel, label = ' Contact List') 
     wholeGrid.Add(title, flag = wx.TOP | wx.LEFT, border = 10) 

     self.contactList = wx.ListBox(panel) 
     mainBox.Add(self.contactList, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 10) 

     buttonList = wx.BoxSizer(wx.VERTICAL) 
     new = wx.Button(panel, id = wx.ID_NEW, label = 'New', size = (100,30)) 
     buttonList.Add(new) 
     edit = wx.Button(panel, id = wx.ID_EDIT, label = 'Edit', size = (100,30)) 
     buttonList.Add(edit, flag = wx.TOP, border = 5) 
     delete = wx.Button(panel, id = wx.ID_DELETE, label = 'Delete', size = (100,30)) 
     buttonList.Add(delete, flag = wx.TOP, border = 5) 
     mainBox.Add(buttonList, flag = wx.ALIGN_RIGHT | wx.TOP | wx.RIGHT, border = 10) 

     wholeGrid.Add(mainBox, proportion = 1, flag = wx.EXPAND) 

     panel.SetSizer(wholeGrid) 

     self.Bind(wx.EVT_BUTTON, self.createNew, id = wx.ID_NEW) 


     menu = wx.MenuBar() 
     fileMenu = wx.Menu() 
     fileMenu.Append(wx.ID_EXIT, 'Exit') 
     menu.Append(fileMenu, 'File') 
     self.SetMenuBar(menu) 

     self.Show(True) 

    def createNew(self, e): 
     other_frame = newContact(self) 


#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    app = wx.App() 
    Front(None, title = "Contacts", 
      size = (405,600), style = wx.SYSTEM_MENU | wx.CLOSE_BOX | wx.CAPTION) 
    app.MainLoop() 

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

+0

Это получило фрейм из его MainLoop, но оно отправило сообщение об ошибке (arg) в GetTopLevelParent. Что это за аргумент? – user3179277

+0

Да, я исправил свой ответ –

+0

Добавлена ​​функция уничтожения для выхода. Проблема была, как вы сказали, вызывая основной цикл внутри другого. Благодарю. – user3179277

Смежные вопросы