2009-07-18 6 views
5

私のwxPythonアプリケーションでは、wx.StaticBitmapがスクロールする必要があるwx.ScrolledPanelを作成しました。マウスホイールと矢印キーで `wx.ScrolledPanel`をスクロール

スクロールバーが表示され、スクロールできますが、マウスホイールとキーボードの矢印キーを使用してスクロールすることもできます。 "ホーム"、 "ページアップ"、その他のキーも期待どおりに機能するといいでしょう。

どうすればよいですか?

UPDATE:

私はこの問題を参照してください。 ScrolledPanelはスクロールすることができますが、フォーカスが当たっている場合にのみスクロールできます。問題は、どのように私はフォーカスの下になることができますか?それをクリックしてもそれはしません。私はそれの中にテキストコントロールを置く場合のみ、私はそれに焦点を当てることができますので、ホイールでスクロールします。しかし、私はそれにテキストコントロールを持っているとは思わない。だから私はどのようにそれに焦点を当てるのですか?

UPDATE 2:

ここでは、この現象を示すサンプルコードです。コメントを外して、テキストコントロールがマウスホイールをどのように動作させるかを確認します。

import wx, wx.lib.scrolledpanel 

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     scrolled_panel = \ 
      wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1) 
     scrolled_panel.SetupScrolling() 

     text = "Ooga booga\n" * 50 
     static_text=wx.StaticText(scrolled_panel, -1, text) 
     sizer=wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(static_text, wx.EXPAND, 0) 

     # Uncomment the following 2 lines to see how adding 
     # a text control to the scrolled panel makes the 
     # mouse wheel work. 
     # 
     #text_control=wx.TextCtrl(scrolled_panel, -1) 
     #sizer.Add(text_control, wx.EXPAND, 0) 

     scrolled_panel.SetSizer(sizer) 

     self.Show() 

if __name__=="__main__": 
    app = wx.PySimpleApp() 
    my_frame=MyFrame(None, -1) 
    #import cProfile; cProfile.run("app.MainLoop()") 
    app.MainLoop() 

答えて

0

ここでは、必要なものを実行する必要がある例があります。 (編集:振り返ってみると、例えば2つのスクロールパネルがある場合など、これはうまくいきません... peoleがそれを下降させる可能性がありますが、ここに残しておきます)基本的には、 (通常は良いアイデアです)、このメインパネルにフォーカスを設定します。キーボード制御用

import wx 
import wx, wx.lib.scrolledpanel 

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 
     main_panel = wx.Panel(self, -1) 
     main_panel.SetBackgroundColour((150, 100, 100)) 
     self.main_panel = main_panel 

     scrolled_panel = \ 
      wx.lib.scrolledpanel.ScrolledPanel(parent=main_panel, id=-1) 
     scrolled_panel.SetupScrolling() 
     self.scrolled_panel = scrolled_panel 

     cpanel = wx.Panel(main_panel, -1) 
     cpanel.SetBackgroundColour((100, 150, 100)) 
     b = wx.Button(cpanel, -1, size=(40,40)) 
     self.Bind(wx.EVT_BUTTON, self.OnClick, b) 
     self.b = b 

     text = "Ooga booga\n" * 50 
     static_text=wx.StaticText(scrolled_panel, -1, text) 
     main_sizer=wx.BoxSizer(wx.VERTICAL) 
     main_sizer.Add(scrolled_panel, 1, wx.EXPAND) 
     main_sizer.Add(cpanel, 1, wx.EXPAND) 
     main_panel.SetSizer(main_sizer) 

     text_sizer=wx.BoxSizer(wx.VERTICAL) 
     text_sizer.Add(static_text, 1, wx.EXPAND) 
     scrolled_panel.SetSizer(text_sizer) 

     self.main_panel.SetFocus() 

     self.Show() 

    def OnClick(self, evt): 
     print "click" 


