2016-07-11 1 views
0

Я пытаюсь разработать графический интерфейс в wxPython, но мне нужна помощь. Вот что я хотел бы достичь. Приложение должно иметь 3 кадра, но улов в том, что за один раз должен быть видимым только один кадр. На каждом из этих кадров должны быть кнопки. Эти кнопки должны служить своего рода меню, и они должны (скрыть видимый в настоящее время кадр, а б) показать другой кадр. Я знаю, что общий подход состоит в том, чтобы просто использовать один кадр с несколькими панелями, но по какой-то причине этот подход не работает слишком хорошо для меня. Приложение должно быть полностью доступно пользователям экранного чтения, и кажется, что в некоторых случаях показывать и скрывать панели недостаточно. Я сам пользователь экрана, и мне кажется, что читатели экрана не всегда понимают, что содержимое рамки изменилось, если вы только показываете и скрываете панели. Я предполагаю, что отображение разных фреймов может решить проблему. Буду благодарен за небольшой рабочий пример. Я знаю некоторые вещи, которые я должен использовать, но, несмотря на это, я ничего не мог придумать. Большое спасибо.wxPython: Change Frame OnButtonPress

ответ

1

Вы можете просто скрыть рамку и показать другую. Пример:

import wx 

class Frame(wx.Frame): 

    def __init__(self, title): 
     wx.Frame.__init__(self, None, title=title, size=(350,200)) 

     btn = wx.Button(self, label="switch") 
     btn.Bind(wx.EVT_BUTTON, self._OnButtonClick) 

     self.Bind(wx.EVT_CLOSE, self.OnClose) 

    def _OnButtonClick(self, event): 
     self.frame.Show() 
     self.Hide() 

    def OnClose(self, event): 
     self.frame.Destroy() 
     self.Destroy() 


app = wx.App(redirect=True) 

f1 = Frame("Frame1") 
f2 = Frame("Frame2") 
f1.frame = f2 
f2.frame = f1 

f1.Show() 

app.MainLoop() 
+0

Большое спасибо. Это прекрасно работает, но есть одна незначительная вещь. Когда я запускаю скрипт и закрываю GUI, консоль остается открытой. Если мое понимание правильное, это потому, что скрытый кадр все еще существует (только он не отображается). Любой хороший способ закрыть скрытые кадры после закрытия видимого фрейма? Один скрипт, на котором я пришел, использовал здесь метод wx.Frame.SetTopWindow(). Это правильный метод для использования в этом сценарии, и если да, то где его добавить? –

+0

Вы можете сделать это в onclose event, см. [Этот ответ] (http://stackoverflow.com/a/10837130/4281182). Вы назовете destroy на обоих кадрах (self и self.frame) –

+0

Спасибо, что сделал. –