2009-07-18 9 views
5

मेरे wxPython एप्लिकेशन में मैंने wx.ScrolledPanel बनाया है, जिसमें एक बड़ा wx.StaticBitmap है जिसे स्क्रॉल करने की आवश्यकता है।माउस व्हील और तीर कुंजियों के साथ 'wx.ScrolledPanel` के माध्यम से स्क्रॉलिंग

स्क्रॉल बार प्रदर्शित होते हैं और मैं उनके साथ स्क्रॉल कर सकते हैं, लेकिन मैं यह भी माउस पहिया और कीबोर्ड पर तीर कुंजियों के साथ स्क्रॉल करने के लिए सक्षम होने के लिए करना चाहते हैं। यह अच्छा होगा अगर "होम", "पेज अप", और वे अन्य कुंजियां भी अपेक्षित कार्य करती हैं।

मैं यह कैसे कर सकता हूं?

अद्यतन:

मैं इस समस्या को देखते हैं। स्क्रॉल किए गए पैनेल स्क्रॉल करने में सक्षम है, लेकिन केवल तभी जब यह फोकस में है। समस्या यह है कि, मैं फोकस के तहत कैसे हो सकता हूं? यहां तक ​​कि इस पर क्लिक करने से यह नहीं होता है। केवल अगर मैं इसके अंदर एक टेक्स्ट नियंत्रण डालता हूं तो मैं उस पर ध्यान केंद्रित कर सकता हूं और इस प्रकार पहिया के साथ स्क्रॉल कर सकता हूं। लेकिन मैं इसमें टेक्स्ट नियंत्रण नहीं रखना चाहता हूं। तो मैं इसे कैसे फोकस करूं?

अद्यतन 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

यहां एक उदाहरण है जो आपको चाहिए जो करना चाहिए, मुझे उम्मीद है। (संपादित: पीछे मुड़कर देखें तो यह does not 'काफी काम है, उदाहरण के लिए, जब दो स्क्रॉल पैनल रहे हैं ... मैं इसे यहाँ छोड़ देंगे हालांकि बहुत peole यह या जो कुछ भी downvote कर सकते हैं।) मूल रूप से मैं एक पैनल में सब कुछ डाल दिया फ्रेम के अंदर (आमतौर पर एक अच्छा विचार), और फिर इस मुख्य पैनल पर ध्यान केंद्रित करें।

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

लेकिन इसे कहां रखा जाए? मैं फोकस को किसी अन्य विजेट पर बदलना चाहता हूं, और फिर स्क्रॉल किए गए पैनेल पर फिर से लौटना चाहूंगा। –

+0

1. मेरी पहली टिप्पणी में प्रश्न देखें। 2. हां, मैंने SetupScrolling कहा है। 3. क्या मुझे वास्तव में घर की चीज के साथ पहिया को फिर से शुरू करने की ज़रूरत है? WxPython इसे लागू नहीं करता है? –

+0

कुछ अजीब है। उदाहरण के लिए wxPython डेमो में, जब माउस प्रत्येक पैनल पर होता है, तो वह पैनल पहिया के साथ स्क्रॉल करेगा। तो कुछ सवाल। यदि आप 'सेटफोकस' कहते हैं तो यह काम करता है? यदि आप सामान्य तरीके से स्क्रॉल करने का प्रयास करते हैं, तो स्क्रॉलबार पर क्लिक करके और आगे बढ़ते हुए, क्या यह चलता है? और यदि आप तुरंत स्क्रॉल व्हील का उपयोग करने के लिए करते हैं, तो क्या यह काम करता है? – tom10

3

समस्या पर खिड़की फ्रेम फोकस हो जाता है और बच्चे के पैनल फोकस नहीं मिल रहा है (पर लिनक्स यह ठीक काम कर रहा है) है। वर्कअराउंड फ्रेम फोकस इवेंट को पैनल पर फोकस सेट करने के लिए रीडायरेक्ट करना उतना सरल हो सकता है।

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, और सभी कुंजी + mousewheeel जैसे काम शुरू होगा

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

आपके पहले कोड नमूने के संबंध में, यह एक से अधिक स्क्रॉल किए गए पैनेल के लिए काम नहीं करेगा, है ना? अपने दूसरे कोड नमूने के बारे में, मुझे लगता है कि यह जाने का रास्ता है। (थोड़ा कम संवेदनशील होने के अलावा, मैं नहीं चाहता कि हर बार जब आप गलती से पैनल पर होवर करते हैं तो फोकस बदलना चाहिए।) मुझे लगता है कि मैं स्क्रॉल किए गए पैनेल को उपclass कर दूंगा और इसे यहां पोस्ट करूंगा। पैनल को स्क्रॉल करने के लिए –

+1

यह फोकस में होना चाहिए, लेकिन यदि आपको माउस चाल पर फ़ोकस पसंद नहीं है, तो आप क्लिक पर एक ही चीज़ कर सकते हैं –

संबंधित मुद्दे