if __name__=="__main__": 
    class MyApp(wx.App): 

     def OnInit(self): 
      frame = MyFrame(None, -1) 
      frame.Show(True) 
      self.SetTopWindow(frame) 
      return True 
    app = MyApp(0) 
    app.MainLoop() 

、ホームキーからアクションを設定するように、私はあなたがこれらのイベントにバインドする必要があり、そのようなhomeキーのmypanel.Scroll(0,0)を使用して、適切に対応すると思う(とためevt.Skip()を呼び出すことを忘れないでくださいあなたが行動していないキーボードイベント)。 (編集:私はスクロールのためのデフォルトのキーバインディングがないと思います。スクロールしたパネル内にスクロールパネルがある場合、どうしたらいいでしょうか?)

+0

ただし、どこに挿入しますか?フォーカスを他のウィジェットに変更して、ScrolledPanelにもう一度戻ってみたいかもしれません。 –

+0

1.私の最初のコメントの質問を参照してください。 2.はい、私はSetupScrollingを呼び出しました。 3.私は本当にホームキーの事でホイールを再発明する必要がありますか? wxPythonはこれを実装していませんか? –

+0

何かが奇妙です。たとえば、wxPythonのデモでは、マウスを各パネル上に置くと、そのパネルがホイールとともにスクロールします。だから、いくつかの質問。 'SetFocus'を呼び出すと動作しますか?通常の方法でスクロールしようとすると、スクロールバーをクリックして移動すると移動しますか?スクロールホイールをすぐに使用すると、それは動作しますか? – tom10

3

ウィンドウに問題がありますフレームがフォーカスを取得し、子パネルがフォーカスを取得していません(ubuntu Linux上で正常に動作しています)。回避策は、フレームフォーカスイベントをリダイレクトしてフォーカスをパネルに設定するように簡単にすることができます。

import wx, wx.lib.scrolledpanel 

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = scrolled_panel = \ 
      wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1) 
     scrolled_panel.SetupScrolling() 

     text = "Ooga booga\n" * 50 
     static_text=wx.StaticText(scrolled_panel, -1, text) 
     sizer=wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(static_text, wx.EXPAND, 0) 

     scrolled_panel.SetSizer(sizer) 

     self.Show() 

     self.panel.SetFocus() 
     scrolled_panel.Bind(wx.EVT_SET_FOCUS, self.onFocus) 

    def onFocus(self, event): 
     self.panel.SetFocus() 

if __name__=="__main__": 
    app = wx.PySimpleApp() 
    my_frame=MyFrame(None, -1) 
    app.MainLoop() 

またはonmouseでパネルを移動し、フォーカスを合わせると、すべてのキー+マウスホイールが機能し始めます。

import wx, wx.lib.scrolledpanel 

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = scrolled_panel = \ 
      wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1) 
     scrolled_panel.SetupScrolling() 

     scrolled_panel.Bind(wx.EVT_MOTION, self.onMouseMove) 

     text = "Ooga booga\n" * 50 
     static_text=wx.StaticText(scrolled_panel, -1, text) 
     sizer=wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(static_text, wx.EXPAND, 0) 

     scrolled_panel.SetSizer(sizer) 

     self.Show() 

    def onMouseMove(self, event): 
     self.panel.SetFocus() 

if __name__=="__main__": 
    app = wx.PySimpleApp() 
    my_frame=MyFrame(None, -1) 
    app.MainLoop() 
+1

最初のコードサンプルに関しては、複数のScrolledPanelでは動作しませんね。 2番目のコードサンプルに関しては、これが行く方法だと思います。 (少し敏感であることを除いて、私はあなたが誤ってパネルの上にマウスを置くたびにフォーカスが変わることを望んでいません)。私はScrolledPanelをサブクラス化してここに投稿すると思います。パネルをスクロールするには –

+1

にフォーカスが合っている必要がありますが、マウスの移動にフォーカスがない場合は、クリックして同じことをすることができます –

関連する問題